if(process.env.NODE_ENV === 'production') 总是假的

Posted

技术标签:

【中文标题】if(process.env.NODE_ENV === \'production\') 总是假的【英文标题】:if(process.env.NODE_ENV === 'production') always falseif(process.env.NODE_ENV === 'production') 总是假的 【发布时间】:2017-01-24 14:05:45 【问题描述】:

当尝试通过在 package.json 上的脚本列表中运行 build 命令来构建 angular-webpack 应用程序时:

"scripts": 
    "test": "NODE_ENV=test karma start",
    "build":  "if exist dist rd /s /q dist && mkdir dist && set NODE_ENV=production && webpack && cp app/index.html dist/index.html",
    "start": "webpack-dev-server --content-base app"
  ,

这是控制台上的结果:

$ npm run build

    > webpack-ng-egg@1.0.0 build M:\Learning webpack\egghead.io - AngularJS - Angula
    r and Webpack for Modular Applications\webpack-ng-egg
    > if exist dist rd /s /q dist && mkdir dist && set NODE_ENV='production' && webp
    ack && cp app/index.html dist/index.html

    process.env.NODE_ENV  : 'production'
    process.env.NODE_ENV === 'production' ????  : false
    Hash: c3136b0024cbd48ccb2e
    Version: webpack 1.13.2
    Time: 3185ms
        Asset     Size  Chunks             Chunk Names
    bundle.js  1.23 MB       0  [emitted]  main
        + 10 hidden modules

这就是 webpack.config.js 文件的样子:

 var webpack = require('webpack');
    var path = require('path');
    var config = 
        context: path.resolve(__dirname, "app"),
        entry:'./app.js',
        output: 
            path : __dirname + '/app',
            filename:'bundle.js' // il ne sera pas généré dans le code, juste en mémoire
        ,
        plugins:[
            new webpack.DefinePlugin(
                ON_TEST:process.env.NODE_ENV === 'test'
            )
        ],
        module:
            loaders: [
            
              test: /\.js$/,
              exclude: /(node_modules|bower_components)/,
              loader: 'babel', // 'babel-loader' is also a legal name to reference
              query: 
                presets: ['es2015']
              
            ,
              test: /\.css$/,
               loader: "style-loader!css-loader",
               exclude: /(node_modules|bower_components)/
             ,
            
              test: /\.html$/,
              exclude: /(node_modules|bower_components)/,
              loader: 'raw', // 'babel-loader' is also a legal name to reference
            ,
              test: /\.styl$/,
               loader: 'style-loader!css-loader!stylus-loader',
               exclude: /(node_modules|bower_components)/
             
          ]
        ,
        devServer:
            //contentBase:path.join(__dirname, 'dist') // ceci est juste un exemple, si dist est l'endroit ou on aurait généré les fichiers
            inline:true, // les mises à jour de style ne sont plus affichés instantnément avec cette option donc j'ai ajouté le watch:true et çà marché!!!
            watch:true

        
        /*resolve: 
            extensions: ['', '.js', '.jsx', '.css']
        ,
        resolveLoader: 
            root: require('path').resolve(__dirname, "node_modules")
        */
    

    console.log("process.env.NODE_ENV  : " + process.env.NODE_ENV);
    console.log("process.env.NODE_ENV === 'production' ????  : " + (process.env.NODE_ENV == 'production'));
    //config.output.path = path.resolve(__dirname, "dist");
    //console.log("config.output.path  : " + config.output.path);


    if(process.env.NODE_ENV === 'production') 
        console.log("this is the prod env!!!!!!!!!!");
        config.output.path = path.resolve(__dirname, "dist");
    

    module.exports = config;

这里的问题是,在测试 (process.env.NODE_ENV === 'production') 时,即使它应该是,它也永远不会返回 true(请参阅上面控制台上记录的内容)。我试图改成一个简单的平等而不是严格的平等,但仍然总是假的。

【问题讨论】:

我不是 WebPack 方面的专家,但您从未将 NODE_ENV 设置为“生产”,不应该在配置中的某处完成吗? 在 package.json 的构建脚本上完成(设置 NODE_ENV=production) 如果你运行NODE_ENV=production npm run build会怎样? @Bardelman Jeez,对不起,第一次没发现 日志显示 NODE_ENV 已经设置,这一行 console.log("process.env.NODE_ENV : " + process.env.NODE_ENV);打印 process.env.NODE_ENV : 'production'。为什么还要重新设置?嗯,我试过你说的,但没有任何改变 【参考方案1】:

问题在于您将单引号存储在NODE_ENV 中,因此NODE_ENV 的值实际上是"'production'" 而不仅仅是"production"。这在您的调试输出中很明显。

set NODE_ENV='production' 更改为set NODE_ENV=production,它应该可以正常工作。

【讨论】:

感谢您的尝试,但我已经尝试过,现在又尝试了一次,但没有成功 你真的不应该更新你的问题来删除单引号,而是在你的问题末尾附加,说你也尝试删除单引号。 另外,我不明白删除单引号后它怎么可能不匹配。您应该 console.dir(process.env.NODE_ENV) 并显示无论如何显示的内容。 目前,我将 NODE_ENV 更改为数值而不是字符串,它可以工作。我不知道字符串有什么问题【参考方案2】:

我今天遇到了这个问题。

当我在npm scripts 中使用set NODE_ENV=production && something 时,NODE_ENV=production 变成production + " ",后面有一个空格。

所以,我们将productionproduction + " " 进行比较,这显然返回false。

package.json

scripts: 
    "start": "set NODE_ENV=development && webpack --watch --progress",
    "test": "set NODE_ENV=production && webpack"

比较

console.log(process.env.NODE_ENV.trim() === "production"); //True if ran test else false
console.log(process.env.NODE_ENV === "production"); //False
console.log(process.env.NODE_ENV.trim() === "development"); //True if ran start else false
console.log(process.env.NODE_ENV === "development"); //False

webpack.config.js 的工作示例

const webpack = require("webpack");
const dev = process.env.NODE_ENV.trim() !== "production";

module.exports = 
    entry: "./index.js",
    output: 
        path: "./",
        filename: "parse.js"
    ,
    module: 
        rules: [
            
                test: /\.js/,
                use: "babel-loader",
                exclude: /node_modules/
            
        ]
    ,
    plugins: dev ? [] : [
        new webpack.optimize.UglifyJsPlugin()
    ],
    target: "node"
;

所以,请使用trim()

【讨论】:

如果您在 Windows 上,您可以通过执行 cmd /C "set "MY_VAR=true" && ...myProgramContinues" 来解决额外空间问题,确保将集合和其余程序值括在双引号中 "" 或者如果你想在 Windows 上保持简洁,只需写 set "NODE_ENV=development" && <yourcommand>(双引号!)。如果在 package.json 中使用,它们可能必须像这样转义:\" ...今天遇到了这个..在试图弄清楚到底发生了什么之后严重救了我谢谢!【参考方案3】:

用途:

if ((process.env.NODE_ENV || '').trim() !== 'production') 

请注意上述解决方案,因为 NODE_ENV 可能是未定义的,并且会在未定义时抛出 running .trim()。

【讨论】:

感谢这个快速的 sn-p,现在为 React 使用与此相同的设置。只在 Windows 上体验过这个尾随空格,在 macOS 或 Linux 上没有问题。【参考方案4】:

我遇到了同样的问题,发现我的代码有空格。请对其进行 trim() 或编辑 package.json 中的代码。

【讨论】:

以上是关于if(process.env.NODE_ENV === 'production') 总是假的的主要内容,如果未能解决你的问题,请参考以下文章

process.env.NODE_ENV

BUG:<% if (process.env.NODE_ENV === ‘production‘) { %> <% }else { %> <% } %>

BUG:<% if (process.env.NODE_ENV === ‘production‘) { %> <% }else { %> <% } %>

process.env.NODE_ENV理解

理解webpack中的process.env.NODE_ENV

process.env.NODE_ENV的理解