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:
parent
91cc5fe465
commit
edff238a36
2 changed files with 47 additions and 27 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue