DEV: Update to Sprockets 4.0 (#16459)

The main difference is that Sprockets 4.0 no longer tries to compile everything by default. This is good for us, because we can remove all our custom 'exclusion' logic which was working around the old sprockets 3.0 behavior.

The other big change is that lambdas can no longer be added to the `config.assets.precompile` array. Instead, we can do the necessary globs ourselves, and add the desired files manually.

A small patch is required to make ember-rails compatible. Since we plan to remove this dependency in the near future, I do not intend to upstream this change.

I have compared the `bin/rake assets:precompile` output before and after this change, and verified that all files are present.
This commit is contained in:
David Taylor
2022-04-13 10:21:59 +01:00
committed by GitHub
parent 6fc52d95de
commit ec7efbde1a
5 changed files with 24 additions and 27 deletions

View File

@ -142,9 +142,9 @@ module Discourse
config.assets.skip_minification = []
# explicitly precompile any images in plugins ( /assets/images ) path
config.assets.precompile += [lambda do |filename, path|
path =~ /assets\/images/ && !%w(.js .css).include?(File.extname(filename))
end]
Dir.glob("#{config.root}/plugins/*/assets/images/**/*").each do |filename|
config.assets.precompile << filename if !%w(.js .css).include?(File.extname(filename))
end
config.assets.precompile += %w{
vendor.js
@ -193,25 +193,6 @@ module Discourse
end
end
# out of the box sprockets 3 grabs loose files that are hanging in assets,
# the exclusion list does not include hbs so you double compile all this stuff
initializer :fix_sprockets_loose_file_searcher, after: :set_default_precompile do |app|
app.config.assets.precompile.delete(Sprockets::Railtie::LOOSE_APP_ASSETS)
# We don't want application from node_modules, only from the root
app.config.assets.precompile.delete(/(?:\/|\\|\A)application\.(css|js)$/)
app.config.assets.precompile += ['application.js']
start_path = ::Rails.root.join("app/assets").to_s
exclude = ['.es6', '.hbs', '.hbr', '.js', '.css', '.lock', '.json', '.log', '.html', '']
app.config.assets.precompile << lambda do |logical_path, filename|
filename.start_with?(start_path) &&
!filename.include?("/node_modules/") &&
!filename.include?("/dist/") &&
!exclude.include?(File.extname(logical_path))
end
end
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
config.time_zone = 'UTC'
@ -290,6 +271,11 @@ module Discourse
Sprockets.register_mime_type 'application/javascript', extensions: ['.js', '.es6', '.js.es6'], charset: :unicode
Sprockets.register_postprocessor 'application/javascript', DiscourseJsProcessor
# This class doesn't exist in Sprockets 4, but ember-rails tries to 'autoload' it
# Define an empty class to prevent an error
class Sprockets::Engines
end
require 'discourse_redis'
require 'logster/redis_store'
# Use redis for our cache