在 docker 应用程序中启用 webpack 热重载

Kan*_*naj 12 node.js docker webpack webpack-dev-server webpack-2

我有一个带有以下容器的 docker 应用程序

  1. node - 项目的源代码。它提供位于公共文件夹中的 html 页面。
  2. webpack - 监视节点容器中的文件,并在代码发生更改时更新公共文件夹(来自节点容器)。
  3. 数据库

这是 webpack/node 容器设置

 web:
    container_name: web
    build: .
    env_file: .env
    volumes:
      - .:/usr/src/app
      - node_modules:/usr/src/app/node_modules
    command: npm start
    environment:
      - NODE_ENV=development
    ports:
      - "8000:8000"

  webpack:
    container_name: webpack
    build: ./webpack/
    depends_on:
      - web
    volumes_from:
      - web
    working_dir: /usr/src/app
    command: webpack --watch
Run Code Online (Sandbox Code Playgroud)

所以目前,webpack 容器会监控和更新 public 文件夹。我必须手动刷新浏览器才能看到我的更改。

我现在正在尝试合并 webpack-dev-server 以在浏览器中启用自动刷新

这些是我对 webpack 配置文件的更改

module.exports = {
  entry:[
    'webpack/hot/dev-server',
    'webpack-dev-server/client?http://localhost:8080',
    './client/index.js'
  ],

  ....

  devServer:{
    hot: true,
    proxy: {
      '*': 'http://localhost:8000'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

和新的 docker-compose 文件文件 webpack

  webpack:
    container_name: webpack
    build: ./webpack/
    depends_on:
      - web
    volumes_from:
      - web
    working_dir: /usr/src/app
    command: webpack-dev-server --hot --inline
    ports:
      - "8080:8080"
Run Code Online (Sandbox Code Playgroud)

我似乎在运行应用程序时遇到错误

Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
webpack     |  - configuration.entry should be one of these:
webpack     |    object { <key>: non-empty string | [non-empty string] } | non-empty string | [non-empty string] | function
webpack     |    The entry point(s) of the compilation.
webpack     |    Details:
webpack     |     * configuration.entry should be an object.
webpack     |     * configuration.entry should be a string.
webpack     |     * configuration.entry should NOT have duplicate items (items ## 1 and 2 are identical) ({
webpack     |         "keyword": "uniqueItems",
webpack     |         "dataPath": ".entry",
webpack     |         "schemaPath": "#/definitions/common.nonEmptyArrayOfUniqueStringValues/uniqueItems",
webpack     |         "params": {
webpack     |           "i": 2,
webpack     |           "j": 1
webpack     |         },
webpack     |         "message": "should NOT have duplicate items (items ## 1 and 2 are identical)",
webpack     |         "schema": true,
webpack     |         "parentSchema": {
webpack     |           "items": {
webpack     |             "minLength": 1,
webpack     |             "type": "string"
webpack     |           },
webpack     |           "minItems": 1,
webpack     |           "type": "array",
webpack     |           "uniqueItems": true
webpack     |         },
webpack     |         "data": [
webpack     |           "/usr/src/app/node_modules/webpack-dev-server/client/index.js?http://localhost:8080",
webpack     |           "webpack/hot/dev-server",
webpack     |           "webpack/hot/dev-server",
webpack     |           "webpack-dev-server/client?http://localhost:8080",
webpack     |           "./client/index.js"
webpack     |         ]
webpack     |       }).
webpack     |       [non-empty string]
webpack     |     * configuration.entry should be an instance of function
webpack     |       function returning an entry object or a promise..
Run Code Online (Sandbox Code Playgroud)

如您所见,我的条目对象没有任何重复项。

还有什么我应该做的吗?我错过了什么?

webpack-dev-server 基本上应该将所有请求代理到节点服务器。

Mih*_*iev 9

Docker 和 webpack-dev-server 可以在没有任何中间件或插件的情况下完全运行,正确的配置是交易:

devServer: {
  port: 80, // use any port suitable for your configuration
  host: '0.0.0.0', // to accept connections from outside container
  watchOptions: {
      aggregateTimeout: 500, // delay before reloading
      poll: 1000 // enable polling since fsevents are not supported in docker
  }
}
Run Code Online (Sandbox Code Playgroud)

仅当您的 docker 容器不支持 fsevents 时才使用此配置。

为了提高性能,请查看 HosseinAgha 答案 #42445288:在docker 应用程序中启用 webpack 热重载


Hos*_*gha 8

即使将我的项目文件夹装入容器后,我也无法使 webpack 或 webpack-dev-server watch (--watch) 模式工作。
要解决这个问题,您需要了解 webpack 如何检测目录中的文件更改。
它使用 2 种软件之一,这些软件添加了操作系统级别的支持,用于监视名为inotify和 的文件更改fsevent。标准 Docker 映像通常没有inotify预装这些(特别是针对 linux),因此您必须将其安装在 Dockerfile 中。在发行版的包管理器中
查找inotify-tools包并安装它。幸运的是所有的alpinedebiancentos有这个。

  • 这只是关于文件更改,完全没问题。webpack 正在立即重新编译。实际问题是浏览器的热重载。浏览器不会自动刷新..这就是所谓的热重载(参见问题的标题) (3认同)

Tom*_*lie 6

Windows 设备遇到此问题。WATCHPACK_POLLING通过在truedocker compose环境中设置来解决它。

frontend:
  environment:
    - WATCHPACK_POLLING=true
Run Code Online (Sandbox Code Playgroud)


Jos*_*ora 5

尝试这样做:

  1. 在 webpack 配置中添加 watchOptions.poll = true 。

    watchOptions: { 轮询: true },

  2. 在 devServer 配置中配置主机

    主机:“0.0.0.0”,