SMELUKOV_DEV Telegram 17
📝 О том, как устроено Long Term Caching в webpack 5.
Оно основано на хешировани контента ассета:

webpack.config.js

module.exports = {
entry: './src/index.js',
output: {
filename: '[contenthash].js'
}
};

Будет создан чанк main, а контент его ассета будет пропущен через md4, этим хешем и будет назван выходной файл, что-то вроде dist/6c4c0000f0570789e1e3.js.
То есть имя файла напрямую зависит от его сожержимого. Как только оно изменится, изменится и имя файла. Что является содержимим файла-ассета? По сути это карта модулей, которые входят в чанк и некоторое количество кода-загрузчика.

(() => {
// bootstrap code
const modules = {
['module 1 id']() {
// transformed module 1 code
},
['module 2 id']() {
// transformed module 2 code
},
// ... other modules
}
// bootstrap code
})()

Проблема в том, что модули могут быть обработаны в любом порядке, поэтому порядок их сборки не гарантируется. Это совсем не то, что нам нужно, т.к. нам важна консистентность содержимого неизменившихся ассетов между сборками и порядок модулей в них. В качестве идентификаторов модулей можно использовать путь к модулю, например:

(() => {
// bootstrap code
const modules = {
'/abs/path/to/project/src/index.js'() {
// transformed index-module code
},
'/abs/path/to/project/src/app.js'() {
// transformed app-module code
},
// ... other modules
}
// bootstrap code
})()

Но это сильно раздувает размер ассета, поэтому вместо полного пути к модулю используется хеш-функция от него, которая возвращает целое число.

f('/abs/path/to/project/src/index.js') => 389
f('/abs/path/to/project/src/app.js') => 187

(() => {
// bootstrap code
const modules = {
389() {
// transformed index-module code
},
187() {
// transformed app-module code
},
// ... other modules
}
// bootstrap code
})()

Для одного и того же модуля всегда возвращается одно и то же число. А для того, чтобы порядок модулей в ассете был всегда одинаковым, модули сортируются по путям до них.

С идентификаторами чанком то же самое, но т.к. у чанка нет своего пути (т.к. это не модуль), то хеш-функция применяется к объединению путей всех модулей внутри этого чанка.

Таким образом в webpack 5 достигается консистентность сожержимого неизменившихся ассетов между сборками.

Про чанки и прочие основные понятия смотрите предыдущие два поста ☝🏻
Чуть позже расскажу о том, как реализован code-splitting и о системе постоянного кеширования.

Пишите в чатик @wdxlabchat о чем еще хотели бы узнать.

#webpack #webpack5



tgoop.com/smelukov_dev/17
Create:
Last Update:

📝 О том, как устроено Long Term Caching в webpack 5.
Оно основано на хешировани контента ассета:

webpack.config.js

module.exports = {
entry: './src/index.js',
output: {
filename: '[contenthash].js'
}
};

Будет создан чанк main, а контент его ассета будет пропущен через md4, этим хешем и будет назван выходной файл, что-то вроде dist/6c4c0000f0570789e1e3.js.
То есть имя файла напрямую зависит от его сожержимого. Как только оно изменится, изменится и имя файла. Что является содержимим файла-ассета? По сути это карта модулей, которые входят в чанк и некоторое количество кода-загрузчика.

(() => {
// bootstrap code
const modules = {
['module 1 id']() {
// transformed module 1 code
},
['module 2 id']() {
// transformed module 2 code
},
// ... other modules
}
// bootstrap code
})()

Проблема в том, что модули могут быть обработаны в любом порядке, поэтому порядок их сборки не гарантируется. Это совсем не то, что нам нужно, т.к. нам важна консистентность содержимого неизменившихся ассетов между сборками и порядок модулей в них. В качестве идентификаторов модулей можно использовать путь к модулю, например:

(() => {
// bootstrap code
const modules = {
'/abs/path/to/project/src/index.js'() {
// transformed index-module code
},
'/abs/path/to/project/src/app.js'() {
// transformed app-module code
},
// ... other modules
}
// bootstrap code
})()

Но это сильно раздувает размер ассета, поэтому вместо полного пути к модулю используется хеш-функция от него, которая возвращает целое число.

f('/abs/path/to/project/src/index.js') => 389
f('/abs/path/to/project/src/app.js') => 187

(() => {
// bootstrap code
const modules = {
389() {
// transformed index-module code
},
187() {
// transformed app-module code
},
// ... other modules
}
// bootstrap code
})()

Для одного и того же модуля всегда возвращается одно и то же число. А для того, чтобы порядок модулей в ассете был всегда одинаковым, модули сортируются по путям до них.

С идентификаторами чанком то же самое, но т.к. у чанка нет своего пути (т.к. это не модуль), то хеш-функция применяется к объединению путей всех модулей внутри этого чанка.

Таким образом в webpack 5 достигается консистентность сожержимого неизменившихся ассетов между сборками.

Про чанки и прочие основные понятия смотрите предыдущие два поста ☝🏻
Чуть позже расскажу о том, как реализован code-splitting и о системе постоянного кеширования.

Пишите в чатик @wdxlabchat о чем еще хотели бы узнать.

#webpack #webpack5

BY Сергей Мелюков


Share with your friend now:
tgoop.com/smelukov_dev/17

View MORE
Open in Telegram


Telegram News

Date: |

Click “Save” ; Invite up to 200 users from your contacts to join your channel With the sharp downturn in the crypto market, yelling has become a coping mechanism for many crypto traders. This screaming therapy became popular after the surge of Goblintown Ethereum NFTs at the end of May or early June. Here, holders made incoherent groaning sounds in late-night Twitter spaces. They also role-played as urine-loving Goblin creatures. The group’s featured image is of a Pepe frog yelling, often referred to as the “REEEEEEE” meme. Pepe the Frog was created back in 2005 by Matt Furie and has since become an internet symbol for meme culture and “degen” culture. How to create a business channel on Telegram? (Tutorial)
from us


Telegram Сергей Мелюков
FROM American