hard-source-webpack-plugin
Version:
Hard cache the source of modules in webpack.
128 lines (108 loc) • 3.23 kB
JavaScript
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;