123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- const crypto = require('crypto');
- const pluginCompat = require('./util/plugin-compat');
- const relateContext = require('./util/relate-context');
- const { parityCacheFromCache, pushParityWriteOps } = require('./util/parity');
- function requestHash(request) {
- return crypto
- .createHash('sha1')
- .update(request)
- .digest()
- .hexSlice();
- }
- const relateNormalRequest = relateContext.relateNormalRequest;
- class AssetCache {
- apply(compiler) {
- const compilerHooks = pluginCompat.hooks(compiler);
- let assetCache = {};
- let parityCache = {};
- const assetArchetypeCache = {
- _ops: [],
- get(id) {
- const hashId = requestHash(relateNormalRequest(compiler, id));
- if (assetCache[hashId]) {
- if (typeof assetCache[hashId] === 'string') {
- assetCache[hashId] = JSON.parse(assetCache[hashId]);
- }
- return assetCache[hashId];
- }
- },
- set(id, item) {
- const hashId = requestHash(relateNormalRequest(compiler, id));
- if (item) {
- assetCache[hashId] = item;
- this._ops.push({
- key: hashId,
- value: item,
- });
- } else {
- assetCache[hashId] = null;
- this._ops.push({
- key: hashId,
- value: null,
- });
- }
- },
- operations() {
- const ops = this._ops.slice();
- this._ops.length = 0;
- return ops;
- },
- };
- compilerHooks._hardSourceArchetypeRegister.call(
- 'Asset',
- assetArchetypeCache,
- );
- let assetCacheSerializer;
- let assetParityCacheSerializer;
- compilerHooks._hardSourceCreateSerializer.tap(
- 'HardSource - AssetCache',
- (cacheSerializerFactory, cacheDirPath) => {
- assetCacheSerializer = cacheSerializerFactory.create({
- name: 'assets',
- type: 'file',
- cacheDirPath,
- });
- assetParityCacheSerializer = cacheSerializerFactory.create({
- name: 'assets-parity',
- type: 'data',
- cacheDirPath,
- });
- },
- );
- compilerHooks._hardSourceResetCache.tap('HardSource - AssetCache', () => {
- assetCache = {};
- parityCache = {};
- });
- compilerHooks._hardSourceReadCache.tapPromise(
- 'HardSource - AssetCache',
- () =>
- Promise.all([
- assetCacheSerializer.read().then(_assetCache => {
- assetCache = _assetCache;
- }),
- assetParityCacheSerializer.read().then(_parityCache => {
- parityCache = _parityCache;
- }),
- ]),
- );
- compilerHooks._hardSourceParityCache.tap(
- 'HardSource - AssetCache',
- parityRoot => {
- parityCacheFromCache('Asset', parityRoot, parityCache);
- },
- );
- compilerHooks._hardSourceWriteCache.tapPromise(
- 'HardSource - AssetCache',
- compilation => {
- const assetOps = assetArchetypeCache.operations();
- const parityOps = [];
- pushParityWriteOps(compilation, parityOps);
- return Promise.all([
- assetCacheSerializer.write(assetOps),
- assetParityCacheSerializer.write(parityOps),
- ]);
- },
- );
- }
- }
- module.exports = AssetCache;
|