将 webpack 配置导出为函数失败

sma*_*333 2 dev-to-production webpack-4

我正在尝试处理 webpack 配置中的开发和生产环境变量(请参阅https://webpack.js.org/guides/product/),但它失败了

WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration should be an object.
Run Code Online (Sandbox Code Playgroud)

包.json

WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration should be an object.
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

        {
          "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1",
            "build": "./node_modules/.bin/webpack",
            "start": "npm run build && node server.js"
          },
          "devDependencies": {
             //...
             "webpack": "^4.20.2",
             "webpack-cli": "^3.1.2",
             "webpack-dev-middleware": "^3.4.0",
             "webpack-hot-middleware": "^2.24.2"
          }
       }
Run Code Online (Sandbox Code Playgroud)

此导出按预期工作,没有错误或警告

const path = require('path'),
    webpack = require('webpack'),
    HtmlWebpackPlugin = require('html-webpack-plugin');

let config = {
    entry: {
        app: [
            './src/app/App.tsx', 'webpack-hot-middleware/client'
        ],
        vendor: ['react', 'react-dom']
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'js/[name].bundle.js'
    },
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这失败了

module.exports = config; // everything is fine
Run Code Online (Sandbox Code Playgroud)

这里有一个类似但未回答的问题:webpack base config as a function does not work

这是一种非常神秘的行为,如果有人能提供帮助,我们将不胜感激!

sma*_*333 6

嗯,它正在工作。我没有注意到错误发生在我的代码的完全不同的位置。

我正在用 webpack 和express 做一个关于 HMR 的教程。正是快速设置中的这行代码导致了麻烦:

服务器.js

const webpackConfig = require('./webpack.config');
const compiler = webpack(webpackConfig);
//...
app.use(
    require('webpack-dev-middleware')(compiler, {
        noInfo: true,
        publicPath: webpackConfig.output.publicPath
    })
);
Run Code Online (Sandbox Code Playgroud)

webpackConfig 仅获取一个函数而没有被调用,因此它不会返回一个对象。因此,只需添加括号即可使其工作。

const webpackConfig = require('./webpack.config')();
//..
Run Code Online (Sandbox Code Playgroud)