Основные концепции веб-пакета:
- Вход: вход
- Модуль: модуль, все в веб-пакете является модулем
- Чанк: кодовая база, фрагмент состоит из более чем десяти модулей, используемых для слияния и разделения кода.
- Загрузчик: преобразователь модулей, используемый для преобразования исходного содержимого модуля в новое содержимое по мере необходимости.
- Плагин: плагин расширения, который внедряет логику расширения в определенное время в процессе сборки веб-пакета, чтобы изменить результат сборки или сделать то, что вы хотите.
- Выход: результат вывода
процесс вебпака:
После запуска веб-пакета он будет рекурсивно анализировать все модули, от которых зависит запись, из модуля, настроенного в записи.Каждый раз, когда модуль будет найден, он найдет соответствующие правила преобразования в соответствии с настроенным загрузчиком, преобразует модуль и затем разберите текущий модуль. Зависимые модули. Эти модули сгруппированы в единицы Записи. Запись и все ее зависимые модули сгруппированы в группу, которая является Чанком. Желательно, чтобы Webpack преобразовывал все фрагменты в файл. В течение всего процесса Webpack будет выполнять логику, определенную в плагине, в нужное время.
Давайте начнем с нуля, чтобы настроить конфигурацию веб-пакета, которая поддерживает упаковочные изображения, синтаксис CSS, LESS, SASS, ES6/ES7 и JSX, а также сжимает код.
Другие статьи можно нажать: GitHub.com/Иветт Л.А. Ю/Б…
1. Минимальная конфигурация вебпака
Сначала инициализируйте npm и установите зависимости webpack:
npm init -y
npm install --save-dev webpack webpack-cli
Настройте файл webpack.config.js следующим образом:
const path = require('path');
module.exports = {
entry: path.resolve(__dirname, 'src/index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/'
}
}
Примечание. Адрес cdn настраивается, когда publicPath подключается к сети.
Используйте команду для упаковки:
webpack --mode production
Его также можно настроить в поле сценариев в package.json.
Файл входа — src/index.js, который упаковывается и выводится в dist/bundle.js.
2. Используйте HTML-шаблон
html-webpack-plugin может указывать файлы шаблонов шаблонов, которые будут генерировать html-файлы в выходном каталоге и импортировать упакованные файлы js.
Зависимости установки:
npm install --save-dev html-webpack-plugin
Добавьте конфигурацию плагинов в webpack.config.js:
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
//...other code
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, 'src/index.html')
})
]
}
HtmlWebpackPlugin имеет некоторые другие параметры, такие как title (заголовок html), minify (сжимать ли), filename (имя файла html, сгенерированного в dist) и т. д.
3. Настройте webpack-dev-сервер
webpack-dev-server предоставляет простой веб-сервер с возможностью горячего обновления в режиме реального времени.
Зависимости установки:
npm install --save-dev webpack-dev-server
Добавьте конфигурацию devServer в webpack.config.js:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
//...other code
devServer: {
contentBase: './dist',
port: '8080',
host: 'localhost'
}
}
В поле scripts package.json добавьте:
webpack-dev-server --mode development
После этого мы можем запускать сервис через npm run dev.
Для получения дополнительной информации о webpack-dev-server посетите:Веб-пакет Просто .org/config как у ATI...
4. Поддержка загрузки файлов css
Используя разные загрузчики стилей и css-загрузчики, файлы css можно преобразовать в типы файлов JS.
Зависимости установки:
npm install --save-dev style-loader css-loader
Добавьте конфигурацию загрузчика в webpack.config.js.
module.exports = {
//other code
module: {
rules: [
{
test: /\.css/,
use: ['style-loader', 'css-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
}
]
}
}
Загрузчик можно настроить со следующими параметрами:
- test: регулярное выражение, соответствующее расширению обрабатываемого файла
- использовать: имя загрузчика
- include/exclude: Вручную укажите папки, которые должны быть обработаны, или закройте папки, которые не нужно обрабатывать.
- запрос: предоставляет дополнительные параметры настройки для загрузчика
Если вам нужно передать параметры загрузчику, вы можете использовать метод use+loader, например:
module.exports = {
//other code
module: {
rules: [
{
use: [{
loader: 'style-loader',
options: {
insertAt: 'top'
}
},
'css-loader'
],
//....
}
]
}
}
5. Поддержка загрузки изображений
- загрузчик файлов: решить проблему импорта путей к изображениям в CSS и других файлах.
- url-loader: Когда изображение меньше лимита, изображение будет закодировано в Base64.Когда параметр больше лимита, для копирования будет использоваться файловый загрузчик.
Если вы хотите, чтобы изображение хранилось в отдельной директории, вам нужно указать outputPath
Зависимости установки:
npm install --save-dev url-loader file-loader
Добавьте конфигурацию загрузчика в webpack.config.js (в массиве module.rules).
module.exports = {
//other code
module: {
rules: [
{
test: /\.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192,
outputPath: 'images'
}
}
]
}
]
}
}
6. Поддержка компиляции меньше и дерзче
Некоторые фронтенд-коллеги могут привыкнуть использовать less или sass для написания CSS, поэтому их тоже нужно настраивать в webpack.
Установите соответствующие зависимости:
npm install --save-dev less less-loader
npm install --save-dev node-sass sass-loader
Добавьте конфигурацию загрузчика в webpack.config.js (в массиве module.rules).
module.exports = {
//other code
module: {
rules: [
{
test: /\.less/,
use: ['style-loader', 'css-loader', 'less-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.scss/,
use: ['style-loader', 'css-loader', 'sass-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
}
]
}
}
7. Поддержка экранирования ES6/ES7/JSX
Экранирование ES6/ES7/JSX требует зависимостей Babel и поддерживает декораторы.
npm install --save-dev @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/plugin-proposal-decorators @babel/plugin-proposal-object-rest-spread
Добавьте конфигурацию загрузчика в webpack.config.js (в массиве module.rules).
module.exports = {
//other code
module: {
rules: [
{
test: /\.jsx?$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/react'],
plugins: [
["@babel/plugin-proposal-decorators", { "legacy": true }]
]
}
}
],
include: path.resolve(__dirname, 'src'),
exclude: /node_modules/
},
]
}
}
8. Сжимайте JS-файлы
Зависимости установки:
npm install --save-dev uglifyjs-webpack-plugin
Добавьте конфигурацию оптимизации в webpack.config.js
const UglifyWebpackPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
//other code
optimization: {
minimizer: [
new UglifyWebpackPlugin({
parallel: 4
})
]
}
}
9. Отдельный CSS (если файл CSS большой)
Поскольку загрузка CSS и JS может выполняться параллельно, когда HTML-файл большой, CSS можно извлечь и загрузить отдельно.
npm install --save-dev mini-css-extract-plugin
Добавьте конфигурацию плагинов в webpack.config.js и измените 'style-loader' на { loader: MiniCssExtractPlugin.loader}.
CSS упаковывается в отдельный каталог, затем настраивается имя файла.
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
//other code
module: {
rules: [
{
test: /\.css/,
use: [{ loader: MiniCssExtractPlugin.loader}, 'css-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.less/,
use: [{ loader: MiniCssExtractPlugin.loader }, 'css-loader', 'less-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.scss/,
use: [{ loader: MiniCssExtractPlugin.loader }, 'css-loader', 'sass-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
]
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].css'
})
]
}
10. Сжимайте файлы CSS
Зависимости установки:
npm install --save-dev optimize-css-assets-webpack-plugin
Добавьте конфигурацию в Оптимизацию в WebPack.config.js
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = {
//other code
optimization: {
minimizer: [
new OptimizeCssAssetsWebpackPlugin()
]
}
}
11. Очистите выходной каталог перед упаковкой
npm install --save-dev clean-webpack-plugin
Добавьте конфигурацию плагинов в webpack.config.js
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
//other code
plugins: [
new CleanWebpackPlugin()
]
}
До сих пор конфигурация веб-пакета в основном удовлетворяла потребности.
Завершите файлы webpack.config.js и package.json.
файл webpack.config.js:
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
const UglifyWebpackPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = {
entry: path.resolve(__dirname, 'src/index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/'
},
devServer: {
contentBase: './dist',
port: '8080',
host: 'localhost'
},
module: {
rules: [
{
test: /\.jsx?$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/react'],
plugins: [
["@babel/plugin-proposal-decorators", { "legacy": true }]
]
}
}
],
include: path.resolve(__dirname, 'src'),
exclude: /node_modules/
},
{
test: /\.css/,
use: [{ loader: MiniCssExtractPlugin.loader}, 'css-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.less/,
use: [{ loader: MiniCssExtractPlugin.loader }, 'css-loader', 'less-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.scss/,
use: [{ loader: MiniCssExtractPlugin.loader }, 'css-loader', 'sass-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
outputPath: 'images'
}
}
]
}
]
},
optimization: {
minimizer: [
new UglifyWebpackPlugin({
parallel: 4
}),
new OptimizeCssAssetsWebpackPlugin()
]
},
plugins: [
new htmlWebpackPlugin({
template: path.resolve(__dirname, 'src/index.html'),
}),
new MiniCssExtractPlugin({
filename: 'css/[name].css'
}),
new CleanWebpackPlugin()
]
}
файл package.json:
{
"name": "webpk",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --mode production",
"dev": "webpack-dev-server --mode development"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.4.0",
"@babel/plugin-proposal-decorators": "^7.4.0",
"@babel/plugin-proposal-object-rest-spread": "^7.4.0",
"@babel/preset-env": "^7.4.1",
"@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.5",
"clean-webpack-plugin": "^2.0.1",
"css-loader": "^2.1.1",
"file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"mini-css-extract-plugin": "^0.5.0",
"node-sass": "^4.11.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"uglifyjs-webpack-plugin": "^2.1.2",
"url-loader": "^1.1.2",
"webpack": "^4.29.6",
"webpack-cli": "^3.3.0",
"webpack-dev-server": "^3.2.1"
},
"dependencies": {
"react": "^16.8.4",
"react-dom": "^16.8.4",
"react-redux": "^6.0.1",
"redux": "^4.0.1"
}
}
Для получения дополнительных параметров загрузчика и плагина, пожалуйста, обратитесь к:www.webpackjs.com/loaders/ www.webpackjs.com/plugins/
Если у вас есть другие требования к конфигурации веб-пакета, оставьте сообщение~
Спасибо, что потратили свое драгоценное время на чтение этой статьи. Если эта статья дала вам небольшую помощь или вдохновение, не скупитесь на лайки и звезды. Это, безусловно, самая большая мотивация для меня двигаться вперед.GitHub.com/Иветт Л.А. Ю/Б…