Cross-env не изменяет переменную env при запуске yarn

#reactjs #webpack

#reactjs #webpack

Вопрос:

Я пытаюсь настроить среду так, чтобы, когда я выбираю запуск prod, он запускал настройки prod, а когда я выбираю запуск dev, он запускал сервер разработки, в настоящее время мои скрипты package.json выглядят следующим образом :

   "scripts": {
    "build:dev": "cross-env NODE_ENV=developement webpack",
    "build:prod": "cross-env NODE_ENV=production webpack",
    "start:dev": "cross-env NODE_ENV=developement webpack-dev-server ",
    "start:prod": "cross-env NODE_ENV=production webpack-dev-server "
  },
 

конфигурационный файл webpack:

 const webpack = require("webpack");
const path = require("path");
const dotenv = require("dotenv");

module.exports = {
  //Entry file for webpack.config
  entry: "./src/index.js",
  //Target specific use of project ie. nodejs project we use node value
  target: process.env.NODE_ENV === "dev" ? "node" : "web",
  //Dev server meant for hosting local server for developement
  devServer: {
    contentBase: path.resolve(__dirname, "public"),
    historyApiFallback: true,
    port: 8080,
  },
  //Modules are used to set rules to build specific file types
  module: {
    rules: [
      {
        test: /.jsx?$/,
        exclude: /node_modules/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: ["@babel/env", "@babel/react"],
              plugins: [
                "@babel/plugin-transform-runtime",
                "@babel/plugin-proposal-class-properties",
              ],
            },
          },
        ],
      },
      {
        test: /.(png|jpe?g|gif)$/i,
        loader: 'file-loader',
        options: {
          name: '[path][name].[ext]',
        },
      },
      {
        test: /.(css|sass|scss)$/,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              sourceMap: true,
              importLoaders: 2,
            },
          },
          {
            loader: "sass-loader",
            options: {
              sourceMap: true,
            },
          },
        ],
      },
      {
        test: /.svg$/,
        use: [
          {
            loader: "svg-inline-loader",
            options: {
              limit: 10000,
            },
          },
        ],
      },
      {
        test: /.tsx?$/,
        use: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
  externals: {
    // require("jquery") is external and available
    //  on the global var jQuery
    "jquery": "jQuery"
  },
  //Changes how modues are resolved
  resolve: {
    extensions: ["*", ".js", ".jsx", ".ts", ".tsx"],
  },
  //Output is setup to serve the bundle.js file to be served to web browser
  output: {
    path: path.resolve(__dirname, "public"),
    filename: "bundle.js",
    publicPath: "/",
  },
  //Prevent bundling of certain packages
  externals: {
    "react-native": true,
  },
  //A javascript object used to do various extra things for webpack
  plugins: [
    new webpack.DefinePlugin({
      "process.env": JSON.stringify(dotenv.config().parsed),
    }),
  ],
};

 

и я это делаю:

 console.log(process.env.NODE_ENV)
 

внутри моей домашней страницы jsx, но каждый раз, когда я запускаю ее, даже когда я запускаю yarn: запускаю консоль.регистрирует разработку, а не производство, почему cross-env не может успешно изменить NODE_ENV на production, когда я запускаю это?

Комментарии:

1. Можете ли вы предоставить общий доступ к файлу конфигурации webpack?

2. @tmhao2005 просто добавил его, извините за задержку

Ответ №1:

Чтобы скопировать переменную env в webpack , вы должны использовать webpack. DefinePlugin то, что вы сделали в своем файле конфигурации, который выглядит так, как будто вы пытаетесь скопировать все вещи в webpack.

В любом случае, если вы хотите использовать значение from cross-env , вам придется сделать то же самое с помощью DefinePlugin плагина, но ввести конкретное значение NODE_ENV следующим образом:

webpack.config.js

 {
  // ...
  plugins: [
    // ...
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
    }),
  ],
}