为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的 webpack 包在主机上成功构建但不在 docker 容器中?

为什么我的 webpack 包在主机上成功构建但不在 docker 容器中?

牧羊人nacy 2022-01-20 20:40:57
我的项目有一个这样的monorepo结构:babel.config.js  a-something  b-something我的项目根目录中有 babel 配置文件,并且包a-something和b-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"最后我的 Dockerfile 里面的包a-something是:FROM node:10.15.1COPY ./package.json /src/package.jsonENV PORT 3000ENV NODE_ENV productionWORKDIR /srcRUN npm installCOPY ./lerna.json /src/lerna.jsonCOPY ./packages/a-something/package.json /src/packages/a-something/package.jsonCOPY ./packages/b-something/package.json /src/packages/b-something/package.jsonRUN npm run cleanCOPY . /srcWORKDIR /src/packages/a-somethingRUN npm run prod:buildRUN echo "FINISHED BUILDING!" EXPOSE ${PORT}CMD ["npm" , "run", "prod:start"]我的主机操作系统是 macOS Mojave。也许 Lerna 生成的符号链接在 Debian 上的处理方式不同(由 node image使用)?更新:通过将所有与 babel 相关的 npm 包从根 package.jsondevDependencies的部分移动,问题得到解决。dependencies有谁知道为什么这会解决问题?
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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


但为什么这有帮助?


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


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


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


添加"babel-loader": "8.0.6"到根 package.json

devDependencies在a-somethingpackage.json中有以下内容:

    "devDependencies": {

        "webpack": "3.5.6",

        "core-js": "^3.4.7",

        "regenerator-runtime": "^0.13.3"

      }

将这两行放在最顶部的条目 Javascript 文件中:

import 'core-js/stable'

import 'regenerator-runtime/runtime'

最后使用这个 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-/

            ]

          }

        ]

      }

    }


查看完整回答
反对 回复 2022-01-20
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信