assetgraph
Version:
An auto discovery dependency graph based optimization framework for web pages and applications
41 lines (40 loc) • 1.5 kB
JavaScript
// Note: Will implicitly un-inline assets found to be identical. If you want to prevent this from happening,
// specify isInline:false or similar in the queryObj.
module.exports = queryObj => {
return function mergeIdenticalAssets(assetGraph) {
const seenAssetsByTypeAndMd5 = {};
for (const asset of assetGraph.findAssets(queryObj)) {
if (asset.isExternalizable) {
const md5Hex = asset.md5Hex;
seenAssetsByTypeAndMd5[asset.type] =
seenAssetsByTypeAndMd5[asset.type] || {};
const identicalAsset = seenAssetsByTypeAndMd5[asset.type][md5Hex];
if (identicalAsset) {
if (!identicalAsset.url) {
// Un-inline the identical asset so that the two can be merged:
identicalAsset.externalize();
}
for (const incomingRelation of assetGraph.findRelations({
to: asset
})) {
// Avoid introducing duplicate CacheManifestEntry relations:
if (
incomingRelation.type === 'CacheManifestEntry' &&
assetGraph.findRelations({
from: incomingRelation.from,
to: identicalAsset
}).length > 0
) {
incomingRelation.detach();
} else {
incomingRelation.to = identicalAsset;
}
}
assetGraph.removeAsset(asset);
} else {
seenAssetsByTypeAndMd5[asset.type][md5Hex] = asset;
}
}
}
};
};