5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-23 00:06:21 +00:00

optimizar la lectura de datos desde jekyll

durante el proceso de compilación de jekyll se cargan todos los datos en
memoria, buscando e interpretando todos los archivos del sitio.  en el
caso de sutty, solo queremos leer alguna información por vez.

trabajando en el buscador me dí cuenta que aunque el panel cargue los
posts desde la base de datos, sutty seguía leyendo la información
completa del sitio, porque respetaba el proceso de lectura de jekyll.

con este cambio podemos leer los _data/ por separado de los _posts/ con
lo que la carga del sitio es mucho más rápida.
This commit is contained in:
f 2021-05-07 19:02:15 -03:00
parent 91cc5fe465
commit edff238a36
2 changed files with 47 additions and 27 deletions

View file

@ -175,30 +175,17 @@ class Site < ApplicationRecord
end end
alias default_lang default_locale alias default_lang default_locale
def read?
@read ||= false
end
# Lee el sitio y todos los artículos
def read
# No hacer nada si ya se leyó antes
return if read?
@jekyll.read
@read = true
end
# Trae los datos del directorio _data dentro del sitio # Trae los datos del directorio _data dentro del sitio
#
# XXX: Leer directamente sin pasar por Jekyll
def data def data
read unless @jekyll.data.present?
@jekyll.reader.read_data
# Define los valores por defecto según la llave buscada # Define los valores por defecto según la llave buscada
@jekyll.data.default_proc = proc do |data, key| @jekyll.data.default_proc = proc do |data, key|
data[key] = case key data[key] = case key
when 'layout' then {} when 'layout' then {}
end end
end
end end
@jekyll.data @jekyll.data
@ -207,7 +194,10 @@ class Site < ApplicationRecord
# Traer las colecciones. Todos los artículos van a estar dentro de # Traer las colecciones. Todos los artículos van a estar dentro de
# colecciones. # colecciones.
def collections def collections
read unless @read
@jekyll.reader.read_collections
@read = true
end
@jekyll.collections @jekyll.collections
end end
@ -221,8 +211,6 @@ class Site < ApplicationRecord
# #
# @param lang: [String|Symbol] traer los artículos de este idioma # @param lang: [String|Symbol] traer los artículos de este idioma
def posts(lang: nil) def posts(lang: nil)
read
# Traemos los posts del idioma actual por defecto o el que haya # Traemos los posts del idioma actual por defecto o el que haya
lang ||= locales.include?(I18n.locale) ? I18n.locale : default_locale lang ||= locales.include?(I18n.locale) ? I18n.locale : default_locale
lang = lang.to_sym lang = lang.to_sym

View file

@ -32,31 +32,52 @@ module ActionDispatch
end end
# Lazy Loading de Jekyll, deshabilitando la instanciación de elementos # Lazy Loading de Jekyll, deshabilitando la instanciación de elementos
# que no necesitamos # que no necesitamos. Esto permite que podamos leer el sitio por partes
# en lugar de todo junto.
# #
# TODO: Aplicar monkey patches en otro lado... # TODO: Aplicar monkey patches en otro lado...
module Jekyll module Jekyll
Reader.class_eval do Reader.class_eval do
# No necesitamos otros posts
def retrieve_posts(_); end def retrieve_posts(_); end
# No necesitamos otros directorios
def retrieve_dirs(_, _, _); end def retrieve_dirs(_, _, _); end
# No necesitamos las páginas
def retrieve_pages(_, _); end def retrieve_pages(_, _); end
# No necesitamos los archivos estáticos
def retrieve_static_files(_, _); end def retrieve_static_files(_, _); end
# Solo lee los datos
def read_data
@site.data = DataReader.new(site).read(site.config["data_dir"])
end
# Lee todos los artículos del sitio
def read_collections
read_directories
read_included_excludes
sort_files!
CollectionReader.new(site).read
end
end end
# No necesitamos los archivos de la plantilla
ThemeAssetsReader.class_eval do ThemeAssetsReader.class_eval do
def read; end def read; end
end end
# Prevenir la lectura del documento # Aplazar la lectura del documento
Document.class_eval do Document.class_eval do
alias_method :read!, :read alias_method :read!, :read
def read; end def read; end
end end
# https://github.com/jekyll/jekyll/pull/8425 # Prevenir la instanciación de Time
#
# @see {https://github.com/jekyll/jekyll/pull/8425}
Utils.class_eval do Utils.class_eval do
def parse_date(input, msg = 'Input could not be parsed.') def parse_date(input, msg = 'Input could not be parsed.')
@parse_date_cache ||= {} @parse_date_cache ||= {}
@ -66,3 +87,14 @@ module Jekyll
end end
end end
end end
# JekyllData::Reader del plugin jekyll-data modifica Jekyll::Site#reader
# para también leer los datos que vienen en el theme.
module JekyllData
Reader.class_eval do
def read_data
super
read_theme_data
end
end
end