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: |

How to create a business channel on Telegram? (Tutorial) Although some crypto traders have moved toward screaming as a coping mechanism, several mental health experts call this therapy a pseudoscience. The crypto community finds its way to engage in one or the other way and share its feelings with other fellow members. How to create a business channel on Telegram? (Tutorial) “[The defendant] could not shift his criminal liability,” Hui said. A few years ago, you had to use a special bot to run a poll on Telegram. Now you can easily do that yourself in two clicks. Hit the Menu icon and select “Create Poll.” Write your question and add up to 10 options. Running polls is a powerful strategy for getting feedback from your audience. If you’re considering the possibility of modifying your channel in any way, be sure to ask your subscribers’ opinions first.
from us


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