#webpack #webpack-dev-server #webpack-4
#webpack #webpack-dev-server #webpack-4
Вопрос:
Для создания нового проекта я использую webpack 4.29.6
и webpack-dev-server 3.2.1
Now в моем конфигурационном файле. Я хочу добавить HotModuleReplacementPlugin()
, но он выдает мне ошибку при выполнении либо сборки при запуске npm, либо разработки при запуске npm.
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
- configuration.plugins[3] should be one of these:
object { apply, … } | function
-> Plugin of type object or instanceof Function
Details:
* configuration.plugins[3] should be an object.
-> Plugin instance
* configuration.plugins[3] should be an instance of function
-> Function acting as plugin
Кто-нибудь может мне помочь в этом? Обратите внимание, что плагин применяется только в производственном режиме.
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin(
Object.assign({}, {
inject: true,
template: publicDir '/index.html',
},
isProduction ? {
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
} : undefined)),
isProduction amp;amp;
new MiniCssExtractPlugin({
filename: 'styles/[name].[contenthash:8].css',
chunkFilename: 'styles/[name].[contenthash:8].chunk.css',
}),
isDevelopment amp;amp; new webpack.HotModuleReplacementPlugin(),
],
Ответ №1:
Если isProduction
или isDevelopment
значение неверно, вы передаете их значение в качестве плагина.
Вы можете попробовать что-то вроде этого:
const PLUGINS = [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin(
Object.assign({}, {
inject: true,
template: publicDir '/index.html',
},
isProduction ? {
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
} : undefined
)
),
];
if (isProduction) PLUGINS.push(
new MiniCssExtractPlugin({
filename: 'styles/[name].[contenthash:8].css',
chunkFilename: 'styles/[name].[contenthash:8].chunk.css',
})
);
if (isDevelopment) PLUGINS.push(
new webpack.HotModuleReplacementPlugin()
);
....
plugins: PLUGINS,
Комментарии:
1. ваш подход верен и помогает мне! Спасибо!! Но я не понимаю, почему он работает с конфигурацией create-react-app по умолчанию, а с моей стороны — нет…
Ответ №2:
Благодаря совету @UjinT34, если условия в моих плагинах ложны, я внезапно добавляю в массив не плагин, а логическое значение. Вот почему в конце массива плагинов мне просто нужно было отфильтровать логические значения, вот так:
plugins: [
...
isDevelopment amp;amp; new webpack.HotModuleReplacementPlugin(),
].filter(Boolean),
...