- Установка Node.js (+ npm)
- [ при проблеме с самоподписанными сертификатами ]
# npm set strict-ssl false
- # npm init
создается package.json
- # npm i webpack webpack-cli --save-dev
- Добавить в package.json
"scripts": {
"dev": "webpack --mode development"
}
- [ если ошибка: ERROR in Entry module not found: Error: Can’t resolve './src' in '...' ]
необходимо создать в корне проекта папку src с файлом index.js
- Теперь возможен запуск:
npm run dev
будет создана пака с файлом: ./dist/main.js
- Общепринятые режимы работы:
"scripts": {
"dev": "webpack --mode development",
"build": "webpack --mode production",
"watch": "webpack --mode development --watch"
"server": "webpack-dev-server --mode development --open"
}
Add-ons:
- path (не требует установки) - объект Node.js для кроссплатформенной и удобной работы с путями файловой системы, в том числе, в модуле конфигурации.
Добавление:
const path = require('path')
Использование:
context: path.resolve(__dirname, 'src')
- optimization - параметр для оптимизации. Например, для исключения дублирования импортов (для применения в зависимости от режима - development или production, - возможно использование дополнительной функции. См. ниже.):
module.exports = {
optimization: {
splitChunks: {
chunks: 'all'
}
}
}
- jquery - дополнительная библиотека для удобства работы с JS.
Установка:
# npm i -S jquery
Добавление в index.js:
import * as $ from 'jquery'
- cross-env - установка переменных окружения (кроссплатформенная)
Использование в
package.json:
"scripts": {
"dev": "cross-env NODE_ENV=development webpack --mode development",
"build": "cross-env NODE_ENV=production webpack --mode production",
"watch": "cross-env NODE_ENV=development webpack --mode development --watch",
"start": "cross-env NODE_ENV=development webpack-dev-server --mode development --open"
}
в, например,
webpack.config.js:
const isDev = process.env.NODE_ENV === 'development'
Plugins:
- html-webpack-plugin - плагин для обработки Webpack'ом html-файлов (в частности, index.html). Работа с шаблоном html, добавление в него динамически изменяемых имен файлов скриптов и т.д.
Добавление:
const HTMLWebpackPlugin = require('html-webpack-plugin')
Использование:
plugins: [
new HTMLWebpackPlugin({
// title: 'Webpack My Title',
template: './index.html',
minify: {
collapseWhitespace: !isDev // Минификация при условии
}
]
- clean-webpack-plugin - плагин для очистки целевой папки
Добавление:
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
Использование:
plugins: [
new CleanWebpackPlugin()
]
- copy-webpack-plugin - для перемещения файлов в процессе сборки.
Добавление:
const CopyWebpackPlugin = require('copy-webpack-plugin')
Использование в webpack.config.js:
module.exports = { new CopyWebpackPlugin([ { from: path.resolve(__dirname, 'src/favicon.ico'), to: path.resolve(__dirname, 'dist') } ])}
- mini-css-extract-plugin - создает отдельные CSS-файлы по каждому JS-файлу, в котором они импортируются.
Добавление:
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
Использование в
webpack.config.js:
plugins: [
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
})
],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
}
- terser-webpack-plugin - для оптимизации и минификации JS-файлов.
Добавление:
const TerserPlugin = require('terser-webpack-plugin')
Использование: см. ниже.
- optimize-css-assets-webpack-plugin - для оптимизации и минификации CSS-файлов.
Добавление:
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
Использование:
- создаем переменную для отслеживания режима сборки по переменной окружения NODE_ENV:
const isDev = process.env.NODE_ENV === 'development';
- создаем дополнительную функцию для учёта режима сборки - development или production:
const optimization = () => {
const config = {
splitChunks: {
chunks: 'all'
}
}
if (!isDev) {
config.minimizer = [
new OptimizeCssAssetsPlugin(),
new TerserWebpackPlugin()
]
}
return config;
}
- применяем результаты функции к параметру optimization:
module.exports = {
optimization: optimization()
}
Modules (Loaders):
- css-loader - для импорта css-файлов в JS-файлы.
Добавления не требуется.
Использование:
в
webpack.config.js:
module: {
rules: [
{
test: /\.css$/, // RegExp
use: ['style-loader', 'css-loader']
}
]
}
в
index.js:
import 'styles.css'
- style-loader - для внедрения стилей в DOM (html-файл). Используется совместно с css-loader.
Добавления не требуется.
Использование - см. выше.
- file-loader - для работы с иными файлами (изображения, шрифты и т.п.)
Добавления не требуется.
Использование, для изображений:
в
webpack.config.js:
module: {
rules: [
{
test: /\.(png|jpg|svg|gif)$/,
use: ['file-loader']
}
]
}
в
style.css:
.logo {
background-image: url("webpack-logo.jpg");
}
в
JS-файле:
import webpackLogo from 'webpack-logo.jpg'
Использование, для шрифтов:
в
webpack.config.js:
module: {
rules: [
{
test: /\.(ttf|woff|woff2|eot)$/,
use: ['file-loader']
}
]
}
в
style.css:
@import "fonts.css"
в
font.css:
@font-face {
font-family: 'Roboto';
src: url("Roboto-Regular.ttf") format("truetype");
}
- @import - импортирование файлов.
Например, установка normalize.css:
# npm i normalize.css
импорт в style.css:
@import "~normalize.css"
тильда (~) указывает, что данный пакет следует искать в папке node_modules.
- xml-loader - для импорта xml-файлов.
Использование в JS-файле:
import xml from 'data.xml'
- csv-loader - для импорта csv-файлов. Требует дополнительного пакета papaparse (!)
Использование в JS-файле:
import csv from 'data.csv'
- JSON не требует дополнительных пакетов для импорта json-файлов.
- webpack-dev-server - http-сервер разработчика с поддержкой hot-reload,
Использование в webpack.config.js:
module.exports = {
devServer: {
port: 4200
}
}