为什么我的webpack捆绑包成功建立在主机上,却不在docker容器中?

我的项目具有这样的monorepo结构:

babel.config.js
  a-something
  b-something

在项目的根目录中有babel配置文件,还有软件包a-somethingb-something。 在软件包a-something中,我具有以下webpack配置:

const path = require('path')

module.exports = {
  target: 'node',entry: './src/index.js',output: {
    filename: 'bundle.js',path: path.resolve(__dirname,'build')
  },devtool: 'source-map',module: {
    rules: [
      {
        test: /\.js?$/,use: {
          loader: 'babel-loader',options: {
            rootMode: 'upward'
          }
        },include: [
          path.resolve(__dirname,'src'),/node_modules\/a-/,/node_modules\/b-/
        ]
      }
    ]
  }
}

在包a-something中,我有以下package.json:

{
  "name": "a-something","version": "1.0.0","description": "","main": "index.js","scripts": {
    "prod:build": "webpack --config webpack.config.js","prod:start": "node build/bundle.js"
  },"author": "","license": "ISC","dependencies": {
    "express": "^4.16.2","graphql": "^14.5.8","graphql-request": "^1.8.2","graphql-tag": "^2.10.1","b-something": "^1.0.0","node-fetch": "^2.6.0","sitemap": "^5.0.0"
  },"devDependencies": {
    "webpack": "3.5.6","@babel/polyfill": "7.7.0"
  }
}

我的根package.json具有以下依赖关系:

"@babel/cli": "^7.5.5","@babel/core": "^7.5.5","babel-loader": "8.0.6"

最后,我在软件包a-something中的Dockerfile是:

FROM node:10.15.1
COPY ./package.json /src/package.json
ENV PORT 3000
ENV NODE_ENV production
WORKDIR /src
RUN npm install
COPY ./lerna.json /src/lerna.json
COPY ./packages/a-something/package.json /src/packages/a-something/package.json
COPY ./packages/b-something/package.json /src/packages/b-something/package.json
RUN npm run clean
COPY . /src
WORKDIR /src/packages/a-something
RUN npm run prod:build
RUN echo "FINISHED BUILDING!" 
EXPOSE ${PORT}
CMD ["npm","run","prod:start"]

当我运行npm run prod: buildnpm run prod: start时,捆绑包成功构建,但是当我构建docker(上下文是根文件夹)时,出现以下npm错误:

ERROR in Entry module not found: Error: Can't resolve 'babel-loader' in '/src/packages/a-something'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! a-something@1.0.0 prod:build: `webpack --config webpack.config.js`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the a-something@1.0.0 prod:build script.

我的主机操作系统是macOS Mojave。也许Lerna生成的符号链接在Debian(由节点image使用)上的处理方式有所不同?


更新:通过将所有与babel相关的npm软件包从root package.json的devDependencies移至dependencies部分,解决了该问题。有谁知道为什么这可以解决问题?

lw1197 回答:为什么我的webpack捆绑包成功建立在主机上,却不在docker容器中?

正如我在问题的更新部分中提到的那样,解决方案是将所有与babel相关的软件包移至根package.json的devDependencies部分。

但是为什么会有帮助?

问题是我在Dockerfile中将NODE_ENV设置为生产环境。如果将NODE_ENV设置为生产,那么npm将不会安装dev依赖项。在主机上,我没有这样的变量。另外,根据通天docs,另一个问题是@babel/polyfill

  

因为这是一个polyfill(它将在您的源代码之前运行),   我们需要它是一个依赖项,而不是devDependency

根据docs @babel/polyfill也被弃用,因此更好的解决方案是:

  1. "babel-loader": "8.0.6"添加到root package.json
  2. devDependencies package.json中具有以下a-something
    "devDependencies": {
        "webpack": "3.5.6","core-js": "^3.4.7","regenerator-runtime": "^0.13.3"
      }
  1. 将这两行放在最上方的条目Javascript文件中:
import 'core-js/stable'
import 'regenerator-runtime/runtime'
  1. 最后使用此webpack配置:
    const path = require('path')

    module.exports = {
      target: 'node',entry: './src/index.js',output: {
        filename: 'bundle.js',path: path.resolve(__dirname,'build')
      },module: {
        rules: [
          {
            test: /\.js?$/,use: {
              loader: 'babel-loader',options: {
                rootMode: 'upward',presets: [
                  ['@babel/preset-env',{
                    corejs: 3,useBuiltIns: 'usage'
                  }]
                ]
              }
            },include: [
              path.resolve(__dirname,'src'),/node_modules\/a-/,/node_modules\/b-/
            ]
          }
        ]
      }
    }
本文链接:https://www.f2er.com/2986217.html

大家都在问