В первую очередь рекомендуется использовать webpack4Версия узла выше 8.5Потому что он совместим с NPX под новой версией NPM, в CMDnode -vПроверьте версию узла.
1. Что такое веб-пакет
WebPack можно рассматривать как упаковщик модулей: он анализирует структуру вашего проекта, находит модули JavaScript и другие языки расширения (Scss, TypeScript и т. д.), которые браузеры не могут запускать напрямую, и упаковывает их в подходящий формат для браузера. использовать.
Создание — это преобразование исходного кода в исполняемый код JavaScript, CSS и HTML, который публикуется в Интернете, включая следующие.
- преобразование кода: TypeScript компилируется в JavaScript, SCSS компилируется в CSS и т. д.
- оптимизация файлов: Сжимайте код JavaScript, CSS, HTML, сжимайте и объединяйте изображения и т. д.
- разделение кода: извлеките общий код нескольких страниц, извлеките код, который не нужно выполнять на первом экране, и разрешите ему асинхронную загрузку.
- слияние модулей: В модульном проекте будет много модулей и файлов, и для объединения модулей в один файл потребуется функция сборки.
- Автоматическое обновление: Отслеживайте изменения локального исходного кода, автоматически перестраивайте и обновляйте браузер.
- проверка кода: Перед отправкой кода на склад необходимо проверить, соответствует ли код спецификации и проходит ли юнит-тест.
- автоматическая публикация: после обновления кода код онлайн-релиза создается автоматически и передается в систему выпуска.
Конструирование на самом деле является воплощением инженерии и автоматизации в разработке интерфейса.Серия процессов реализована в коде, и код может автоматически выполнять эту серию сложных процессов. Сборки вдыхают больше жизни в разработку переднего плана и высвобождают нашу производительность.
2. Инициализируйте проект
- Инициализировать package.json
npm init -y
// package.json 文件中
"scripts": {
"build": "webpack --profile --progress --colors --display-error-details",
"dev": "webpack --display-modules --profile --progress --colors --display-error-details"
},
-
цвет Результат вывода окрашен, например, шаги, которые занимают много времени, будут отображаться красным цветом.
-
профиль выходных данных о производительности, вы можете увидеть, сколько времени занимает каждый шаг
-
progress Выводит ход текущей компиляции в виде процентов.
-
display-modules По умолчанию модули в node_modules будут скрыты, добавление этого параметра может отображать эти скрытые модули.
-
display-error-details выводит подробную информацию об ошибке
-
Установить глобально
npm install webpack -g
- локальная установка
npm install webpack webpack-cli -D//-D是指开发环境需要,上线不需要,下同;
Обычно рекомендуется устанавливать локально и устанавливать в свой проект, иначе будет несовместимость между разными версиями.
3. Начните быстро
3.1 Основные концепции веб-пакета
- Вход: вход, первый шаг выполнения сборки Webpack начнется с Entry, которую можно абстрагировать во входные данные.
- Модуль: Модуль, В Webpack все является модулем, а модуль соответствует файлу. Webpack будет рекурсивно находить все зависимые модули, начиная с настроенного Entry.
- Чанк: блок кода, фрагмент состоит из нескольких модулей для слияния и разделения кода.
- Загрузчик: Преобразователь модулей, который используется для преобразования исходного содержимого модуля в новое содержимое по мере необходимости.
- Плагин: плагин расширения, внедрите логику расширения в определенное время в процессе сборки Webpack, чтобы изменить результат сборки или сделать то, что вы хотите.
- Выход: результат вывода, который выводит результат после того, как Webpack прошел ряд обработок и получил окончательный желаемый код.
3.2 Настройка веб-пакета
npm install webpack webpack-cli -D
- создать источник
- создать расстояние
- Создать index.html
-
Файл конфигурации webpack.config.js
- entry: адрес файла записи конфигурации
- вывод: адрес файла экспорта конфигурации
- модуль: модуль конфигурации, в основном используемый для настройки загрузчика различных файлов
- плагины: настроить плагины
- devServer: настроить сервер разработки
// 基于node的 遵循commonjs规范的
let path = require('path');//node的模块
module.exports = {
entry:'./src/index.js', // 入口
output:{
filename:'build.js',
// 这个路径必须是绝对路径
path: path.resolve('./dist')
}, // 出口
devServer:{
contentBase:'./dist',
port:8080,
compress:true,// 服务器压缩
open:true,// 自动打开浏览器
// hot:true//热更新
},// 开发服务器
module:{}, // 模块配置
plugins:[], // 插件的配置
mode:'development', // 可以更改模式
resolve:{}, // 配置解析
}
// 在webpack中如何配置开发服务器 webpack-dev-server
4. Настройте сервер разработки
npm i webpack-dev-server –D
- contentBase настраивает корневой каталог файла среды выполнения службы разработки.
- хост: адрес хоста, где сервер разработки прослушивает
- сжатие Разрешает ли сервер разработки сжатие, такое как gzip
- порт: порт, который прослушивает сервер разработки
+ devServer:{
+ contentBase:path.resolve(__dirname,'dist'),
+ host:'localhost',
+ compress:true,
+ port:8080
+ }//开发服务器
+ "scripts": {
+ "build": "webpack --mode development",
+ "dev": "webpack-dev-server --open --mode development "
+ }//开启本地服务 npm run dev
5. Типы входных файлов
5.1 Разовый въезд + разовый выезд
Такая ситуация встречается редко и обычно может отображаться в виде строки, например:
entry: './src/index.js',
5.2 Форма массива с несколькими входами + один выход
entry:['./src/index.js','./src/a.js']
5.1 Многократный въезд + многократный выезд
Иногда наша страница может состоять из нескольких HTML-страниц, будет несколько страниц, поэтому нам нужно несколько записей.
entry: {
index: './src/index.js',
main:'./src/main.js'
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[hash].js',
publicPath:PUBLIC_PATH
},
new HtmlWebpackPlugin({
minify: {
removeAttributeQuotes:true
},
hash: true,
template: './src/index.html',
chunks:['index'],
filename:'index.html'
}),
new HtmlWebpackPlugin({
minify: {
removeAttributeQuotes:true
},
hash: true,
chunks:['main'],
template: './src/main.html',
filename:'main.html'
})],
6. Поддержка загрузки файлов css
6.1 Что такое загрузчик
Используя разные загрузчики, Webpack может конвертировать разные файлы в файлы JS, такие как CSS, ES6/7, JSX и т. д.
- test: регулярное выражение, соответствующее расширению обрабатываемого файла
- use: имя загрузчика, которое является именем модуля, который вы хотите использовать
- include/exclude: Вручную укажите папки, которые должны быть обработаны, или закройте папки, которые не нужно обрабатывать.
- запрос: предоставляет дополнительные параметры настройки для загрузчиков
Три способа написать загрузчик
- use
- loader
- use+loader
6.2 css-loader
npm i style-loader css-loader -D
загрузчик конфигурации
module: {
+ rules:[
+ {
+ test:/\.css$/,
+ use:['style-loader','css-loader'],//从右往左写,webpack特性
+ include:path.join(__dirname,'./src'),
+ exclude:/node_modules/
+ }
+ ]
},
7. Поддержка изображений
7.1 Добавление изображений вручную
npm i file-loader url-loader -D
- file-loaderРешить проблему импорта путей к изображениям в CSS и других файлах.
- url-loaderКогда изображение маленькое, оно будет кодировать изображение в BASE64, а если оно больше параметра limit, используйте загрузчик файлов для его копирования.
let logo=require('./images/logo.png');
let img=new Image();
img.src=logo;
document.body.appendChild(img);
{
test:/\.(jpg|png|gif|svg)$/,
use:'url-loader',
include:path.join(__dirname,'./src'),
exclude:/node_modules/
}
7.2 Введение изображений в CSS
Вы также можете включать изображения в файлы CSS.
.img-bg{
background: url(./images/logo.png);
width:173px;
height:66px;
}
8. Автоматически генерировать html
8.1 Что такое плагин
Плагины являются основой Wepback. Сам веб-пакет построен поверх той же системы плагинов, которую вы используете в своей конфигурации веб-пакета!
- использование плагина
npm install 插件名 -D
Поскольку плагины — это все классы, ссылочные методы, вpluginsв массивеновое имя плагинаготовые к использованию.
8.2 Мы надеемся автоматически генерировать файлы HTML и внедрять в них сгенерированные ресурсы
npm i html-webpack-plugin -D
- minify — сжать html-файл, removeAttrubuteQuotes — удалить двойные кавычки атрибута
- hash Добавьте хеш, чтобы избежать кэширования при вводе выходных ресурсов
- путь к шаблону шаблона
plugins: [
+ new HtmlWebpackPlugin({
+ minify: {
+ removeAttributeQuotes:true
+ },
+ hash: true,
+ template: './src/index.html',
+ filename:'index.html'
})]
9. Отдельный CSS
Поскольку загрузку CSS и JS можно распараллелить, когда файл HTML очень большой, мы можем извлечь CSS отдельно и загрузить его.Плагин mini-css-extract-plugin в webpack4 также может быть реализован, но в настоящее время существует множество ошибки и не могут быть разделены на несколько css.
npm install --save-dev extract-text-webpack-plugin@next
{
test:/\.css$/,
use: ExtractTextWebpackPlugin.extract({
use:'css-loader'
}),
include:path.join(__dirname,'./src'),
exclude:/node_modules/
},
plugins: [
new ExtractTextWebpackPlugin('css/index.css'),
]
Обработка проблем с путями к изображениям
const PUBLIC_PATH='/';
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath:PUBLIC_PATH
},
Укажите расположение упакованного образа
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
outputPath:'images/'
}
}
],
Использование изображений в HTML
npm i html-withimg-loader -D
<div class="img-container "><img src="./images/logo.png" alt="logo.png"></div>
{
+ test:/\.(html|html)$/,
+ use:'html-withimg-loader',
+ include:path.join(__dirname,'./src'),
+ exclude:/node_modules/
}
10. Компиляция меньше и дерзче
npm i less less-loader -D
npm i node-saas sass-loader -D
@color:orange;
.less-container{
border:1px solid @color;
}
$color:green;
.sass-container{
border:1px solid $color;
}
const cssExtract=new ExtractTextWebpackPlugin('css.css');
const lessExtract=new ExtractTextWebpackPlugin('less.css');
const sassExtract=new ExtractTextWebpackPlugin('sass.css');
{
test:/\.less$/,
use: lessExtract.extract({
use:['css-loader','less-loader']
}),
include:path.join(__dirname,'./src'),
exclude:/node_modules/
},
{
test:/\.scss$/,
use: sassExtract.extract({
use:['css-loader','sass-loader']
}),
include:path.join(__dirname,'./src'),
exclude:/node_modules/
},
11. Обработка префиксов свойств CSS3
Для совместимости с браузером иногда нам приходится добавлять эти префиксы -webkit,-ms,-o,-moz
- Ядро Trident: в основном представлено браузером IE с префиксом -ms
- Ядро Gecko: основным представителем является Firefox с префиксом -moz.
- Ядро Presto: основной представитель Opera с префиксом -o
- Ядро Webkit: основными продуктами являются Chrome и Safari с префиксом -webkit.
npm i postcss-loader autoprefixer -D
postcss.config.js
module.exports={
plugins:[require('autoprefixer')]
}
.circle {
+ transform: translateX(100px);
{
test:/\.css$/,
use: cssExtract.extract({
+ use:['css-loader','postcss-loader']
}),
include:path.join(__dirname,'./src'),
exclude:/node_modules/
},
12. Побег из ES6/ES7/JSX
Babel на самом деле является платформой для компиляции JavaScript, которая может избежать ES6/ES7, React JSX для ES5.
npm i babel-core babel-loader babel-preset-env babel-preset-stage-0 babel-preset-react -D
{
test:/\.jsx?$/,
use: {
loader: 'babel-loader',
options: {
presets: ["env","stage-0","react"]
}
},
include:path.join(__dirname,'./src'),
exclude:/node_modules/
},
13. Как отлаживать упакованный код
webpack может автоматически дать нам через конфигурациюsource maps
документ,map
Файл — это способ сопоставления скомпилированного файла и исходного файла.
- source-map генерирует файлы маппинга в отдельные файлы, самые полные и самые медленные
- Cheap-module-source-map создает карту без сопоставления столбцов в отдельном файле.
- eval-source-map Используйте eval для упаковки модулей исходного файла и создания полной исходной карты в том же файле.
- исходная карта дешевого модуля-eval-source-map и упакованные аналоги JS показывают, что нет столбца сопоставления
devtool:'eval-source-map'
14. Скопируйте статические файлы
Иногда файлы, на которые нет ссылок в проекте, также необходимо упаковать в целевой каталог.
npm i copy-webpack-plugin -D
new CopyWebpackPlugin([{
from: path.join(__dirname,'public'),//静态资源目录源地址
to:'./public' //目标地址,相对于output的path目录
}]),
15. Очистите выходной каталог перед упаковкой
npm i clean-webpack-plugin -D
new cleanWebpaclPlugin(path.join(__dirname,'dist'))
16. Сжать CSS
webpack может удалить неиспользуемый CSS
npm i -D purifycss-webpack purify-css glob
new PurifyCSSPlugin({//purifycss根据这个路径配置遍历你的HTML文件,查找你使用的CSS
paths:require('glob').sync(path.join(__dirname,'src/*.html'))
}),
17. решить
17.1 extensions
После указания расширения вам не нужно добавлять расширение файла при запросе или импорте, он попытается добавить расширение, в свою очередь, чтобы соответствовать
resolve: {
//自动补全后缀,注意第一个必须是空字符串,后缀一定以点开头
extensions: [" ",".js",".css",".json"],
},
17.2 alias
Настройка псевдонимов может ускорить поиск модулей webpack.
- Всякий раз, когда вводится модуль jquery, он будет напрямую импортировать jqueryPath вместо поиска по правилам поиска модуля из папки node_modules.
- Нет необходимости в веб-пакете для анализа файла jquery.js
const bootstrap=path.join(__dirname,'node_modules/bootstrap/dist/css/bootstrap.css')
resolve: {
+ alias: {
+ 'bootstrap': bootstrap
+ }
},
18. Различать переменные окружения
Многие библиотеки будут связаны с переменной среды process.env.NODE_ENV, чтобы определить, на что следует ссылаться в библиотеке. Например, некоторые библиотеки могут добавлять дополнительные журналы (log) и тесты (test), чтобы упростить отладку, когда они не используются. На самом деле, при использовании process.env.NODE_ENV === 'production' некоторые библиотеки могут оптимизировать код для конкретной пользовательской среды, тем самым удаляя или добавляя какой-то важный код. Мы можем использовать DefinePlugin, встроенный в webpack, чтобы определить эту переменную для всех зависимостей:
npm install cross-env -D
"scripts": {
"build": "cross-env NODE_ENV=production webpack --mode development",
"dev": "webpack-dev-server --open --mode development "
},
plugins: [
new webpack.DefinePlugin({
NODE_ENV:JSON.stringify(process.env.NODE_ENV)
}),
if (process.env.NODE_ENV == 'development') {
console.log('这是开发环境');
} else {
console.log('这是生产环境');
}
19. Вытащить из общественных мест
optimization:{
splitChunks:{
cacheGroups:{
vendor:{//抽离第三插件
test:/node_module/,
chunks:'initial',
name: 'vendor',
priority:10,//优先级
},
commons:{//抽离公共的js
chunks:'initial',
name:'commons',
minSize: 0//只要超出0字节就生成新的公共的包
}
}
}
},
- Справа налево сначала будет упакована общедоступная часть js (например, часть, совместно используемая двумя файлами), а третья сторона (например, jquery) будет упакована первой. В это время необходимо установить приоритет, и сторонний плагин не будет упакован в публичную часть.