Skip to content

Commit c9e25e5

Browse files
perf: cache new URL evaluate expression (webpack#19557)
1 parent d681b87 commit c9e25e5

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

lib/url/URLExpressionParserPlugin.js

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,39 @@ const isMetaUrl = (parser, arg) => {
5555
return true;
5656
};
5757

58+
/**
59+
* @type {WeakMap<NewExpressionNode, BasicEvaluatedExpression | undefined>}
60+
*/
61+
const getEvaluatedExprCache = new WeakMap();
62+
5863
/**
5964
* @param {NewExpressionNode} expr expression
6065
* @param {Parser} parser parser parser
61-
* @returns {BasicEvaluatedExpression | undefined} basicEvaluatedExpression
66+
* @returns {BasicEvaluatedExpression | undefined} basic evaluated expression
6267
*/
6368
const getEvaluatedExpr = (expr, parser) => {
64-
if (expr.arguments.length !== 2) return;
69+
let result = getEvaluatedExprCache.get(expr);
70+
if (result !== undefined) return result;
71+
72+
/**
73+
* @returns {BasicEvaluatedExpression | undefined} basic evaluated expression
74+
*/
75+
const evaluate = () => {
76+
if (expr.arguments.length !== 2) return;
77+
78+
const [arg1, arg2] = expr.arguments;
6579

66-
const [arg1, arg2] = expr.arguments;
80+
if (arg2.type !== "MemberExpression" || arg1.type === "SpreadElement")
81+
return;
82+
if (!isMetaUrl(parser, arg2)) return;
6783

68-
if (arg2.type !== "MemberExpression" || arg1.type === "SpreadElement") return;
84+
return parser.evaluateExpression(arg1);
85+
};
6986

70-
if (!isMetaUrl(parser, arg2)) return;
87+
result = evaluate();
88+
getEvaluatedExprCache.set(expr, result);
7189

72-
return parser.evaluateExpression(arg1);
90+
return result;
7391
};
7492

7593
class URLParserPlugin {

0 commit comments

Comments
 (0)