DEV: Simplify sprockets configuration (#24111)
- Remove the wildcard crawler. This was already excluding almost all file types, but the exclude list was missing '.gjs' which meant those files were unnecessarily being hoisted into the `public/` directory during precompile - Automatically include all ember-cli-generated assets without needing them to be listed. The main motivation for this change is to allow us to start using async imports via Embroider/Webpack. The filenames for those new async bundles will not be known in advance. - Skips sprockets fingerprinting on Embroider/Webpack chunk JS files. Their filenames already include a fingerprint, and having sprockets change the filenames will cause problems for the async import feature (where filenames are included deep inside js bundles) This commit also updates our ember-cli build so that it skips building plugin tests in the production environment. This should provide a slight build speed improvement.
This commit is contained in:
parent
00dc063d40
commit
c124c69833
|
@ -160,14 +160,18 @@ module.exports = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
generatePluginsTree() {
|
generatePluginsTree(withTests) {
|
||||||
if (!this.shouldLoadPlugins()) {
|
if (!this.shouldLoadPlugins()) {
|
||||||
return mergeTrees([]);
|
return mergeTrees([]);
|
||||||
}
|
}
|
||||||
const appTree = this._generatePluginAppTree();
|
const trees = [
|
||||||
const testTree = this._generatePluginTestTree();
|
this._generatePluginAppTree(),
|
||||||
const adminTree = this._generatePluginAdminTree();
|
this._generatePluginAdminTree(),
|
||||||
return mergeTrees([appTree, testTree, adminTree]);
|
];
|
||||||
|
if (withTests) {
|
||||||
|
trees.push(this._generatePluginTestTree());
|
||||||
|
}
|
||||||
|
return mergeTrees(trees);
|
||||||
},
|
},
|
||||||
|
|
||||||
_generatePluginAppTree() {
|
_generatePluginAppTree() {
|
||||||
|
|
|
@ -90,7 +90,7 @@ module.exports = function (defaults) {
|
||||||
|
|
||||||
const discoursePluginsTree = app.project
|
const discoursePluginsTree = app.project
|
||||||
.findAddonByName("discourse-plugins")
|
.findAddonByName("discourse-plugins")
|
||||||
.generatePluginsTree();
|
.generatePluginsTree(app.tests);
|
||||||
|
|
||||||
const adminTree = app.project.findAddonByName("admin").treeForAddonBundle();
|
const adminTree = app.project.findAddonByName("admin").treeForAddonBundle();
|
||||||
|
|
||||||
|
|
|
@ -24,37 +24,18 @@ Rails.application.config.assets.precompile += [
|
||||||
]
|
]
|
||||||
|
|
||||||
Rails.application.config.assets.precompile += %w[
|
Rails.application.config.assets.precompile += %w[
|
||||||
discourse.js
|
|
||||||
vendor.js
|
|
||||||
admin.js
|
|
||||||
wizard.js
|
|
||||||
test-support.js
|
|
||||||
tests.js
|
|
||||||
test-site-settings.js
|
|
||||||
browser-detect.js
|
|
||||||
browser-update.js
|
|
||||||
break_string.js
|
break_string.js
|
||||||
markdown-it-bundle.js
|
|
||||||
service-worker.js
|
service-worker.js
|
||||||
google-tag-manager.js
|
|
||||||
google-universal-analytics-v3.js
|
|
||||||
google-universal-analytics-v4.js
|
|
||||||
start-discourse.js
|
|
||||||
print-page.js
|
|
||||||
activate-account.js
|
|
||||||
auto-redirect.js
|
|
||||||
locales/i18n.js
|
locales/i18n.js
|
||||||
discourse/app/lib/webauthn.js
|
discourse/app/lib/webauthn.js
|
||||||
confirm-new-email/confirm-new-email.js
|
confirm-new-email/confirm-new-email.js
|
||||||
confirm-new-email/bootstrap.js
|
confirm-new-email/bootstrap.js
|
||||||
onpopstate-handler.js
|
|
||||||
embed-application.js
|
|
||||||
scripts/discourse-test-listen-boot
|
scripts/discourse-test-listen-boot
|
||||||
scripts/discourse-boot
|
|
||||||
workbox-*/*
|
|
||||||
]
|
]
|
||||||
|
|
||||||
Rails.application.config.assets.precompile += EmberCli.assets.map { |name| name.sub(".js", ".map") }
|
Rails.application.config.assets.precompile << lambda do |logical_path, filename|
|
||||||
|
filename.start_with?(EmberCli.dist_dir) && EmberCli.assets.include?(logical_path)
|
||||||
|
end
|
||||||
|
|
||||||
# Precompile all available locales
|
# Precompile all available locales
|
||||||
unless GlobalSetting.try(:omit_base_locales)
|
unless GlobalSetting.try(:omit_base_locales)
|
||||||
|
@ -75,16 +56,9 @@ Rails.application.config.assets.precompile.delete(Sprockets::Railtie::LOOSE_APP_
|
||||||
|
|
||||||
# We don't want application from node_modules, only from the root
|
# We don't want application from node_modules, only from the root
|
||||||
Rails.application.config.assets.precompile.delete(%r{(?:/|\\|\A)application\.(css|js)$})
|
Rails.application.config.assets.precompile.delete(%r{(?:/|\\|\A)application\.(css|js)$})
|
||||||
Rails.application.config.assets.precompile += ["application.js"]
|
|
||||||
|
|
||||||
start_path = ::Rails.root.join("app/assets").to_s
|
|
||||||
exclude = [".es6", ".hbs", ".hbr", ".js", ".css", ".lock", ".json", ".log", ".html", ""]
|
|
||||||
Rails.application.config.assets.precompile << lambda do |logical_path, filename|
|
|
||||||
filename.start_with?(start_path) && !filename.include?("/node_modules/") &&
|
|
||||||
!filename.include?("/dist/") && !filename.include?("/patches/") &&
|
|
||||||
!exclude.include?(File.extname(logical_path))
|
|
||||||
end
|
|
||||||
|
|
||||||
Discourse
|
Discourse
|
||||||
.find_plugin_js_assets(include_disabled: true)
|
.find_plugin_js_assets(include_disabled: true)
|
||||||
.each { |file| Rails.application.config.assets.precompile << "#{file}.js" }
|
.each do |file|
|
||||||
|
Rails.application.config.assets.precompile << "#{file}.js" if file.end_with?("_extra")
|
||||||
|
end
|
||||||
|
|
|
@ -6,36 +6,7 @@ module EmberCli
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.assets
|
def self.assets
|
||||||
@assets ||=
|
@@assets ||= Dir.glob("**/*.{js,map,txt}", base: "#{dist_dir}/assets")
|
||||||
begin
|
|
||||||
assets = %w[
|
|
||||||
discourse.js
|
|
||||||
admin.js
|
|
||||||
wizard.js
|
|
||||||
ember_jquery.js
|
|
||||||
markdown-it-bundle.js
|
|
||||||
start-discourse.js
|
|
||||||
vendor.js
|
|
||||||
]
|
|
||||||
assets +=
|
|
||||||
Dir.glob("app/assets/javascripts/discourse/scripts/*.js").map { |f| File.basename(f) }
|
|
||||||
|
|
||||||
if workbox_dir_name
|
|
||||||
assets +=
|
|
||||||
Dir
|
|
||||||
.glob("app/assets/javascripts/discourse/dist/assets/#{workbox_dir_name}/*")
|
|
||||||
.map { |f| "#{workbox_dir_name}/#{File.basename(f)}" }
|
|
||||||
end
|
|
||||||
|
|
||||||
Discourse
|
|
||||||
.find_plugin_js_assets(include_disabled: true)
|
|
||||||
.each do |file|
|
|
||||||
next if file.ends_with?("_extra") # these are still handled by sprockets
|
|
||||||
assets << "#{file}.js"
|
|
||||||
end
|
|
||||||
|
|
||||||
assets
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.script_chunks
|
def self.script_chunks
|
||||||
|
@ -107,4 +78,9 @@ module EmberCli
|
||||||
def self.has_tests?
|
def self.has_tests?
|
||||||
File.exist?("#{dist_dir}/tests/index.html")
|
File.exist?("#{dist_dir}/tests/index.html")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.clear_cache!
|
||||||
|
@@chunk_infos = nil
|
||||||
|
@@assets = nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,11 +50,14 @@ Sprockets::DirectiveProcessor.prepend(
|
||||||
end,
|
end,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Skip digest path for workbox assets. They are already in a folder with a digest in the name.
|
# Skip sprockets fingerprinting for some assets
|
||||||
Sprockets::Asset.prepend(
|
Sprockets::Asset.prepend(
|
||||||
Module.new do
|
Module.new do
|
||||||
def digest_path
|
def digest_path
|
||||||
return logical_path if logical_path.match?(%r{^workbox-.*/})
|
# Workbox assets are already in a folder with a digest in the name
|
||||||
|
return logical_path if logical_path.start_with?("workbox-")
|
||||||
|
# Webpack chunks are already named based on their contents
|
||||||
|
return logical_path if logical_path.start_with?("chunk.")
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
|
@ -34,6 +34,7 @@ task "assets:precompile:build" do
|
||||||
exec "#{compile_command} && SKIP_EMBER_CLI_COMPILE=1 bin/rake assets:precompile"
|
exec "#{compile_command} && SKIP_EMBER_CLI_COMPILE=1 bin/rake assets:precompile"
|
||||||
else
|
else
|
||||||
system compile_command, exception: true
|
system compile_command, exception: true
|
||||||
|
EmberCli.clear_cache!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -71,11 +72,6 @@ task "assets:precompile:before": %w[
|
||||||
|
|
||||||
require "sprockets"
|
require "sprockets"
|
||||||
require "digest/sha1"
|
require "digest/sha1"
|
||||||
|
|
||||||
# Add ember cli chunks
|
|
||||||
chunk_files = EmberCli.script_chunks.values.flatten.map { |name| "#{name}.js" }
|
|
||||||
map_files = chunk_files.map { |file| EmberCli.parse_source_map_path(file) }
|
|
||||||
Rails.configuration.assets.precompile.push(*chunk_files, *map_files)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
task "assets:precompile:css" => "environment" do
|
task "assets:precompile:css" => "environment" do
|
||||||
|
|
Loading…
Reference in New Issue