Те, кто знает других, мудры, те, кто знает себя, ясны, те, кто побеждает других, сильны, и те, кто побеждает себя, сильны. - Лао-цзы
Введение
существуетwebpack
есть триhash
Можно настроить,hash
,chunkhash
,contenthash
Они неверны и могут быть нацелены на разные конфигурации, премьер-министру нужно разобраться с этими тремяhash
Разница, в каком сценарии, какой из них подходит для использования.
hashВсе файлы имеют одинаковое значение хеш-функции.Пока измененное содержимое несовместимо с предыдущим, все значения хеш-функции будут изменены, что не делает кэширование осмысленным.
chunkhashкогда их несколькоchunk
, образуя несколькоbundle
, если есть только одинchunk
с однимbundle
Содержание изменилось, другоеbundle
изhash
изменится, ведь все люди общиеhash
,В настоящее времяchunkhash
Эффект выходит. Он основан на разных входных файлах(Entry)
Выполните синтаксический анализ файла зависимостей и создайте соответствующийchunk
, создайте соответствующийхэш-значение.
contenthashПри упаковке мы будем вjs
импортировать вcss
файл, потому что это один и тот же файл ввода, если я только изменюjs
получил код, но егоcss
Извлечь и сгенерироватьcss
время файлаhash
также изменится. В настоящее времяcontenthash
Эффект выходит.
Следующий код непосредственно проверяет приведенную выше гипотезу.
Простая конфигурация веб-пакета
Мы просто создадим тот, который сейчас компилируетсяjs
изwebpack
конфигурации, шаги следующие:
- Создайте пустой файл и откройте его в текущей папке
bash or cmd
. -
npm init -y
генерироватьpackage.json
. - если вы установили
cnpm or yarn
просто выполнитьcnpm i webpack webpack-cli -D
, Установитьwebpack
упаковка. - Создайте
src
,существуетsrc
Создано внутриchunk0.js
,chunk1.js
,common.js
,index.js
,style.css
и написать внутренний код - Создан в корневом каталоге проекта
webpack.config.js
- прямо в
cmd
вбегаетwebpack
Каталог файлов выглядит следующим образом:
Ниже приведен кодchunk0.js
export default function add (a, b) {
return a + b;
};
chunk1.js
export default function flow () {
return 'flow';
};
common.js
export default function commonJs () {
return 'commonJs';
};
index.js
import add from './chunk0.js';
import commonJs from './common';
console.log(add(1, 2));
console.log(commonJs());
style.css
body {
background: #000;
}
webpack.config.js
module.exports = {
mode: "production", // 如果不添加就会警告
entry: {
index: "./src/index.js", // 一个入口文件
chunk1: "./src/chunk1.js" // 两一个入口文件
},
output: {
filename: "[name].[hash].js" // 出口文件
}
}
hash
мы работаем напрямуюwebpack
, результат операции показан на следующем рисунке:
Хеш только один, а хеш всех файлов одинаковый:
Если мы изменим модификациюchunk1.jsкод в:
export default function flow () {
return 'flow1'; // flow => folw1
};
Снова запустите webpack и обнаружите, что все хеши изменились, как показано на следующем рисунке:
Сравнение найдено, что их хэш не одинаково, и на этот раз, если вы хотите изменитьchunk1.js, index.js не меняется, надо использовать chunkhash.
chunkhash
- Во-первых, положимwebpack.config.jsвнести некоторые изменения
module.exports = {
mode: "production",
entry: {
index: "./src/index.js",
chunk1: "./src/chunk1.js"
},
output: {
filename: "[name].[chunkhash].js" // hash => chunkhash
}
}
- На втором шаге запускаем
webpack
chunk
изhash
Не то же самое.
- Третья часть, которую мы модифицируем
chunk1.js
export default function flow () {
return 'flow11111'; // flow1 => flow11111
};
- бежать снова
webpack
По картинке мы видимchunk1.js
изhash
изменение, иindex.js
изhash
Изменений нет, мы достигли ожидаемого эффекта, а также лучше для нашего онлайн-кэша.
contenthash
Но когда мыjs
Файл ссылается наcss
файл, если я его изменюcss
содержимое файла, мыcss
, вы найдете все этоbundle
изhash
Также происходят обновления.
мы представляемcss
, и кcss
Извлечь, сжать для созданияcss
файл, необходимо использоватьwebpack
плагин, называемыйMiniCssExtractPlugin
, Он может помочь мне извлечь css в файл css и сжать css.
- Первым шагом является установка
css-loader
,mini-css-extract-plugin
Мешок
cnpm install css-loader mini-css-extract-plugin -D
- Второй шаг к изменению
webpack.config.js
следующим образом
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 新增
module.exports = {
mode: "production",
entry: {
index: "./src/index.js",
chunk1: "./src/chunk1.js"
},
output: {
filename: "[name].[chunkhash].js"
},
module: { // 新增
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader"
]
}
]
},
plugins: [ // 新增
// 提取css插件
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "[name].[chunkhash].css"
})
]
};
- Третий шаг — запустить webpack
Вы можете увидеть кодindex.css
а такжеindex.js
изhash
это то же самое.
- Четвертый шаг — изменить style.css.
html {
font-size: 13px;
}
- Шаг 5. Запустите веб-пакет
Сравнение двух сборокhash
, обнаружил, что только модифицированныйstyle.css
файл, импортируя егоindex.js
действительно обновленhash
, то необходимоcontenthash
вступают в игру.
- Шаг 6 Модификация
webpack.config.js
и запустить вебпак
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 新增
module.exports = {
mode: "production",
entry: {
index: "./src/index.js",
chunk1: "./src/chunk1.js"
},
output: {
filename: "[name].[chunkhash].js"
},
module: { // 新增
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader"
]
}
]
},
plugins: [ // 新增
// 提取css插件
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "[name].[contenthash].css"
})
]
};
Видеть, что они хешируют напрямую, это другое.
- Исправлять
common.js
, запустить веб-пакет напрямую
export default function commonJs () {
return 'commonJs1';
};
Видя, что хэш нашего файла css не изменился при изменении js.
Обратите внимание, что при использовании
contenthash
Если вы измените файл js, хэш файла css не изменится, но если вы измените файл js, хэш файла css также изменится.
Суммировать
hash Все файлы имеют одинаковое значение hash; chunkhash анализирует зависимые файлы в соответствии с различными входными файлами (Entry), строит соответствующие фрагменты и генерирует соответствующие хэш-значения; Расчет contenthash связан с содержимым самого файла и в основном используется, когда css извлекает файлы css.