Skip to content

Commit defde64

Browse files
authoredSep 11, 2020
feat: improve caching
1 parent 92f53b6 commit defde64

27 files changed

+3751
-641
lines changed
 

‎src/Webpack4Cache.js

+94-11
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,114 @@ import findCacheDir from 'find-cache-dir';
55
import serialize from 'serialize-javascript';
66

77
export default class Webpack4Cache {
8-
constructor(compilation, options) {
9-
this.cacheDir =
8+
constructor(compilation, options, weakCache) {
9+
this.cache =
1010
options.cache === true
1111
? Webpack4Cache.getCacheDirectory()
1212
: options.cache;
13+
this.weakCache = weakCache;
1314
}
1415

1516
static getCacheDirectory() {
1617
return findCacheDir({ name: 'terser-webpack-plugin' }) || os.tmpdir();
1718
}
1819

19-
isEnabled() {
20-
return Boolean(this.cacheDir);
21-
}
20+
async get(cacheData, { RawSource, ConcatSource, SourceMapSource }) {
21+
if (!this.cache) {
22+
// eslint-disable-next-line no-undefined
23+
return undefined;
24+
}
25+
26+
const weakOutput = this.weakCache.get(cacheData.inputSource);
27+
28+
if (weakOutput) {
29+
return weakOutput;
30+
}
2231

23-
async get(task) {
2432
// eslint-disable-next-line no-param-reassign
25-
task.cacheIdent = task.cacheIdent || serialize(task.cacheKeys);
33+
cacheData.cacheIdent =
34+
cacheData.cacheIdent || serialize(cacheData.cacheKeys);
35+
36+
let cachedResult;
37+
38+
try {
39+
cachedResult = await cacache.get(this.cache, cacheData.cacheIdent);
40+
} catch (ignoreError) {
41+
// eslint-disable-next-line no-undefined
42+
return undefined;
43+
}
44+
45+
cachedResult = JSON.parse(cachedResult.data);
46+
47+
if (cachedResult.target === 'comments') {
48+
return new ConcatSource(cachedResult.value);
49+
}
2650

27-
const { data } = await cacache.get(this.cacheDir, task.cacheIdent);
51+
const {
52+
code,
53+
name,
54+
map,
55+
input,
56+
inputSourceMap,
57+
extractedComments,
58+
} = cachedResult;
2859

29-
return JSON.parse(data);
60+
if (map) {
61+
cachedResult.source = new SourceMapSource(
62+
code,
63+
name,
64+
map,
65+
input,
66+
inputSourceMap,
67+
true
68+
);
69+
} else {
70+
cachedResult.source = new RawSource(code);
71+
}
72+
73+
if (extractedComments) {
74+
cachedResult.extractedCommentsSource = new RawSource(extractedComments);
75+
}
76+
77+
return cachedResult;
3078
}
3179

32-
async store(task, data) {
33-
return cacache.put(this.cacheDir, task.cacheIdent, JSON.stringify(data));
80+
async store(cacheData) {
81+
if (!this.cache) {
82+
// eslint-disable-next-line no-undefined
83+
return undefined;
84+
}
85+
86+
if (!this.weakCache.has(cacheData.inputSource)) {
87+
if (cacheData.target === 'comments') {
88+
this.weakCache.set(cacheData.inputSource, cacheData.output);
89+
} else {
90+
this.weakCache.set(cacheData.inputSource, cacheData);
91+
}
92+
}
93+
94+
let data;
95+
96+
if (cacheData.target === 'comments') {
97+
data = {
98+
target: cacheData.target,
99+
value: cacheData.output.source(),
100+
};
101+
} else {
102+
data = {
103+
code: cacheData.code,
104+
name: cacheData.name,
105+
map: cacheData.map,
106+
input: cacheData.input,
107+
inputSourceMap: cacheData.inputSourceMap,
108+
};
109+
110+
if (cacheData.extractedCommentsSource) {
111+
data.extractedComments = cacheData.extractedCommentsSource.source();
112+
data.commentsFilename = cacheData.commentsFilename;
113+
}
114+
}
115+
116+
return cacache.put(this.cache, cacheData.cacheIdent, JSON.stringify(data));
34117
}
35118
}

‎src/Webpack5Cache.js

+25-15
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
11
export default class Cache {
2-
// eslint-disable-next-line no-unused-vars
3-
constructor(compilation, ignored) {
2+
constructor(compilation) {
43
this.cache = compilation.getCache('TerserWebpackPlugin');
54
}
65

7-
// eslint-disable-next-line class-methods-use-this
8-
isEnabled() {
9-
return true;
10-
}
11-
12-
async get(task) {
13-
// eslint-disable-next-line no-param-reassign
14-
task.cacheIdent = task.cacheIdent || `${task.name}`;
6+
async get(cacheData) {
157
// eslint-disable-next-line no-param-reassign
16-
task.cacheETag =
17-
task.cacheETag || this.cache.getLazyHashedEtag(task.assetSource);
8+
cacheData.eTag =
9+
cacheData.eTag || Array.isArray(cacheData.inputSource)
10+
? cacheData.inputSource
11+
.map((item) => this.cache.getLazyHashedEtag(item))
12+
.reduce((previousValue, currentValue) =>
13+
this.cache.mergeEtags(previousValue, currentValue)
14+
)
15+
: this.cache.getLazyHashedEtag(cacheData.inputSource);
1816

19-
return this.cache.getPromise(task.cacheIdent, task.cacheETag);
17+
return this.cache.getPromise(cacheData.name, cacheData.eTag);
2018
}
2119

22-
async store(task, data) {
23-
return this.cache.storePromise(task.cacheIdent, task.cacheETag, data);
20+
async store(cacheData) {
21+
let data;
22+
23+
if (cacheData.target === 'comments') {
24+
data = cacheData.output;
25+
} else {
26+
data = {
27+
source: cacheData.source,
28+
extractedCommentsSource: cacheData.extractedCommentsSource,
29+
commentsFilename: cacheData.commentsFilename,
30+
};
31+
}
32+
33+
return this.cache.storePromise(cacheData.name, cacheData.eTag, data);
2434
}
2535
}

0 commit comments

Comments
 (0)
Please sign in to comment.