mirror of
https://github.com/discourse/discourse.git
synced 2025-06-06 13:06:56 +08:00
PERF: Skip compressing locales for faster rebuilds (#7501)
* Do not brotli all locales in precompile * Try without gzip * uglify without compressing, always gzip * skip uglify for unused locales * FIX: Uglifier needs harmony for ES6 compatibility * Use node uglifier if available * Minor refactor
This commit is contained in:
@ -12,7 +12,8 @@ Discourse::Application.configure do
|
|||||||
# Disable Rails's static asset server (Apache or nginx will already do this)
|
# Disable Rails's static asset server (Apache or nginx will already do this)
|
||||||
config.public_file_server.enabled = GlobalSetting.serve_static_assets || false
|
config.public_file_server.enabled = GlobalSetting.serve_static_assets || false
|
||||||
|
|
||||||
config.assets.js_compressor = :uglifier
|
require 'uglifier'
|
||||||
|
config.assets.js_compressor = Uglifier.new(harmony: true)
|
||||||
|
|
||||||
# stuff should be pre-compiled
|
# stuff should be pre-compiled
|
||||||
config.assets.compile = false
|
config.assets.compile = false
|
||||||
|
@ -16,7 +16,7 @@ task 'assets:precompile:before' do
|
|||||||
# is recompiled
|
# is recompiled
|
||||||
Emoji.clear_cache
|
Emoji.clear_cache
|
||||||
|
|
||||||
if Rails.configuration.assets.js_compressor == :uglifier && !`which uglifyjs`.empty? && !ENV['SKIP_NODE_UGLIFY']
|
if !`which uglifyjs`.empty? && !ENV['SKIP_NODE_UGLIFY']
|
||||||
$node_uglify = true
|
$node_uglify = true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ def compress_node(from, to)
|
|||||||
source_map_root = assets + ((d = File.dirname(from)) == "." ? "" : "/#{d}")
|
source_map_root = assets + ((d = File.dirname(from)) == "." ? "" : "/#{d}")
|
||||||
source_map_url = cdn_path "/assets/#{to}.map"
|
source_map_url = cdn_path "/assets/#{to}.map"
|
||||||
|
|
||||||
cmd = "uglifyjs '#{assets_path}/#{from}' -p relative -c -m -o '#{to_path}' --source-map-root '#{source_map_root}' --source-map '#{assets_path}/#{to}.map' --source-map-url '#{source_map_url}'"
|
cmd = "uglifyjs '#{assets_path}/#{from}' -p relative -m -o '#{to_path}' --source-map-root '#{source_map_root}' --source-map '#{assets_path}/#{to}.map' --source-map-url '#{source_map_url}'"
|
||||||
|
|
||||||
STDERR.puts cmd
|
STDERR.puts cmd
|
||||||
result = `#{cmd} 2>&1`
|
result = `#{cmd} 2>&1`
|
||||||
@ -128,6 +128,16 @@ def brotli(path)
|
|||||||
raise "chmod failed: exit code #{$?.exitstatus}" if $?.exitstatus != 0
|
raise "chmod failed: exit code #{$?.exitstatus}" if $?.exitstatus != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def should_compress?(path, locales)
|
||||||
|
return false if Rails.configuration.assets.skip_minification.include? path
|
||||||
|
return true unless path.include? "locales/"
|
||||||
|
|
||||||
|
path_locale = path.delete_prefix("locales/").delete_suffix(".js")
|
||||||
|
return true if locales.include? path_locale
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
def compress(from, to)
|
def compress(from, to)
|
||||||
if $node_uglify
|
if $node_uglify
|
||||||
compress_node(from, to)
|
compress_node(from, to)
|
||||||
@ -163,10 +173,15 @@ task 'assets:precompile' => 'assets:precompile:before' do
|
|||||||
|
|
||||||
if $bypass_sprockets_uglify
|
if $bypass_sprockets_uglify
|
||||||
puts "Compressing Javascript and Generating Source Maps"
|
puts "Compressing Javascript and Generating Source Maps"
|
||||||
|
startAll = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
||||||
manifest = Sprockets::Manifest.new(assets_path)
|
manifest = Sprockets::Manifest.new(assets_path)
|
||||||
|
locales = Set.new(["en"])
|
||||||
|
|
||||||
|
RailsMultisite::ConnectionManagement.each_connection do |db|
|
||||||
|
locales.add(SiteSetting.default_locale)
|
||||||
|
end
|
||||||
|
|
||||||
concurrent? do |proc|
|
concurrent? do |proc|
|
||||||
to_skip = Rails.configuration.assets.skip_minification || []
|
|
||||||
manifest.files
|
manifest.files
|
||||||
.select { |k, v| k =~ /\.js$/ }
|
.select { |k, v| k =~ /\.js$/ }
|
||||||
.each do |file, info|
|
.each do |file, info|
|
||||||
@ -182,8 +197,7 @@ task 'assets:precompile' => 'assets:precompile:before' do
|
|||||||
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
||||||
STDERR.puts "#{start} Compressing: #{file}"
|
STDERR.puts "#{start} Compressing: #{file}"
|
||||||
|
|
||||||
# We can specify some files to never minify
|
if should_compress?(info["logical_path"], locales)
|
||||||
unless (ENV["DONT_MINIFY"] == "1") || to_skip.include?(info['logical_path'])
|
|
||||||
FileUtils.mv(path, _path)
|
FileUtils.mv(path, _path)
|
||||||
compress(_file, file)
|
compress(_file, file)
|
||||||
end
|
end
|
||||||
@ -191,7 +205,7 @@ task 'assets:precompile' => 'assets:precompile:before' do
|
|||||||
info["size"] = File.size(path)
|
info["size"] = File.size(path)
|
||||||
info["mtime"] = File.mtime(path).iso8601
|
info["mtime"] = File.mtime(path).iso8601
|
||||||
gzip(path)
|
gzip(path)
|
||||||
brotli(path)
|
brotli(path) if should_compress?(info["logical_path"], locales)
|
||||||
|
|
||||||
STDERR.puts "Done compressing #{file} : #{(Process.clock_gettime(Process::CLOCK_MONOTONIC) - start).round(2)} secs"
|
STDERR.puts "Done compressing #{file} : #{(Process.clock_gettime(Process::CLOCK_MONOTONIC) - start).round(2)} secs"
|
||||||
STDERR.puts
|
STDERR.puts
|
||||||
@ -200,6 +214,9 @@ task 'assets:precompile' => 'assets:precompile:before' do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
STDERR.puts "Done compressing all JS files : #{(Process.clock_gettime(Process::CLOCK_MONOTONIC) - startAll).round(2)} secs"
|
||||||
|
STDERR.puts
|
||||||
|
|
||||||
# protected
|
# protected
|
||||||
manifest.send :save
|
manifest.send :save
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user