Сначала я должен пожаловаться на webpack5.x.Я буду плакать, когда наступлю на яму.Маленькое резюме не является уважением~
1. webpack-dev-server
Не удалось запустить проект
Решение: обратите вниманиеwebpack-dev-server
Версия
// package.json
{
"scripts": {
// webpack-dev-server 4.x
"serve": "webpack-dev-server --config webpack.dev.js"
// webpack-dev-server 5.x
"serve": "webpack server --config webpack.dev.js"
}
}
2. Сообщается об ошибке после запуска проекта
Error: getaddrinfo ENOTFOUND localhost at GetAddrInfoReqWrap.onlookup [as oncomplete]
Решение: необходимо включить 127.0.0.1 локального хоста.
3. devtool
module.exports = {
// webpack 4.x
devtool: 'cheap-eval-module-source-map',
// webpack 5.x
devtool: 'eval-cheap-module-source-map'
}
4. Включитеhot: true
Но горячее обновление не работает
Устранить необходимость совместимости с webpack5.x
module.exports = {
target: 'web', // webpack5.x 加上之后热更新才有效果
}
Также есть проблема, на которую следует обратить внимание: если вы используетеmini-css-extract-plugin
плагины (вводить стили в виде ссылки вместо внедрения тега стиля), горячее обновление стилей работать не будет.
Решение: Необходимо судить о форме внедрения стиля в режиме разработки, в противном случае используйтеlink
форма цитирования
// webpack.common.js
// 是否开发者模式
const devMode = process.env.NODE_ENV !== 'production'
module.exports = {
module: {
rules: [
{
test: /\.css$/,
exclude: /node_modules/,
use: [
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
'css-loader'
]
},
{
test: /\.less$/,
exclude: /node_modules/,
use: [
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
'css-loader',
'less-loader'
] // 解析 less
},
]
}
}
5. ошибка html-webpack-плагина
DeprecationWarning: Compilation.assets will be frozen in future, all modifications are deprecated.
Решение: должна быть совместима с webpack5.x
yarn add html-webpack-plugin@next --dev
6. Используйтеhtml-webpack-plugin
сообщить об ошибке
ERROR in Conflict: Multiple assets emit different content to the same filename index.html
Инструкции: использоватьhtml-webpack-plugin
После этого будет сгенерирован файл index.html, и в это время будет сообщено об ошибке
решить:
① Удалите файл public/index.html.
② Поместите файлы в public/index.html в src и повторно укажите путь к шаблону как src/index.html.
③ Используйте свойство templateContent, чтобы определить свой собственный HTML-шаблон.
// webpack.common.js
const { templateContent } = require('./template')
module.exports = {
plugins: [
// webpack 5.x 报 有重复文件错误解决方法
new HtmlWebpackPlugin({
url: './',
title: 'My Webpack',
filename: 'index.html'
// template: './public/index.html', // 方法1: 去掉此文件
// template: './src/index.html', // 方法2:可将模板文件放入其他路径
templateContent: ({ htmlWebpackPlugin }) => templateContent(htmlWebpackPlugin), // 方法3 使用 templateContent 属性自己写
}),
],
}
// template/index.js
// html-webpack-plugin 属于templateContent 属性形式的模板文件
function templateContent (htmlWebpackPlugin) {
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="${htmlWebpackPlugin.options.url}favicon.ico">
<title>${htmlWebpackPlugin.options.title}</title>
</head>
<body>
<noscript>
<strong>We're sorry but ${htmlWebpackPlugin.options.title} doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>`
}
module.exports = { templateContent }
7. Используйтеwebpack-merge
сообщить об ошибке
TypeError: merge is not a function
webpack-mergeпри условии
merge
Функция для объединения массивов и объединения объектов для создания новых объектов
Решение: Совместимость с webpack5.x
// webpack 4.x
const merge = require('webpack-merge')
// webpack 5.x
const { merge } = require('webpack-merge')
// 接下来可以进行合并
const common = require('./webpack.common')
module.exports = merge(common, {
... // 配置们
}
8. Используйтеcopy-webpack-plugin
сообщить об ошибке
ValidationError: Invalid options object. Copy Plugin has been initialized using an options object that does not match the API schema.
Решение: Совместимость с webpack5.x
module.exports = {
plugins: [
// webpack 4.x
new CopyWebpackPlugin(['public'])
// webpack 5.x
new CopyWebpackPlugin({
patterns: [
{ from: 'public', to: 'public' }
]
})
]
}
9. Используйтеoptimize-css-assets-webpack-plugin
Будет следующее предупреждение, но оно не повлияет на упаковку
[DEP_WEBPACK_COMPILATION_OPTIMIZE_CHUNK_ASSETS] DeprecationWarning: optimizeChunkAssets is deprecated (use Compilation.hook.processAssets instead and use one of Compilation.PROCESS_ASSETS_STAGE_* as stage option)(Use node --trace-deprecation ... to show where the warning was created)
Решение: для проблемы с webpack 5.x вы можете рассмотреть возможность замены плагина (официальный план состоит в том, чтобы объявить его устаревшим).
optimize-css-assets-webpack-plugin/issues134
yarn add css-assets-webpack-plugin --dev
10. Установкаimagemin-webpack-plugin
Ошибка зависимости, подсказкаautoreconf: command not found
решить:
Если в macOS не установлен brew, его необходимо сначала установить (вне стены)
официальное пивоВы можете увидеть команду установки [установка очень медленная, вам нужно терпеливо ждать...]
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
После установки используйте brew для установки autoreconf
brew install autoconf automake libtool
Затем вы можете продолжить установку
Если что-то не так с текстом, прошу поправить и покритиковать~