【问题标题】:webpack --optimize-minimize vs -pwebpack --optimize-minimize vs -p
【发布时间】:2018-10-16 03:52:27
【问题描述】:

我正在我的 react 应用程序中进行服务器端渲染。在应用程序内部,我有一些图片,所以我在 webpack-config 中为它们提供了加载器

      {
        test: /\.(gif|png|jpg)$/,
        loader: 'file-loader?name=assets/img/[name].[hash].[ext]',
      },

如果我以这种方式运行我的代码

cross-env NODE_ENV=production webpack --optimize-minimize --config webpack.config.prod.js,

我收到一个错误

Warning: Prop `src` did not match. Server: "assets/img/profilna.1b1788096b2a10afe508dff672e50072.jpg" Client: "/assets/img/profilna.1b1788096b2a10afe508dff672e50072.jpg"

但是如果我这样运行它

cross-env NODE_ENV=production webpack --p --config webpack.config.prod.js,

一切都很好,功能完全符合我的要求。

这是为什么呢?

我读到-p 相当于

webpack --optimize-minimize --define process.env.NODE_ENV="'production'"

由于我已经在设置生产环境,我不需要 --define

【问题讨论】:

    标签: reactjs webpack bundle production


    【解决方案1】:
    cross-env NODE_ENV=production
    

    这样,您正在设置 Node process.env.NODE_ENV,但在应用程序内没有“被传递”或使用 - 在捆绑时。基本上,您需要为应用程序创建全局变量并将 NODE_ENV 设置为 webpack 所需的值。这就是...

    --define process.env.NODE_ENV="'production'"

    ...确实。它将使用Webpack DefinePlugin 设置全局process.env.NODE_ENV 以在捆绑应用程序时使用。

    我知道这听起来有点不清楚,我自己也很难理解,但希望文档能把它弄清楚。

    从技术上讲,NODE_ENV 是 Node.js 的系统环境变量 暴露到正在运行的脚本中。它按惯例用于确定 服务器工具、构建脚本和客户端的 dev-vs-prod 行为 图书馆。与预期相反,未设置 process.env.NODE_ENV 在构建脚本中“生产”

    有关示例,请参阅 "Specifying the environment"

    【讨论】:

    • 我很难理解这一点。例如,如果我使用 --optimize-minimize 以我的方式运行代码并将console.log(process.env.NODE_ENV) 放在我的 webpack.config.js 中,我会得到“生产”这意味着文档中的这一部分是不正确的,他们给出的示例为我工作。 '与预期相反,在构建脚本 webpack.config.js 中 process.env.NODE_ENV 未设置为“生产”。因此,像 process.env.NODE_ENV === 'production' 这样的条件? '[name].[hash].bundle.js' : webpack 配置中的 '[name].bundle.js' 无法按预期工作。'
    • 如果您使用 cross-env 设置它,它将无法在构建中工作,因此您无法在组件内部访问它。在代码中实现它的唯一方法是使用 DefinePlugin 显式定义它。
    • 但我可以达到它,因为我的代码的下一部分是这样的,我检查生产环境并使用 .json 文件,具体取决于 NODE_ENV 是生产还是开发,在我的情况下它使用 app .prod.json。 const isProd = process.env.NODE_ENV === 'production'; const prodConf = isProd ? require('../../../conf/app.prod.json') : {}
    • 它是一个-p,它设置生产模式,它还将process.env.NODE_ENV 设置为production。如果您要设置 process.env.SOMETHING=something,那么如果没有 DefinePlugin,您将无法在代码中访问它
    • 但在我的示例中,我没有使用-p,而是使用了--optimize-minimize 和cross-env NODE_ENV=production,那么我是如何达到它的呢?
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 2019-09-01
    • 2020-06-28
    • 1970-01-01
    • 2022-06-23
    • 2017-07-06
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多