【问题标题】:How to Set a QA Mode Webpack/Webpack Serve?如何设置 QA Mode Webpack/Webpack Serve?
【发布时间】:2018-08-11 17:30:21
【问题描述】:

我有一个

webpack.common.js webpack.dev.js webpack.prod.js webpack.qa.js

以及我设置的 3 个环境中的每一个都设置了模式

const path = require("path");
const merge = require("webpack-merge");
const convert = require("koa-connect");
const proxy = require("http-proxy-middleware");
const historyApiFallback = require("koa2-connect-history-api-fallback");

const common = require("./webpack.common.js");

module.exports = merge(common, {
  // Provides process.env.NODE_ENV with value development.
  // Enables NamedChunksPlugin and NamedModulesPlugin.
  mode: "QA",
  devtool: "inline-source-map",
  // configure `webpack-serve` options here
  serve: {
    // The path, or array of paths, from which static content will be served.
    // Default: process.cwd()
    // see https://github.com/webpack-contrib/webpack-serve#options
    content: path.resolve(__dirname, "dist"),
    add: (app, middleware, options) => {
      // SPA are usually served through index.html so when the user refresh from another
      // location say /about, the server will fail to GET anything from /about. We use
      // HTML5 History API to change the requested location to the index we specified
      app.use(historyApiFallback());
      app.use(
        convert(
          // Although we are using HTML History API to redirect any sub-directory requests to index.html,
          // the server is still requesting resources like JavaScript in relative paths,
          // for example http://localhost:8080/users/main.js, therefore we need proxy to
          // redirect all non-html sub-directory requests back to base path too
          proxy(
            // if pathname matches RegEx and is GET
            (pathname, req) => pathname.match("/.*/") && req.method === "GET",
            {
              // options.target, required
              target: "http://localhost:8080",
              pathRewrite: {
                "^/.*/": "/" // rewrite back to base path
              }
            }
          )
        )
      );
    }
  },
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: ["style-loader", "css-loader", "sass-loader"]
      }
    ]
  }
});

然后在我的代码中,我通过process.env.NODE_ENV 引用该模式,但是当我运行我的 QA 配置时,我得到了

Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration.mode should be one of these:
   "development" | "production" | "none"
   -> Enable production optimizations or development hints.

我怎样才能设置更多这些模式?

我正在使用 webpack 和 webpack serve

编辑

在我的 package.json 中

  "scripts": {
    "dev": "webpack-serve --config webpack.dev.js --open",
    "prod": "webpack -p --config webpack.prod.js",
    "qa": "cross-env NODE_ENV=QA webpack --config webpack.prod.js"
  },

然后在我的一个文件中

  console.log("process.env.NODE_ENV",process.env.NODE_ENV)

【问题讨论】:

    标签: javascript webpack


    【解决方案1】:

    你不能设置!只有这 3 种模式可用。这些模式不需要用于不同的环境,它们只是 webpack 发现将某些默认值应用于基于 env 的构建的一种方式。如果您认为您的问答应该(实际上应该)表现得像 prod,那就把它当作 prod。

    TL;TR:mode 与 env 无关,它们只是将某些默认值应用于您的构建的一种方式。


    要访问前端代码上的process.env.NODE_ENV,您必须使用DefinePlugin

    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
    });
    

    【讨论】:

    • 嗯,我正在使用模式将我的基本 URL 更改为我的 API 服务器,这在 Dev、QA 和 prod 中有什么不同。我应该改用什么?
    • process.env.NODE_ENV
    • 在哪里设置?
    • 我检查了我的代码,并且我已经在使用 process.env.NODE_ENV 但它不是由“模式”设置的,如果是这样,那么我无法设置 QA 标志。
    • 是的,不是模式设置的。您必须在运行脚本时添加它。你最好使用 cross-env:"build:qa": "cross-env NODE_ENV=Q&A webpack"。类似的东西。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-10-17
    • 2018-12-10
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多