Webpacker 仅创建 manifest.json 文件,因此缺少资产
Webpacker creates only the manifest.json file, so assets are missing
我正在使用 webpacker gem.
构建一个 Rails 5.2 应用程序
我按照安装说明进行了操作,因此我的布局中有 app/javascript/packs/application.js
文件和 <%= javascript_pack_tag 'application' %>
。
启动我的独角兽服务器后,bin/webpack-dev-server
进程和我正在访问该应用程序,网络浏览器的网络选项卡显示他无法从中下载 /packs/application-bdddc5e750615fa56298.js
文件我的服务器由于来自 webpack 服务器的文件结束错误(500 错误)。
在 public/packs
文件夹中执行 ls -al
显示以下内容:
drwxr-xr-x 2 zedtux zedtux 4096 Apr 4 16:35 .
drwxr-xr-x 16 zedtux root 4096 Apr 4 16:35 ..
-rw-r--r-- 1 zedtux zedtux 352 Apr 4 16:35 manifest.json
并且 manifest.json
包含:
{
"application.js": "/packs/application-bdddc5e750615fa56298.js",
"application.js.map": "/packs/js/application-45e23109c9e9d11521f0.hot-update.js.map",
"entrypoints": {
"application": {
"js": [
"/packs/application-bdddc5e750615fa56298.js"
],
"js.map": [
"/packs/application-bdddc5e750615fa56298.js.map",
"/packs/js/application-45e23109c9e9d11521f0.hot-update.js.map"
]
}
}
}
这是我的 config/webpacker.yml
文件:
# Note: You must restart bin/webpack-dev-server for changes to take effect
default: &default
source_path: app/javascript
source_entry_path: packs
public_root_path: public
public_output_path: packs
cache_path: tmp/cache/webpacker
check_yarn_integrity: false
webpack_compile_output: false
# Additional paths webpack should lookup modules
# ['app/assets', 'engine/foo/app/assets']
resolved_paths: []
# Reload manifest.json on all requests so we reload latest compiled packs
cache_manifest: false
# Extract and emit a css file
extract_css: false
static_assets_extensions:
- .jpg
- .jpeg
- .png
- .gif
- .tiff
- .ico
- .svg
- .eot
- .otf
- .ttf
- .woff
- .woff2
extensions:
- .mjs
- .js
- .sass
- .scss
- .css
- .module.sass
- .module.scss
- .module.css
- .png
- .svg
- .gif
- .jpeg
- .jpg
local:
<<: *default
compile: true
# Verifies that versions and hashed value of the package contents in the project's package.json
check_yarn_integrity: true
# Reference: https://webpack.js.org/configuration/dev-server/
dev_server:
https:
key: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
cert: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
cacert: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
host: 0.0.0.0
port: 3035
public: 0.0.0.0:3035
hmr: true
# Inline should be set to true if using HMR
inline: true
overlay: true
compress: true
disable_host_check: true
use_local_ip: false
quiet: false
headers:
'Access-Control-Allow-Origin': '*'
watch_options:
ignored: '**/node_modules/**'
test:
<<: *default
compile: true
# Compile test packs to a separate directory
public_output_path: packs-test
production:
<<: *default
# Production depends on precompilation of packs prior to booting for performance.
compile: false
# Extract and emit a css file
extract_css: true
# Cache manifest.json for performance
cache_manifest: true
本应用使用本地作为开发环境,所以我将开发密钥重命名为本地
顺便说一句,我启用了 hmr
,但即使禁用它,我的结果也是一样的。
为什么文件夹里没有写文件?我该如何解决这个问题?
更新
当我停止 bin/webpack-dev-server
进程并重新加载页面时,webpack 重新编译并且文件在网络浏览器中正确加载。
更新 2
在新选项卡中打开包 URL 显示 500 错误。我注意到包 URL 缺少 3035 端口。添加它返回了我预期的 JavaScript 代码。
那么如何修复它以便包 URL 包含服务器端口?
我终于弄清楚我的设置出了什么问题。
我首先了解的是 bin/webpack-dev-server
运行,当它捕获请求以便为它们提供服务时,资产文件不会写入 public/packs
文件夹了。
另一方面,当停止服务器时,文件将写入磁盘,因为它们必须由 Rails.
提供服务
然后我意识到一切都与我的环境有关:我 运行 我的应用程序使用 Docker 和 docker-compose + 我正在使用 Nginx 反向代理(jwilder/nginx-proxy).
我是 运行 bin/webpack-dev-server
使用 docker-compose exec app bin/webpack-dev-server
以便将它 运行 放在一边 Rails。
解决我的问题:
- 我在我的
docker-compose.yml
文件中声明了一个新容器,它有一个 VIRTUAL_HOST
等于 webpack.mydomain.co
并监听端口 3035。
- 然后我不得不更新我的 SSL/TLS 证书以添加这个新的子域并在我的 mac.
上重新安装新证书
- 我已经更新了我的
config/webpacker.yml
文件,不再包含在 https
中(因为 nginx 正在处理它),并将 host
和 public
更改为webpack.mydomain.co
- 最后我不得不更新 CSP 规则,当然允许 connect-src 到
webpack.mydomain.co
。
完成后,页面加载没有任何问题,HMR 工作正常,因为 Hello World from Webpacker
消息在 Chrome 控制台中刷新,无需重新加载当前页面。
我希望这可以帮助人们 :)
我正在使用 webpacker gem.
构建一个 Rails 5.2 应用程序我按照安装说明进行了操作,因此我的布局中有 app/javascript/packs/application.js
文件和 <%= javascript_pack_tag 'application' %>
。
启动我的独角兽服务器后,bin/webpack-dev-server
进程和我正在访问该应用程序,网络浏览器的网络选项卡显示他无法从中下载 /packs/application-bdddc5e750615fa56298.js
文件我的服务器由于来自 webpack 服务器的文件结束错误(500 错误)。
在 public/packs
文件夹中执行 ls -al
显示以下内容:
drwxr-xr-x 2 zedtux zedtux 4096 Apr 4 16:35 .
drwxr-xr-x 16 zedtux root 4096 Apr 4 16:35 ..
-rw-r--r-- 1 zedtux zedtux 352 Apr 4 16:35 manifest.json
并且 manifest.json
包含:
{
"application.js": "/packs/application-bdddc5e750615fa56298.js",
"application.js.map": "/packs/js/application-45e23109c9e9d11521f0.hot-update.js.map",
"entrypoints": {
"application": {
"js": [
"/packs/application-bdddc5e750615fa56298.js"
],
"js.map": [
"/packs/application-bdddc5e750615fa56298.js.map",
"/packs/js/application-45e23109c9e9d11521f0.hot-update.js.map"
]
}
}
}
这是我的 config/webpacker.yml
文件:
# Note: You must restart bin/webpack-dev-server for changes to take effect
default: &default
source_path: app/javascript
source_entry_path: packs
public_root_path: public
public_output_path: packs
cache_path: tmp/cache/webpacker
check_yarn_integrity: false
webpack_compile_output: false
# Additional paths webpack should lookup modules
# ['app/assets', 'engine/foo/app/assets']
resolved_paths: []
# Reload manifest.json on all requests so we reload latest compiled packs
cache_manifest: false
# Extract and emit a css file
extract_css: false
static_assets_extensions:
- .jpg
- .jpeg
- .png
- .gif
- .tiff
- .ico
- .svg
- .eot
- .otf
- .ttf
- .woff
- .woff2
extensions:
- .mjs
- .js
- .sass
- .scss
- .css
- .module.sass
- .module.scss
- .module.css
- .png
- .svg
- .gif
- .jpeg
- .jpg
local:
<<: *default
compile: true
# Verifies that versions and hashed value of the package contents in the project's package.json
check_yarn_integrity: true
# Reference: https://webpack.js.org/configuration/dev-server/
dev_server:
https:
key: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
cert: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
cacert: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
host: 0.0.0.0
port: 3035
public: 0.0.0.0:3035
hmr: true
# Inline should be set to true if using HMR
inline: true
overlay: true
compress: true
disable_host_check: true
use_local_ip: false
quiet: false
headers:
'Access-Control-Allow-Origin': '*'
watch_options:
ignored: '**/node_modules/**'
test:
<<: *default
compile: true
# Compile test packs to a separate directory
public_output_path: packs-test
production:
<<: *default
# Production depends on precompilation of packs prior to booting for performance.
compile: false
# Extract and emit a css file
extract_css: true
# Cache manifest.json for performance
cache_manifest: true
本应用使用本地作为开发环境,所以我将开发密钥重命名为本地
顺便说一句,我启用了 hmr
,但即使禁用它,我的结果也是一样的。
为什么文件夹里没有写文件?我该如何解决这个问题?
更新
当我停止 bin/webpack-dev-server
进程并重新加载页面时,webpack 重新编译并且文件在网络浏览器中正确加载。
更新 2
在新选项卡中打开包 URL 显示 500 错误。我注意到包 URL 缺少 3035 端口。添加它返回了我预期的 JavaScript 代码。
那么如何修复它以便包 URL 包含服务器端口?
我终于弄清楚我的设置出了什么问题。
我首先了解的是 bin/webpack-dev-server
运行,当它捕获请求以便为它们提供服务时,资产文件不会写入 public/packs
文件夹了。
另一方面,当停止服务器时,文件将写入磁盘,因为它们必须由 Rails.
然后我意识到一切都与我的环境有关:我 运行 我的应用程序使用 Docker 和 docker-compose + 我正在使用 Nginx 反向代理(jwilder/nginx-proxy).
我是 运行 bin/webpack-dev-server
使用 docker-compose exec app bin/webpack-dev-server
以便将它 运行 放在一边 Rails。
解决我的问题:
- 我在我的
docker-compose.yml
文件中声明了一个新容器,它有一个VIRTUAL_HOST
等于webpack.mydomain.co
并监听端口 3035。 - 然后我不得不更新我的 SSL/TLS 证书以添加这个新的子域并在我的 mac. 上重新安装新证书
- 我已经更新了我的
config/webpacker.yml
文件,不再包含在https
中(因为 nginx 正在处理它),并将host
和public
更改为webpack.mydomain.co
- 最后我不得不更新 CSP 规则,当然允许 connect-src 到
webpack.mydomain.co
。
完成后,页面加载没有任何问题,HMR 工作正常,因为 Hello World from Webpacker
消息在 Chrome 控制台中刷新,无需重新加载当前页面。
我希望这可以帮助人们 :)