упаковать css-ресурсы
использовать загрузчик
webpack может использовать различные загрузчики для предварительной обработки ресурсов в разных форматах.
- Добавьте файлы в каталог проекта:
// src/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<div class="box"></div>
</body>
</html>
// src/css/style.css
.box{
width:50px;
height: 50px;
background-color: pink;
}
- Установить
css-loader
а такжеstyle-loader
css-loader
Отвечает за чтение файла css и последующее использованиеstyle-loader
Внедряйте css-контент в js и, наконец, встраивайте его в Html-код в виде тега стиля
npm i -D css-loader style-loader
- изменить файл конфигурации
module:
{
test: /\.css$/,
use: [
{
loader:'style-loader', //以style标签的形式嵌入到html中
options:{
insertAt:top //嵌入位置,top指顶部,不会覆盖掉html自带的style样式
}
}
'css-loader' //解析css文件
]
},
использование модуля:
-
rules
: Массив, который хранит различные погрузчики -
test
: регулярное выражение для соответствия различным суффиксам имен файлов. -
loader
: Есть много способов использования
{
test:/\.js$/,
loader:'babel-loader' //只有一个loader时
}
{
test:/\.css$/,
use:['style-loader','css-loader'] //多个loader,从右往左加载
}
{
test:/\.css$/,
use:[
'style-loader', //多个loader混合使用
{ //loader要设置相关参数时可以使用对象
loader:'css-loader',
options:{
minimize:true
}
}
]
}
Использование плагина MiniCssExtractPlugin
использоватьcss-loader
+style-loader
Способ состоит в том, чтобы упаковать стили вjs
файл, затем сstyle
Теги формы, встроенные в страницу.css
стиль сjs
Смешивание файлов может привести к некоторой путанице стилей, поэтому использование плагинаcss
Стили единообразно упакованы в одинcs
s файл, затем начните сlink
Форма тега встроена в страницу запроса ресурса.
webpack3
Обычно используетсяExtractWebpackPlugin
, но больше не поддерживается в webpack4, официально рекомендуется использоватьMiniCssExtractPlugin
заменить.
Первая установка:
npm i -D mini-css-extract-plugin
Изменить файл конфигурации
const miniCssExtractPlugin=require('mini-css-extract-plugin');
module.exports = {
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename:'bundle.js',
},
module: {
rules:[
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader
},
'css-loader'
]
}
]
},
plugins: [
new htmlWebpackPlugin({
template:'./src/index.html'
}),
new miniCssExtractPlugin({
filename:'[name].css' //输出的css文件名,放置在dist目录下
})
]
}
Откройте dist/index.html, вы увидите, что стиль css представлен в виде ссылки.
добавить префикс автоматически
Мы надеемся, что мы сможем автоматически добавлять префиксы браузера в css, мы можем использовать плагиныautoprefixer
.
- Первая установка,
npm i -D postcss-loader autoprefixer
-
postcss-loader
Нужен файл конфигурации, создайте новый в корневом каталогеpostcss.config.js
файл, напишите:
module.exports={
plugins:[require('autoprefixer')]
}
- настроить загрузчик
// webpack.config.js
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader //抽离成一个css文件
},
'css-loader', //解析css
'postcss-loader' //先添加前缀
]
}
- написать тестовый код css
// src/css/style.css
.box{
width:50px;
height: 50px;
background-color: pink;
transform: rotateX(30deg);
}
- Пакет
npm run build
После этого откройтеdist/main.css
Вы можете увидеть, что Tranform был префиксом с WebKit.
Сжать код css/js
использоватьoptimize-css-assets-webpack-plugin
Плагин для сжатия кода css.
- Установить
npm i -D optimize-css-assets-webpack-plugin
- Изменить файл конфигурации
// webpack.config.js
const opimizeCss=require('optimize-css-assets-webpack-plugin');
module.exports = {
optimization:{
minimizer:[
new opimizeCss()
]
},
mode:'production'
....
}
- После запуска сборки npm откройте main.css и обнаружите, что он был сжат, но код js, который автоматически сжимается, когда среда по умолчанию является рабочей, больше не сжимается.
uglifyjs-webpack-plugin
для сжатия js-кода. - Установить
npm i -D uglifyjs-webpack-plugin
- Изменить файл конфигурации
//webpack.config.js
const uglifyJsWebpackPlugin=require('uglifyjs-webpack-plugin')
module.exports = {
optimization:{
minimizer:[
new uglifyJsWebpackPlugin({
cache:true, //是否缓存
parallel:true, //是否并发打包,同时打包多个文件
sourceMap:true //打包后的代码与源码的映射,方便调试
})
...
]
...
}
от es6 до es5
В webpack используется много синтаксиса es6, нам нужно преобразовать его в es5 и использовать babel для выполнения этой функции.
- установить вавилон
npm i -D babel-loader @babel/core @babel/preset-env
- настроить загрузчик
{
test:/\.js$/,
use:[
{
loader:'babel-loader',
options:{
presets:[
`@babel/preset-env` //es6转es5
]
}
}
]
}
Упакуйте ресурсы изображения
Создать импорт изображения в js
(1) Импортированные изображения необходимо импортировать в файл записи js.
// index.js
import img from './img/big.jpg'; //file-loader将该图片放入到dist下,同时返回图片的地址
var imgElement = document.createElement('img');
imgElement.src = img;
document.body.appendChild(imgElement);
(2) Установкаfile-loader
и настроитьnpm i -D file-loader
// webpack.config.js
{
test: /\.(png|jpg|gif|svg|jpeg)$/,
loader: 'file-loader',
}
Внедрить фоновое изображение в css
Это то же самое, что и использование js для представления картинок, но по сравнению сfile-loader
, чащеurl-loader
, Вы можете напрямую кодировать base64 небольшие изображения, чтобы уменьшить HTTP-запросы.
(1) Установкаurl-loader
и настроитьnpm i -D url-loader
// webpack.config.js
{
test: /\.(png|jpg|jpeg|gif|svg)$/,
loader: 'url-loader',
options: {
limit: 1024, //小于该值的图片会使用base64编码
name: '[name].[hash:8].[ext]' //打包后的图片名称 [ext]指图片格式
}
}
писать прямо в htmlЭтикетка
// src/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<div class="box"></div>
<img src="./img/big.png">
</body>
</html>
После упаковки обнаруживается, что адрес образа жестко запрограммирован и не относится к dist, поэтому образ не может быть найден.html-withimg-loader
для обработки изображений в html.
Установить и настроитьnpm i -D html-withimg-loader
// webpack.config.js
{
test:/\.html$/,
loader:'html-withimg-loader'
}
После упаковки и повторного запуска обнаруживается, что образ загружается корректно.
Настройка различных путей к ресурсам
В этой конфигурации все ресурсы помещаются в каталог dist, что выглядит очень запутанно.Мы надеемся, что js находится в папке js, css находится в папке css, а изображения находятся в папке img.Измените соответствующую конфигурацию.
//webpack.config.js
module.exports = {
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename:'js/bundle.js', //给打包输出的js添加一层目录
},
module: {
rules:[
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader
},
'css-loader',
'postcss-loader'
]
},
{
test:/\.js$/, //最后会打包进输出的js的文件,所以不需要配置路径
use:[
{
loader:'babel-loader',
options:{
presets:[
`@babel/preset-env`
]
},
}
]
},
{
test: /\.(png|jpg)$/,
loader: 'url-loader',
options: {
limit: 10000,
name: '[name].[hash:8].[ext]',
//不能通过名字添加路径,因为背景图片还会被css处理一次,会再添加上css的路径
//最后就会变成 css/img/big.1763821.png
outputPath:'img/', //通过该属性设置,打包输出的路径多一层
publicPath:'http://cdn.com' //图片的访问路径为 http://cdn.com/img/big.561361.png
},
},
{
test:/\.html$/,
loader:'html-withimg-loader', //会加上url-loader里的outputPath
}
]
},
plugins: [
new htmlWebpackPlugin({
template:'./src/index.html'
}),
new miniCssExtractPlugin({
filename:'css/[name].css' //通过名字添加一层路径
}),
new cleanWebpackPlugin()
]
}
После окончательной сборки запуска npm у вас могут быть разные папки, и index.html также правильно обрабатывает путь.