Передача значения ENV узла с помощью Webpack через DefinePlugin
я пытаюсь ввести NODE_ENV значение в мой код с помощью webpack via DefinePlugin. Я проверил, более или менее идентичный вопрос, но все еще не могу заставить его работать.
в частности, вот моя установка.
на package.json:
"scripts": {
    "build": "rimraf dist && cross-env NODE_ENV=production webpack",
    "dev": "cross-env NODE_ENV=development && node webpack-dev-server.js"
},
на webpack.config.js:
"use strict";
/* requiring the modules */
const webpack = require("webpack");
const path = require("path");
/* defining the source and distribution paths */
const DIST_DIR = path.resolve(__dirname, "dist");
const SRC_DIR = path.resolve(__dirname, "src");
const DEVELOPMENT = process.env.NODE_ENV === "development";
const PRODUCTION = process.env.NODE_ENV === "production";
// const PRODUCTION = !!process.argv.find((element) => element === '--production');
// const DEVELOPMENT = !!process.argv.find((element) => element === '--development');
/* defining the entries*/
const productionEntries = {
    home: SRC_DIR + "/_home.js",
    about: SRC_DIR + "/_about.js",
};
const developmentEntries = Object.assign({}, productionEntries, {webpackDevServer: ["webpack/hot/dev-server", "webpack-dev-server/client?http://localhost:8080"]});
const entries = PRODUCTION ? productionEntries : developmentEntries;
/* defining the output */
const output = {
    filename: "[name].js",
    path: DIST_DIR,
    publicPath: "/dist/",
    pathinfo: true,
    library: "MyLibraryName"
};
/* defining the plugins */
const plugins = PRODUCTION
    ? [
        new webpack.optimize.OccurrenceOrderPlugin(),
        new webpack.optimize.AggressiveMergingPlugin(),
        new webpack.optimize.UglifyJsPlugin({comments: false}),
    ]
    :  [
        new webpack.HotModuleReplacementPlugin(),
    ];
plugins.push(
    new webpack.optimize.CommonsChunkPlugin({name: "vendor.bundle", minChunks: 2}),
    new webpack.DefinePlugin({
        PRODUCTION: PRODUCTION,
        DEVELOPMENT: DEVELOPMENT,
    })
);
/* defining the modules -> rules -> loaders */
const modules = {
    rules:
        [
            {
                test: /.(js|jsx)$/,
                include: SRC_DIR,
                exclude: /node_modules/,
                loader: "babel-loader",
                options:
                    {
                        presets: ["react", ["es2015", {modules: false}], "stage-2"]
                    }
            }
        ]
};
/* building the webpack config object */
const config = {
    entry: entries,
    output: output,
    module: modules,
    plugins: plugins,
    devtool: "source-map",
    target: "web",
    stats: "verbose"
};
/* exporting the webpack config */
module.exports = config;
и, наконец, в _about.js у меня есть следующие:
// output after using: npm run dev
console.log(process.env.NODE_ENV); // prints undefined
console.log(PRODUCTION); // prints false
console.log(DEVELOPMENT); // prints false
if (module.hot) {
    module.hot.accept();
}
проблема:
- С 
npm run devработает успешно (т. е. сервер запускается, а плагины и записи выбраны adequtlly), я не понимаю, почему вывод дляconsole.log(DEVELOPMENT)isfalseи почемуconsole.log(process.env.NODE_ENV)печатьundefined. - в условных проверках, выполняемых внутри 
webpack.config.js, theNODE_ENVзначение выбрано правильно, иначе Плагины, записи и сервер разработки не будут работать. Однако, я не могу передать это значение до_about.jsиспользуяDefinePlugin. - я тоже пробовал 
EnvironmentPlugin, такой же результат. 
у меня вопрос: не могли бы вы, пожалуйста, помочь мне понять где все?
Edit 1:
я попробовал следующий без каких-либо улучшений:
new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(PRODUCTION),
    DEVELOPMENT: JSON.stringify(DEVELOPMENT)
})
я node.js on Windows 10.
Edit 2:
пробовал:
const DEVELOPMENT = process.env.NODE_ENV === "development";
const PRODUCTION = process.env.NODE_ENV === "production";
// with this inside plugins:
new webpack.DefinePlugin({
    "process.env.PRODUCTION": JSON.stringify(PRODUCTION),
    "process.env.DEVELOPMENT": JSON.stringify(DEVELOPMENT)
})
и (используя npm run dev) Я получаю следующее вывод:
console.log(process.env.PRODUCTION); // false
console.log(process.env.DEVELOPMENT); // false
console.log(process.env.NODE_ENV); // undefined
console.log(PRODUCTION); // Uncaught ReferenceError: PRODUCTION is not defined
console.log(DEVELOPMENT); // Uncaught ReferenceError: DEVELOPMENT is not defined
к сожалению, никаких улучшений.
Edit 3:
мой devDependencies являются:
"devDependencies": {
    "babel-core": "^6.21.0",
    "babel-loader": "^6.2.10",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "babel-preset-stage-2": "^6.18.0",
    "cross-env": "^3.1.4",
    "rimraf": "^2.5.4",
    "webpack": "^2.2.0-rc.4",
    "webpack-dev-server": "^2.2.0-rc.0"
}
Edit 4: (решено)
@Cleiton заметил проблему. Это было связано с тем, как npm скрипты создаются с помощью cross-env. См. полный ответ ниже.
2 ответов
проблема в том, что вы используете cross-env неправильно. Он изменяет только переменные env для своего контекста, поэтому, когда вы используете '& & ' для запуска webpack, он уже ушел, и webpack ничего не видит.
поэтому вы должны написать
"scripts": {
    "build": "rimraf dist && cross-env NODE_ENV=production webpack",
    "dev": "cross-env NODE_ENV=development node webpack-dev-server.js"
},
обратите внимание, что вы написали право на скрипт "build".
другой вопрос об этом, если вы хотите сделать ссылки на "процесс.env.PRODUCTION " внутри вашей базы кода Вы должны написать:
   new webpack.DefinePlugin({
        "process.env.PRODUCTION": JSON.stringify(PRODUCTION),
        "proccess.env.DEVELOPMENT": JSON.stringify(DEVELOPMENT),
    });
DefinePlugin ожидает строки, поэтому вам нужно JSON.stringify() любые переданные в него значения.
new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(PRODUCTION),
    DEVELOPMENT: JSON.stringify(DEVELOPMENT)
})