webpacker 6.0.0.beta.7 → 6.0.0.rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/jest.yml +7 -15
- data/.github/workflows/js-lint.yml +7 -15
- data/.github/workflows/rubocop.yml +1 -1
- data/.github/workflows/ruby.yml +15 -40
- data/.node-version +1 -1
- data/.rubocop.yml +2 -1
- data/CHANGELOG.md +34 -11
- data/CONTRIBUTING.md +19 -0
- data/Gemfile.lock +84 -84
- data/README.md +177 -165
- data/config/webpacker.yml +1 -1
- data/docs/developing_webpacker.md +29 -0
- data/docs/troubleshooting.md +57 -23
- data/docs/v6_upgrade.md +69 -42
- data/gemfiles/Gemfile-rails-edge +1 -1
- data/gemfiles/Gemfile-rails.6.1.x +12 -0
- data/lib/install/{packs/entrypoints/application.js → application.js} +3 -8
- data/lib/install/bin/webpack +4 -7
- data/lib/install/bin/yarn +18 -0
- data/lib/install/config/webpacker.yml +18 -19
- data/lib/install/package.json +15 -0
- data/lib/install/template.rb +38 -16
- data/lib/tasks/webpacker/check_node.rake +3 -1
- data/lib/tasks/webpacker/check_yarn.rake +4 -2
- data/lib/tasks/webpacker/clobber.rake +1 -1
- data/lib/tasks/webpacker/verify_config.rake +14 -0
- data/lib/tasks/webpacker/verify_install.rake +1 -11
- data/lib/tasks/yarn.rake +38 -0
- data/lib/webpacker/commands.rb +19 -15
- data/lib/webpacker/configuration.rb +15 -4
- data/lib/webpacker/dev_server.rb +6 -0
- data/lib/webpacker/dev_server_runner.rb +6 -3
- data/lib/webpacker/env.rb +5 -1
- data/lib/webpacker/helper.rb +14 -8
- data/lib/webpacker/instance.rb +4 -0
- data/lib/webpacker/manifest.rb +1 -2
- data/lib/webpacker/railtie.rb +8 -2
- data/lib/webpacker/runner.rb +1 -1
- data/lib/webpacker/version.rb +1 -1
- data/lib/webpacker/webpack_runner.rb +27 -7
- data/lib/webpacker.rb +1 -1
- data/package/__tests__/development.js +4 -11
- data/package/__tests__/env.js +8 -4
- data/package/babel/preset.js +0 -1
- data/package/config.js +3 -3
- data/package/env.js +6 -3
- data/package/environments/__tests__/base.js +3 -3
- data/package/environments/base.js +13 -8
- data/package/environments/development.js +36 -36
- data/package/index.js +2 -0
- data/package/inliningCss.js +7 -0
- data/package/rules/file.js +1 -1
- data/package/rules/sass.js +1 -2
- data/package/utils/get_style_rule.js +4 -2
- data/package.json +25 -29
- data/test/command_test.rb +76 -0
- data/test/configuration_test.rb +1 -1
- data/test/dev_server_runner_test.rb +5 -2
- data/test/helper_test.rb +48 -34
- data/test/manifest_test.rb +10 -2
- data/test/mounted_app/test/dummy/config/webpacker.yml +1 -1
- data/test/test_app/config/initializers/inspect_autoload_paths.rb +1 -0
- data/test/test_app/config/webpacker.yml +1 -3
- data/test/test_app/config/webpacker_other_location.yml +79 -0
- data/test/test_app/public/packs/manifest.json +12 -5
- data/test/webpacker_test.rb +21 -0
- data/webpacker.gemspec +2 -2
- data/yarn.lock +2357 -3262
- metadata +22 -11
data/lib/tasks/yarn.rake
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Duplicate of the yarn tasks still present in Rails until Webpacker <5 have been deprecated
|
4
|
+
|
5
|
+
namespace :yarn do
|
6
|
+
desc "Install all JavaScript dependencies as specified via Yarn"
|
7
|
+
task :install do
|
8
|
+
begin
|
9
|
+
# Install only production deps when for not usual envs.
|
10
|
+
valid_node_envs = %w[test development production]
|
11
|
+
node_env = ENV.fetch("NODE_ENV") do
|
12
|
+
valid_node_envs.include?(Rails.env) ? Rails.env : "production"
|
13
|
+
end
|
14
|
+
|
15
|
+
yarn_flags =
|
16
|
+
if `#{RbConfig.ruby} "#{Rails.root}/bin/yarn" --version`.start_with?("1")
|
17
|
+
"--no-progress --frozen-lockfile"
|
18
|
+
else
|
19
|
+
"--immutable"
|
20
|
+
end
|
21
|
+
|
22
|
+
system(
|
23
|
+
{ "NODE_ENV" => node_env },
|
24
|
+
"#{RbConfig.ruby} \"#{Rails.root}/bin/yarn\" install #{yarn_flags}",
|
25
|
+
exception: true
|
26
|
+
)
|
27
|
+
rescue Errno::ENOENT
|
28
|
+
$stderr.puts "bin/yarn was not found."
|
29
|
+
$stderr.puts "Please run `bundle exec rails app:update:bin` to create it."
|
30
|
+
exit 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
|
36
|
+
if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
|
37
|
+
Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
|
38
|
+
end
|
data/lib/webpacker/commands.rb
CHANGED
@@ -17,20 +17,21 @@ class Webpacker::Commands
|
|
17
17
|
#
|
18
18
|
def clean(count = 2, age = 3600)
|
19
19
|
if config.public_output_path.exist? && config.public_manifest_path.exist?
|
20
|
-
|
21
|
-
.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
packs
|
21
|
+
.map do |paths|
|
22
|
+
paths.map { |path| [Time.now - File.mtime(path), path] }
|
23
|
+
.sort
|
24
|
+
.reject.with_index do |(file_age, _), index|
|
25
|
+
file_age < age || index < count
|
26
|
+
end
|
27
|
+
.map { |_, path| path }
|
27
28
|
end
|
28
|
-
.
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
.flatten
|
30
|
+
.compact
|
31
|
+
.each do |file|
|
32
|
+
if File.file?(file)
|
33
|
+
File.delete(file)
|
34
|
+
logger.info "Removed #{file}"
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
@@ -54,12 +55,15 @@ class Webpacker::Commands
|
|
54
55
|
end
|
55
56
|
|
56
57
|
private
|
57
|
-
def
|
58
|
+
def packs
|
58
59
|
all_files = Dir.glob("#{config.public_output_path}/**/*")
|
59
60
|
manifest_config = Dir.glob("#{config.public_manifest_path}*")
|
60
61
|
|
61
62
|
packs = all_files - manifest_config - current_version
|
62
|
-
packs.reject { |file| File.directory?(file) }.group_by
|
63
|
+
packs.reject { |file| File.directory?(file) }.group_by do |path|
|
64
|
+
base, _, ext = File.basename(path).scan(/(.*)(-[\da-f]+)(\.\w+)/).flatten
|
65
|
+
"#{File.dirname(path)}/#{base}#{ext}"
|
66
|
+
end.values
|
63
67
|
end
|
64
68
|
|
65
69
|
def current_version
|
@@ -73,8 +73,12 @@ class Webpacker::Configuration
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def load
|
76
|
-
|
77
|
-
|
76
|
+
config = begin
|
77
|
+
YAML.load_file(config_path.to_s, aliases: true)
|
78
|
+
rescue ArgumentError
|
79
|
+
YAML.load_file(config_path.to_s)
|
80
|
+
end
|
81
|
+
config[env].deep_symbolize_keys
|
78
82
|
rescue Errno::ENOENT => e
|
79
83
|
raise "Webpacker configuration file not found #{config_path}. " \
|
80
84
|
"Please run rails webpacker:install " \
|
@@ -87,7 +91,14 @@ class Webpacker::Configuration
|
|
87
91
|
end
|
88
92
|
|
89
93
|
def defaults
|
90
|
-
@defaults ||=
|
91
|
-
|
94
|
+
@defaults ||= begin
|
95
|
+
path = File.expand_path("../../install/config/webpacker.yml", __FILE__)
|
96
|
+
config = begin
|
97
|
+
YAML.load_file(path, aliases: true)
|
98
|
+
rescue ArgumentError
|
99
|
+
YAML.load_file(path)
|
100
|
+
end
|
101
|
+
HashWithIndifferentAccess.new(config[env])
|
102
|
+
end
|
92
103
|
end
|
93
104
|
end
|
data/lib/webpacker/dev_server.rb
CHANGED
@@ -51,12 +51,18 @@ class Webpacker::DevServer
|
|
51
51
|
fetch(:pretty)
|
52
52
|
end
|
53
53
|
|
54
|
+
def hmr?
|
55
|
+
fetch(:hmr)
|
56
|
+
end
|
57
|
+
|
54
58
|
def env_prefix
|
55
59
|
config.dev_server.fetch(:env_prefix, DEFAULT_ENV_PREFIX)
|
56
60
|
end
|
57
61
|
|
58
62
|
private
|
59
63
|
def fetch(key)
|
64
|
+
return nil unless config.dev_server.present?
|
65
|
+
|
60
66
|
ENV["#{env_prefix}_#{key.upcase}"] || config.dev_server.fetch(key, defaults[key])
|
61
67
|
end
|
62
68
|
|
@@ -20,7 +20,7 @@ module Webpacker
|
|
20
20
|
|
21
21
|
@config = Configuration.new(
|
22
22
|
root_path: app_root,
|
23
|
-
config_path:
|
23
|
+
config_path: Pathname.new(@webpacker_config),
|
24
24
|
env: ENV["RAILS_ENV"]
|
25
25
|
)
|
26
26
|
|
@@ -30,6 +30,7 @@ module Webpacker
|
|
30
30
|
@port = dev_server.port
|
31
31
|
@pretty = dev_server.pretty?
|
32
32
|
@https = dev_server.https?
|
33
|
+
@hot = dev_server.hmr?
|
33
34
|
|
34
35
|
rescue Errno::ENOENT, NoMethodError
|
35
36
|
$stdout.puts "webpack dev_server configuration not found in #{@config.config_path}[#{ENV["RAILS_ENV"]}]."
|
@@ -64,7 +65,7 @@ module Webpacker
|
|
64
65
|
def execute_cmd
|
65
66
|
env = Webpacker::Compiler.env
|
66
67
|
env["WEBPACKER_CONFIG"] = @webpacker_config
|
67
|
-
env["
|
68
|
+
env["WEBPACK_SERVE"] = "true"
|
68
69
|
|
69
70
|
cmd = if node_modules_bin_exist?
|
70
71
|
["#{@node_modules_bin_path}/webpack", "serve"]
|
@@ -73,12 +74,14 @@ module Webpacker
|
|
73
74
|
end
|
74
75
|
|
75
76
|
if @argv.include?("--debug-webpacker")
|
76
|
-
cmd = [ "node", "--inspect-brk"] + cmd
|
77
|
+
cmd = [ "node", "--inspect-brk", "--trace-warnings" ] + cmd
|
77
78
|
@argv.delete "--debug-webpacker"
|
78
79
|
end
|
79
80
|
|
80
81
|
cmd += ["--config", @webpack_config]
|
81
82
|
cmd += ["--progress", "--color"] if @pretty
|
83
|
+
|
84
|
+
cmd += ["--hot"] if @hot
|
82
85
|
cmd += @argv
|
83
86
|
|
84
87
|
Dir.chdir(@app_path) do
|
data/lib/webpacker/env.rb
CHANGED
@@ -27,7 +27,11 @@ class Webpacker::Env
|
|
27
27
|
|
28
28
|
def available_environments
|
29
29
|
if config_path.exist?
|
30
|
-
|
30
|
+
begin
|
31
|
+
YAML.load_file(config_path.to_s, aliases: true)
|
32
|
+
rescue ArgumentError
|
33
|
+
YAML.load_file(config_path.to_s)
|
34
|
+
end
|
31
35
|
else
|
32
36
|
[].freeze
|
33
37
|
end
|
data/lib/webpacker/helper.rb
CHANGED
@@ -81,11 +81,11 @@ module Webpacker::Helper
|
|
81
81
|
# Example:
|
82
82
|
#
|
83
83
|
# <%= javascript_pack_tag 'calendar', 'map', 'data-turbolinks-track': 'reload' %> # =>
|
84
|
-
# <script src="/packs/vendor-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
|
85
|
-
# <script src="/packs/calendar~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
|
86
|
-
# <script src="/packs/calendar-1016838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
|
87
|
-
# <script src="/packs/map~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
|
88
|
-
# <script src="/packs/map-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload"></script>
|
84
|
+
# <script src="/packs/vendor-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
|
85
|
+
# <script src="/packs/calendar~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
|
86
|
+
# <script src="/packs/calendar-1016838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
|
87
|
+
# <script src="/packs/map~runtime-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
|
88
|
+
# <script src="/packs/map-16838bab065ae1e314.chunk.js" data-turbolinks-track="reload" defer="true"></script>
|
89
89
|
#
|
90
90
|
# DO:
|
91
91
|
#
|
@@ -95,8 +95,8 @@ module Webpacker::Helper
|
|
95
95
|
#
|
96
96
|
# <%= javascript_pack_tag 'calendar' %>
|
97
97
|
# <%= javascript_pack_tag 'map' %>
|
98
|
-
def javascript_pack_tag(*names, **options)
|
99
|
-
javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options)
|
98
|
+
def javascript_pack_tag(*names, defer: true, **options)
|
99
|
+
javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options.tap { |o| o[:defer] = defer })
|
100
100
|
end
|
101
101
|
|
102
102
|
# Creates a link tag, for preloading, that references a given Webpacker asset.
|
@@ -128,6 +128,10 @@ module Webpacker::Helper
|
|
128
128
|
# <link rel="stylesheet" media="screen" href="/packs/calendar-8c7ce31a.chunk.css" />
|
129
129
|
# <link rel="stylesheet" media="screen" href="/packs/map-8c7ce31a.chunk.css" />
|
130
130
|
#
|
131
|
+
# When using the webpack-dev-server, CSS is inlined so HMR can be turned on for CSS,
|
132
|
+
# including CSS modules
|
133
|
+
# <%= stylesheet_pack_tag 'calendar', 'map' %> # => nil
|
134
|
+
#
|
131
135
|
# DO:
|
132
136
|
#
|
133
137
|
# <%= stylesheet_pack_tag 'calendar', 'map' %>
|
@@ -137,6 +141,8 @@ module Webpacker::Helper
|
|
137
141
|
# <%= stylesheet_pack_tag 'calendar' %>
|
138
142
|
# <%= stylesheet_pack_tag 'map' %>
|
139
143
|
def stylesheet_pack_tag(*names, **options)
|
144
|
+
return "" if Webpacker.inlining_css?
|
145
|
+
|
140
146
|
stylesheet_link_tag(*sources_from_manifest_entrypoints(names, type: :stylesheet), **options)
|
141
147
|
end
|
142
148
|
|
@@ -147,7 +153,7 @@ module Webpacker::Helper
|
|
147
153
|
end
|
148
154
|
|
149
155
|
def resolve_path_to_image(name, **options)
|
150
|
-
path = name.starts_with?("
|
156
|
+
path = name.starts_with?("static/") ? name : "static/#{name}"
|
151
157
|
path_to_asset(current_webpacker_instance.manifest.lookup!(path), options)
|
152
158
|
rescue
|
153
159
|
path_to_asset(current_webpacker_instance.manifest.lookup!(name), options)
|
data/lib/webpacker/instance.rb
CHANGED
data/lib/webpacker/manifest.rb
CHANGED
@@ -91,8 +91,7 @@ class Webpacker::Manifest
|
|
91
91
|
# manifest hash the entrypoints are defined by their pack name without the extension.
|
92
92
|
# When the user provides a name with a file extension, we want to try to strip it off.
|
93
93
|
def manifest_name(name, pack_type)
|
94
|
-
|
95
|
-
File.basename(name, ".#{pack_type}")
|
94
|
+
name.chomp(".#{pack_type}")
|
96
95
|
end
|
97
96
|
|
98
97
|
def manifest_type(pack_type)
|
data/lib/webpacker/railtie.rb
CHANGED
@@ -8,8 +8,7 @@ class Webpacker::Engine < ::Rails::Engine
|
|
8
8
|
config.webpacker = ActiveSupport::OrderedOptions.new
|
9
9
|
|
10
10
|
initializer "webpacker.proxy" do |app|
|
11
|
-
|
12
|
-
if insert_middleware
|
11
|
+
if (Webpacker.config.dev_server.present? rescue nil)
|
13
12
|
app.middleware.insert_before 0,
|
14
13
|
Rails::VERSION::MAJOR >= 5 ?
|
15
14
|
Webpacker::DevServerProxy : "Webpacker::DevServerProxy", ssl_verify_none: true
|
@@ -52,4 +51,11 @@ class Webpacker::Engine < ::Rails::Engine
|
|
52
51
|
app.config.javascript_path = Webpacker.config.source_path.relative_path_from(Rails.root.join("app")).to_s
|
53
52
|
end
|
54
53
|
end
|
54
|
+
|
55
|
+
initializer "webpacker.remove_app_packs_from_the_autoload_paths" do
|
56
|
+
Rails.application.config.before_initialize do
|
57
|
+
source_path = Webpacker.config.source_path.to_s
|
58
|
+
ActiveSupport::Dependencies.autoload_paths.delete(source_path)
|
59
|
+
end
|
60
|
+
end
|
55
61
|
end
|
data/lib/webpacker/runner.rb
CHANGED
@@ -12,7 +12,7 @@ module Webpacker
|
|
12
12
|
@app_path = File.expand_path(".", Dir.pwd)
|
13
13
|
@node_modules_bin_path = ENV["WEBPACKER_NODE_MODULES_BIN_PATH"] || `yarn bin`.chomp
|
14
14
|
@webpack_config = File.join(@app_path, "config/webpack/#{ENV["NODE_ENV"]}.js")
|
15
|
-
@webpacker_config = File.join(@app_path, "config/webpacker.yml")
|
15
|
+
@webpacker_config = ENV["WEBPACKER_CONFIG"] || File.join(@app_path, "config/webpacker.yml")
|
16
16
|
|
17
17
|
unless File.exist?(@webpack_config)
|
18
18
|
$stderr.puts "webpack config #{@webpack_config} not found, please run 'bundle exec rails webpacker:install' to install Webpacker with default configs or add the missing config file for your custom environment."
|
data/lib/webpacker/version.rb
CHANGED
@@ -3,6 +3,19 @@ require "webpacker/runner"
|
|
3
3
|
|
4
4
|
module Webpacker
|
5
5
|
class WebpackRunner < Webpacker::Runner
|
6
|
+
WEBPACK_COMMANDS = [
|
7
|
+
"help",
|
8
|
+
"h",
|
9
|
+
"--help",
|
10
|
+
"-h",
|
11
|
+
"version",
|
12
|
+
"v",
|
13
|
+
"--version",
|
14
|
+
"-v",
|
15
|
+
"info",
|
16
|
+
"i"
|
17
|
+
].freeze
|
18
|
+
|
6
19
|
def run
|
7
20
|
env = Webpacker::Compiler.env
|
8
21
|
env["WEBPACKER_CONFIG"] = @webpacker_config
|
@@ -13,17 +26,24 @@ module Webpacker
|
|
13
26
|
["yarn", "webpack"]
|
14
27
|
end
|
15
28
|
|
16
|
-
if @argv.
|
17
|
-
cmd = [
|
18
|
-
|
29
|
+
if @argv.delete "--debug-webpacker"
|
30
|
+
cmd = ["node", "--inspect-brk"] + cmd
|
31
|
+
end
|
32
|
+
|
33
|
+
if @argv.delete "--trace-deprecation"
|
34
|
+
cmd = ["node", "--trace-deprecation"] + cmd
|
35
|
+
end
|
36
|
+
|
37
|
+
if @argv.delete "--no-deprecation"
|
38
|
+
cmd = ["node", "--no-deprecation"] + cmd
|
19
39
|
end
|
20
40
|
|
21
|
-
|
22
|
-
|
23
|
-
|
41
|
+
# Webpack commands are not compatible with --config option.
|
42
|
+
if (@argv & WEBPACK_COMMANDS).empty?
|
43
|
+
cmd += ["--config", @webpack_config]
|
24
44
|
end
|
25
45
|
|
26
|
-
cmd +=
|
46
|
+
cmd += @argv
|
27
47
|
|
28
48
|
Dir.chdir(@app_path) do
|
29
49
|
Kernel.exec env, *cmd
|
data/lib/webpacker.rb
CHANGED
@@ -30,7 +30,7 @@ module Webpacker
|
|
30
30
|
Webpacker.logger = old_logger
|
31
31
|
end
|
32
32
|
|
33
|
-
delegate :logger, :logger=, :env, to: :instance
|
33
|
+
delegate :logger, :logger=, :env, :inlining_css?, to: :instance
|
34
34
|
delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance
|
35
35
|
delegate :bootstrap, :clean, :clobber, :compile, to: :commands
|
36
36
|
end
|
@@ -11,27 +11,20 @@ describe('Development environment', () => {
|
|
11
11
|
describe('webpackConfig', () => {
|
12
12
|
beforeEach(() => jest.resetModules())
|
13
13
|
|
14
|
-
test('should use development config and environment including devServer if
|
14
|
+
test('should use development config and environment including devServer if WEBPACK_SERVE', () => {
|
15
15
|
process.env.RAILS_ENV = 'development'
|
16
16
|
process.env.NODE_ENV = 'development'
|
17
|
-
process.env.
|
17
|
+
process.env.WEBPACK_SERVE = 'true'
|
18
18
|
const { webpackConfig } = require('../index')
|
19
19
|
|
20
20
|
expect(webpackConfig.output.path).toEqual(resolve('public', 'packs'))
|
21
21
|
expect(webpackConfig.output.publicPath).toEqual('/packs/')
|
22
|
-
expect(webpackConfig).toMatchObject({
|
23
|
-
devServer: {
|
24
|
-
host: 'localhost',
|
25
|
-
port: 3035,
|
26
|
-
injectClient: true
|
27
|
-
}
|
28
|
-
})
|
29
22
|
})
|
30
23
|
|
31
|
-
test('should use development config and environment if
|
24
|
+
test('should use development config and environment if WEBPACK_SERVE', () => {
|
32
25
|
process.env.RAILS_ENV = 'development'
|
33
26
|
process.env.NODE_ENV = 'development'
|
34
|
-
process.env.
|
27
|
+
process.env.WEBPACK_SERVE = undefined
|
35
28
|
const { webpackConfig } = require('../index')
|
36
29
|
|
37
30
|
expect(webpackConfig.output.path).toEqual(resolve('public', 'packs'))
|
data/package/__tests__/env.js
CHANGED
@@ -15,7 +15,8 @@ describe('Env', () => {
|
|
15
15
|
railsEnv: 'development',
|
16
16
|
nodeEnv: 'development',
|
17
17
|
isProduction: false,
|
18
|
-
isDevelopment: true
|
18
|
+
isDevelopment: true,
|
19
|
+
runningWebpackDevServer: false
|
19
20
|
})
|
20
21
|
})
|
21
22
|
|
@@ -26,7 +27,8 @@ describe('Env', () => {
|
|
26
27
|
railsEnv: 'development',
|
27
28
|
nodeEnv: 'production',
|
28
29
|
isProduction: true,
|
29
|
-
isDevelopment: false
|
30
|
+
isDevelopment: false,
|
31
|
+
runningWebpackDevServer: false
|
30
32
|
})
|
31
33
|
})
|
32
34
|
|
@@ -37,7 +39,8 @@ describe('Env', () => {
|
|
37
39
|
railsEnv: 'production',
|
38
40
|
nodeEnv: 'production',
|
39
41
|
isProduction: true,
|
40
|
-
isDevelopment: false
|
42
|
+
isDevelopment: false,
|
43
|
+
runningWebpackDevServer: false
|
41
44
|
})
|
42
45
|
})
|
43
46
|
|
@@ -48,7 +51,8 @@ describe('Env', () => {
|
|
48
51
|
railsEnv: 'staging',
|
49
52
|
nodeEnv: 'production',
|
50
53
|
isProduction: true,
|
51
|
-
isDevelopment: false
|
54
|
+
isDevelopment: false,
|
55
|
+
runningWebpackDevServer: false
|
52
56
|
})
|
53
57
|
})
|
54
58
|
})
|
data/package/babel/preset.js
CHANGED
data/package/config.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
const { resolve } = require('path')
|
2
|
-
const {
|
2
|
+
const { load } = require('js-yaml')
|
3
3
|
const { readFileSync } = require('fs')
|
4
4
|
const { merge } = require('webpack-merge')
|
5
5
|
const { ensureTrailingSlash } = require('./utils/helpers')
|
@@ -9,12 +9,12 @@ const configPath = require('./configPath')
|
|
9
9
|
const defaultConfigPath = require.resolve('../lib/install/config/webpacker.yml')
|
10
10
|
|
11
11
|
const getDefaultConfig = () => {
|
12
|
-
const defaultConfig =
|
12
|
+
const defaultConfig = load(readFileSync(defaultConfigPath), 'utf8')
|
13
13
|
return defaultConfig[railsEnv] || defaultConfig.production
|
14
14
|
}
|
15
15
|
|
16
16
|
const defaults = getDefaultConfig()
|
17
|
-
const app =
|
17
|
+
const app = load(readFileSync(configPath), 'utf8')[railsEnv]
|
18
18
|
|
19
19
|
const config = merge(defaults, app)
|
20
20
|
config.outputPath = resolve(config.public_root_path, config.public_output_path)
|
data/package/env.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
const {
|
1
|
+
const { load } = require('js-yaml')
|
2
2
|
const { readFileSync } = require('fs')
|
3
3
|
|
4
4
|
const NODE_ENVIRONMENTS = ['development', 'production', 'test']
|
@@ -12,13 +12,16 @@ const nodeEnv
|
|
12
12
|
const isProduction = nodeEnv === 'production'
|
13
13
|
const isDevelopment = nodeEnv === 'development'
|
14
14
|
|
15
|
-
const config =
|
15
|
+
const config = load(readFileSync(configPath), 'utf8')
|
16
16
|
const availableEnvironments = Object.keys(config).join('|')
|
17
17
|
const regex = new RegExp(`^(${availableEnvironments})$`, 'g')
|
18
18
|
|
19
|
+
const runningWebpackDevServer = process.env.WEBPACK_SERVE === 'true'
|
20
|
+
|
19
21
|
module.exports = {
|
20
22
|
railsEnv: railsEnv && railsEnv.match(regex) ? railsEnv : DEFAULT,
|
21
23
|
nodeEnv,
|
22
24
|
isProduction,
|
23
|
-
isDevelopment
|
25
|
+
isDevelopment,
|
26
|
+
runningWebpackDevServer
|
24
27
|
}
|
@@ -29,9 +29,9 @@ describe('Base config', () => {
|
|
29
29
|
})
|
30
30
|
|
31
31
|
test('should return output', () => {
|
32
|
-
expect(baseConfig.output.filename).toEqual('js/[name]
|
32
|
+
expect(baseConfig.output.filename).toEqual('js/[name].js')
|
33
33
|
expect(baseConfig.output.chunkFilename).toEqual(
|
34
|
-
'js/[name]
|
34
|
+
'js/[name].chunk.js'
|
35
35
|
)
|
36
36
|
})
|
37
37
|
|
@@ -44,7 +44,7 @@ describe('Base config', () => {
|
|
44
44
|
})
|
45
45
|
|
46
46
|
test('should return default plugins', () => {
|
47
|
-
expect(baseConfig.plugins.length).toEqual(
|
47
|
+
expect(baseConfig.plugins.length).toEqual(2)
|
48
48
|
})
|
49
49
|
|
50
50
|
test('should return default resolveLoader', () => {
|
@@ -5,10 +5,10 @@ const { basename, dirname, join, relative, resolve } = require('path')
|
|
5
5
|
const extname = require('path-complete-extname')
|
6
6
|
const PnpWebpackPlugin = require('pnp-webpack-plugin')
|
7
7
|
const { sync: globSync } = require('glob')
|
8
|
-
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
|
9
8
|
const WebpackAssetsManifest = require('webpack-assets-manifest')
|
10
9
|
const webpack = require('webpack')
|
11
10
|
const rules = require('../rules')
|
11
|
+
const { isProduction } = require('../env')
|
12
12
|
const config = require('../config')
|
13
13
|
const { moduleExists } = require('../utils/helpers')
|
14
14
|
|
@@ -16,7 +16,7 @@ const getEntryObject = () => {
|
|
16
16
|
const entries = {}
|
17
17
|
const rootPath = join(config.source_path, config.source_entry_path)
|
18
18
|
|
19
|
-
globSync(`${rootPath}
|
19
|
+
globSync(`${rootPath}/*.*`).forEach((path) => {
|
20
20
|
const namespace = relative(join(rootPath), dirname(path))
|
21
21
|
const name = join(namespace, basename(path, extname(path)))
|
22
22
|
let assetPaths = resolve(path)
|
@@ -52,7 +52,6 @@ const getModulePaths = () => {
|
|
52
52
|
const getPlugins = () => {
|
53
53
|
const plugins = [
|
54
54
|
new webpack.EnvironmentPlugin(process.env),
|
55
|
-
new CaseSensitivePathsPlugin(),
|
56
55
|
new WebpackAssetsManifest({
|
57
56
|
entrypoints: true,
|
58
57
|
writeToDisk: true,
|
@@ -63,11 +62,12 @@ const getPlugins = () => {
|
|
63
62
|
]
|
64
63
|
|
65
64
|
if (moduleExists('css-loader') && moduleExists('mini-css-extract-plugin')) {
|
65
|
+
const hash = isProduction ? '-[contenthash:8]' : ''
|
66
66
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
67
67
|
plugins.push(
|
68
68
|
new MiniCssExtractPlugin({
|
69
|
-
filename:
|
70
|
-
chunkFilename:
|
69
|
+
filename: `css/[name]${hash}.css`,
|
70
|
+
chunkFilename: `css/[id]${hash}.css`
|
71
71
|
})
|
72
72
|
)
|
73
73
|
}
|
@@ -75,12 +75,17 @@ const getPlugins = () => {
|
|
75
75
|
return plugins
|
76
76
|
}
|
77
77
|
|
78
|
+
// Don't use contentHash except for production for performance
|
79
|
+
// https://webpack.js.org/guides/build-performance/#avoid-production-specific-tooling
|
80
|
+
const hash = isProduction ? '-[contenthash]' : ''
|
78
81
|
module.exports = {
|
79
82
|
mode: 'production',
|
80
83
|
output: {
|
81
|
-
filename:
|
82
|
-
chunkFilename:
|
83
|
-
|
84
|
+
filename: `js/[name]${hash}.js`,
|
85
|
+
chunkFilename: `js/[name]${hash}.chunk.js`,
|
86
|
+
|
87
|
+
// https://webpack.js.org/configuration/output/#outputhotupdatechunkfilename
|
88
|
+
hotUpdateChunkFilename: 'js/[id].[fullhash].hot-update.js',
|
84
89
|
path: config.outputPath,
|
85
90
|
publicPath: config.publicPath
|
86
91
|
},
|