【问题标题】:How to properly override babel@7 plugins for separate webpack server/client configurations如何为单独的 webpack 服务器/客户端配置正确覆盖 babel@7 插件
【发布时间】:2019-02-07 07:41:01
【问题描述】:

我正在使用单个 .babelrc 配置并在 webpack.config.client.jswebpack.config.server.js 中与 babel-loader 一起使用。

.babelrc:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "debug": false,
        "modules": false,
        "loose": true
      }
    ],
    "@babel/react"
  ],
  "env": {
    "development": {
      "plugins": ["react-hot-loader/babel"]
    },
    "production": {}
  }
}

问题是,react-hot-loader 找到了编译服务器代码的方法。 我做了一些研究,发现 babel 7 允许 configure overrides 处理这种情况。

我尝试实现它,但“env”部分永远不会被覆盖:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "debug": false,
        "modules": false,
        "loose": true
      }
    ],
    "@babel/react"
  ],
  "env": {
    "development": {
      "plugins": ["react-hot-loader/babel"]
    },
    "production": {}
  },
  "overrides": {
    "include": "./src/server/index.js", // ?
    "env": {
      "development": {
        "plugins": [] 
      }
    }
  }
}

感谢任何帮助

【问题讨论】:

  • 您是否在某处设置环境?如果是这样,如何。
  • 我在 webpack 和 server 中用 dotenv 设置了 env。环境正在工作。在开发中,react-hot-loader 插件位于客户端包和服务器包中。我正在寻找如何从服务器包中删除它。

标签: javascript webpack babeljs babel-loader


【解决方案1】:

Babel 对您的客户端/服务器差异一无所知。您的 "include": "./src/server/index.js", 检查会影响该单个文件,但不会影响您的概念服务器包。

实际上,有很多方法可以做到这一点,但我只列出几个开始。

一种方法是使用 env 并使用 4 而不是 2(production-clientproduction-serverdevelopment-clientdevelopment-server)。那你就可以了

"env": {
  "development-client": {
    "plugins": ["react-hot-loader/babel"]
  },
}

或者,您可以设置另一个环境变量,例如

cross-env NODE_ENV=development BUNDLE_NAME=server webpack --config webpack.config.server.js

并将您的配置重命名为.babelrc.js 文件,然后执行

module.exports = {
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "debug": false,
        "modules": false,
        "loose": true
      }
    ],
    "@babel/react"
  ],
  "env": {
    "development": {
      "plugins": 
        process.env.BUNDLE_NAME === "server" 
          ? [] 
          : ["react-hot-loader/babel"]
    },
    "production": {}
  },
};

【讨论】:

  • 谢谢,您的解决方案现在必须执行。不过最好不要引入 2/4 环境变量,因为我将客户端和服务器与单个变量 - NODE_ENV 一起构建。一旦我弄清楚如何使用覆盖,我会在这里更新。
  • 单个变量是什么意思?如果您扩展问题以详细说明为什么我的建议对您的情况不太理想,我可以用更多替代方案扩展我的答案。有一种方法可以使用 overrides,但它会使你的 Webpack 配置变得更加复杂,所以我避免了它。
  • 嗯,我的 webpack 设置很奇怪,我不想改变它,所以我寻找惰性解决方案。我对客户端和服务器使用 1 babel 配置,并且覆盖听起来很直接,不会弄乱 env 或调整 npm 任务。我最终转换为 .babelrc.js 并像你说的那样引入了 CLIENT=true 变量。并不是说这不是理想的解决方案。感谢您的宝贵时间
猜你喜欢
  • 2016-09-19
  • 2018-07-18
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多