1. Роль плагинов
This plugin extracts CSS into separate files. It creates a CSS file per JS file which contains CSS. It supports On-Demand-Loading of CSS and SourceMaps.
После перевода: «Этот плагин извлекает CSS в отдельные файлы. Он создает файл CSS для каждого файла JS, содержащего CSS. Он поддерживает загрузку CSS и SourceMap по требованию».
包含CSS的JS文件,JS文件不是指组件对应的JS文件,是指打包后生成的JS文件。
Преимущества плагинов
До Webpack 4.0 для извлечения CSS использовался плагин ExtractTextWebpackPlugin, который имеет следующие преимущества:
- Асинхронная загрузка
- отсутствие дублирования компиляции (производительность)
- проще в использовании
- CSS специфичный
3. Простое использование плагинов
построить простойWenpack Demo, показывать.
Сначала установите плагин MiniCssExtractPlugin.
npm install --save-dev mini-css-extract-plugin
После успешной установки вwebpack.config.jsконфигурация в файле.
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
entry: {
main: "./src/main.js",
},
plugins:[
new MiniCssExtractPlugin(),
],
module:{
rules:[
{
test: /\.css$/,
use:[MiniCssExtractPlugin.loader,'css-loader']
},
]
}
}
Входной файлmain.js
import './css/main.css'
import './index'
console.log('main')
index.js
import './css/index.css'
import './index'
console.log('main')
main.cssа такжеindex.cssтот же контент
.class{
color:red
}
Выполнение заказаwebpack
, допустимыйdistТри файла, сгенерированные упаковкой, видны в папке
В проекте есть два JS-файла, содержащих CSS, но запакован и сгенерирован только один CSS-файл, что подтверждает вышесказанное. «Он создает файл CSS для каждого файла JS, который включает CSS» в файле JS, который включает CSS, относится кJS-файл, сгенерированный после упаковки.
открыть в браузереindex.html, вы можете увидеть это в инструментах разработчика, как показано ниже.
Упакуйте сгенерированный файл CSS дляlink
Знакомство с этикеткой
Если вы не используете плагин MiniCssExtractPlugin, измените егоwebpack.config.jsконфигурация в файле.
module:{
rules:[
{
test: /\.css$/,
use:['style-loader','css-loader']
},
]
}
повторно выполнитьwebpack
Заказ. открыть в браузереindex.html, вы обнаружите, что стиль используется в голове<style></style>
Встроенный импорт.
Увидев это, вы также должны понимать роль плагина MiniCssExtractPlugin, который заключается в извлечении стиля CSS в JS, использованииlink
Внешнее введение, уменьшение размера файлов JS, называемое разделением стиля CCSS.
MiniCssExtractPlugin插件不能和style-loader共用
В-четвертых, параметры плагина
filename
управление из упаковкиВходИмя файла CSS, созданного путем извлечения стилей CSS из файла JS.
module.exports = {
entry: {
main: "./src/main.js",
},
plugins:[
new MiniCssExtractPlugin({
filename: '[name]-test.css',
}),
]
}
воплощать в жизньwebpack
команда, которая может бытьdistИмя упакованного и сгенерированного файла CSS в папке:main-test.css
chunkFilename
управление из упаковкиневъездИмя файла CSS, созданного путем извлечения стилей CSS из файла JS.
module.exports = {
entry: {
main: "./src/main.js",
},
plugins:[
new MiniCssExtractPlugin({
filename: '[name]-test.css',
chunkFilename: '[name]-test.css'
}),
]
}
main.js
import './css/main.css'
import(/*webpackChunkName: "index"*/ './index')
console.log('main')
воплощать в жизньwebpack
команда, которая может бытьdistСмотрите незарегистрированные файлы JS в папкеindex.bundle.jsИзвлеченный файл CSS называетсяindex-test.css.
moduleFilename
Значение этого параметра представляет собой функцию, которая в основном используется в сценариях с несколькими входами и управляет именем файла CSS, созданного путем извлечения стилей CSS из JS-файла упакованного входа.
если иfilename
совместное использование параметров,filename
не будет работать.
module.exports = {
entry: {
main: "./src/main.js",
main1: "./src/main1.js",
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].css',
moduleFilename: (
{ name }) => {
return `${name}.css`
},
}),
],
}
воплощать в жизньwebpack
команда, сгенерированный файл пакета показан на следующем рисунке.
ignoreOrder
Контролируйте, является ли порядок введения CSS непоследовательным или нет, чтобы предупредить,true
предупреждать,false
Указывает на отсутствие предупреждения.
Проще говоря, это проблема, вызванная порядком введения css в js.Если порядок введения нескольких css в js отличается, будет это предупреждение. Например, в 1.js порядок введения a.css, b.css, в 2.js порядок введения b.css, a.css, если порядок введения другой, это вызовет предупреждение. Настройте порядок введения на одинаковый в двух js, проблем нет. Порядок импорта в 1.js и 2.js настроен на a.css, а в b.css такого предупреждения нет.
Конечно, вы также можете установитьignoreOrder
Параметрыfalse
, отключить эти предупреждения.
Подробнее см. В этом вопросе на официальном сайте.
Пять, параметры подключаемого загрузчика
publicPath
Значение по умолчанию — webpackOptions.output, как показано ниже, значение по умолчанию —path.resolve(__dirname, 'dist')
.
module.exports = {
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, 'dist'),
},
}
Роль заключается в указании пользовательского общедоступного пути к объектному файлу. Это немного сложно понять, поэтому давайте объясним это на примере.
main.css
body{
background: url('./LOGO.png');
}
main.jsвходной файл
import './css/main.css'
console.log('main')
потому чтоmain.cssВставьте изображения и используйте загрузчик файлов для их обработки. существуетwebpack.config.jsнастроено так
module.exports = {
module: {
rules: [
{
test: /\.png$/,
use: [
{
loader: 'file-loader',
options: {
name: 'img/[name].[hash:8].[ext]'
}
}
]
},
],
},
};
воплощать в жизньwebpack
команда, упакованный и сгенерированный файл CSS выглядит следующим образомmain.cssСледующим образом
картинка наdistв папкеimgпапку, затем откройте ее в браузереindex.html, картинку можно загрузить.
Если вы измените сгенерированный путь к файлу CSS.
module.exports = {
plugins:[
new MiniCssExtractPlugin({
filename: 'css/[name].css',
}),
]
}
повторно выполнитьwebpack
команда, упакованный и сгенерированный файл CSS выглядит следующим образомmain.cssСледующим образом
Или на картинкеdistв папкеimgпапку, но открыть в браузереindex.html,Изображение не может быть загружено.
потому чтоmain.cssСсылочный путь изображения вimg/LOGO.af6d901d.png
, очевидно, что путь неверен, поэтому изображение не может быть загружено, поэтому измените путь ссылки изображения на../img/LOGO.af6d901d.png
Это можно загрузить.
Но изменить файлы, сгенерированные упаковкой, невозможно, так как решить эту ошибку? На этом этапе отражается роль параметра publicPath.Вы можете использовать параметр publicPath, чтобы изменить ссылочный путь изображения и изменить его.webpack.config.jsКонфигурация.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader:MiniCssExtractPlugin.loader,
options:{
publicPath:'../'
}
},
'css-loader']
},
],
}
}
повторно выполнитьwebpack
команда, упакованный и сгенерированный файл CSS выглядит следующим образомmain.cssСледующим образом
открыть в браузереindex.html,картинки можно загрузить.
Роль publicPath указывает пользовательский общедоступный путь к целевому файлу, который можно понимать как указание../img/LOGO.af6d901d.png
серединаimg
предыдущий путь../
.
esModule
По умолчаниюfalse
, от имени MiniCssExtractPlugin для создания модулей JS с использованием синтаксиса модуля CommonJS.
еслиtrue
, от имени MiniCssExtractPlugin для создания модулей JS с использованием синтаксиса модуля ES6.
hmr
По умолчаниюfalse
,дляtrue
При запуске горячего обновления файла стиля.
Когда горячее обновление файла стиля не включено, при изменении исходного файла CSS измененный стиль не будет автоматически отображаться на странице, и страницу необходимо обновить вручную, чтобы загрузить изменения. После запуска горячего обновления файла стиля больше не нужно обновлять всю страницу, и измененный стиль может автоматически отображаться на странице.
Как упоминалось выше, подключаемый модуль MiniCssExtractPlugin нельзя использовать совместно с загрузчиком стилей.Как правило, загрузчик стилей настраивается в среде разработки, а подключаемый модуль MiniCssExtractPlugin настраивается в рабочей среде. На самом деле, style-loader также может выполнять горячее обновление файлов стилей.
HMR is an opt-in feature that only affects modules containing HMR code. One example would be patching styling through the style-loader. In order for patching to work, the style-loader implements the HMR interface; when it receives an update through HMR, it replaces the old styles with the new ones.
Но горячее обновление файла стилей плагина MiniCssExtractPlugin более мощное, чем загрузчик стилей. например вpublicв папкеindex.htmlВведите файл стиля CSS. Если исходный код файла стиля CSS изменен, использование style-loader не приведет к горячему обновлению файла стиля, потому что style-loader выполняет горячее обновление только стилей, представленных в JS, а MiniCssExtractPlugin Плагин выполнит горячее обновление и загрузит все стили.
Обычно только в производственной средеhmr
Установить какtrue
.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader:MiniCssExtractPlugin.loader,
options:{
publicPath:'../',
hmr: process.env.NODE_ENV === 'development',
}
},
'css-loader']
},
],
}
}
reloadAll
if hmr does not work, this is a forceful method.
общая посадкаhrm
параметр для использования, какtrue
, это означает, что все стили перезагружаются, когда горячее обновление файлов стилей не работает.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader:MiniCssExtractPlugin.loader,
options:{
publicPath:'../',
hmr: process.env.NODE_ENV === 'development',
reloadAll: true
}
},
'css-loader']
},
],
}
}
6. Извлеките все CSS в один файл
Для этого используйте плагин SplitChunks. Конкретное использование плагина SplitChunks можно найти в другой моей статье:Подробное использование плагина Webpack SplitChunks
module.exports = {
optimization: {
splitChunks: {
cacheGroups: {
styles: {
name: 'styles',
test: /\.css$/,
chunks: 'all',
enforce: true,
},
},
},
},
}
воплощать в жизньwebpack
команда, файлы, сгенерированные упаковкой, выглядят следующим образом