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。

解决我的问题:

  1. 我在我的 docker-compose.yml 文件中声明了一个新容器,它有一个 VIRTUAL_HOST 等于 webpack.mydomain.co 并监听端口 3035。
  2. 然后我不得不更新我的 SSL/TLS 证书以添加这个新的子域并在我的 mac.
  3. 上重新安装新证书
  4. 我已经更新了我的 config/webpacker.yml 文件,不再包含在 https 中(因为 nginx 正在处理它),并将 hostpublic 更改为webpack.mydomain.co
  5. 最后我不得不更新 CSP 规则,当然允许 connect-src 到 webpack.mydomain.co

完成后,页面加载没有任何问题,HMR 工作正常,因为 Hello World from Webpacker 消息在 Chrome 控制台中刷新,无需重新加载当前页面。

我希望这可以帮助人们 :)