Skip to content

Commit 4636e5a

Browse files
faceyspaceysokra
authored andcommitted
feat($weakContext): create "weak-context" asyncMode for universal rendering
1 parent b15bc28 commit 4636e5a

3 files changed

Lines changed: 46 additions & 2 deletions

File tree

lib/ContextModule.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,28 @@ class ContextModule extends Module {
140140
this.addBlock(block);
141141
}
142142

143+
} else if(this.async === 'weak-context') {
144+
145+
// store the dependences in a different key than `this.dependences`
146+
// to prevent them from being bundled in the parent
147+
this.weakDependencies = dependencies;
148+
149+
// if we are lazy create a new async dependency block per dependency
150+
// and add all blocks to this context
151+
dependencies.forEach((dep, idx) => {
152+
let chunkName = this.chunkName;
153+
154+
if(chunkName) {
155+
if(!/\[(index|request)\]/.test(chunkName))
156+
chunkName += "[index]";
157+
chunkName = chunkName.replace(/\[index\]/g, idx);
158+
chunkName = chunkName.replace(/\[request\]/g, Template.toPath(dep.userRequest));
159+
}
160+
const block = new AsyncDependenciesBlock(chunkName, dep.module, dep.loc);
161+
block.addDependency(dep);
162+
this.addBlock(block);
163+
});
164+
143165
} else {
144166

145167
// if we are lazy create a new async dependency block per dependency
@@ -307,6 +329,9 @@ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
307329
}
308330

309331
getSourceString(asyncMode, outputOptions, requestShortener) {
332+
if(asyncMode === 'weak-context') {
333+
return this.getSyncSource(this.weakDependencies, this.id);
334+
}
310335
if(asyncMode === "lazy") {
311336
if(this.blocks && this.blocks.length > 0) {
312337
return this.getLazySource(this.blocks, this.id);

lib/dependencies/RequireContextDependency.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@ const ContextDependency = require("./ContextDependency");
77
const ModuleDependencyTemplateAsRequireId = require("./ModuleDependencyTemplateAsRequireId");
88

99
class RequireContextDependency extends ContextDependency {
10-
constructor(request, recursive, regExp, range) {
10+
constructor(request, recursive, regExp, weak, chunkName, range) {
1111
super(request, recursive, regExp);
1212
this.range = range;
13+
14+
if (weak) {
15+
this.async = 'weak-context';
16+
this.chunkName = chunkName;
17+
}
1318
}
1419

1520
get type() {

lib/dependencies/RequireContextDependencyParserPlugin.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,21 @@ module.exports = class RequireContextDependencyParserPlugin {
1111
parser.plugin("call require.context", expr => {
1212
let regExp = /^\.\/.*$/;
1313
let recursive = true;
14+
let weak = false;
15+
let chunkName;
1416
switch(expr.arguments.length) {
17+
case 5:
18+
{
19+
const chunkNameExpr = parser.evaluateExpression(expr.arguments[4]);
20+
if(!chunkNameExpr.isString()) return;
21+
chunkName = chunkNameExpr.string;
22+
}
23+
case 4:
24+
{
25+
const weakExpr = parser.evaluateExpression(expr.arguments[3]);
26+
if(!weakExpr.isBoolean()) return;
27+
weak = weakExpr.bool;
28+
}
1529
case 3:
1630
{
1731
const regExpExpr = parser.evaluateExpression(expr.arguments[2]);
@@ -30,7 +44,7 @@ module.exports = class RequireContextDependencyParserPlugin {
3044
{
3145
const requestExpr = parser.evaluateExpression(expr.arguments[0]);
3246
if(!requestExpr.isString()) return;
33-
const dep = new RequireContextDependency(requestExpr.string, recursive, regExp, expr.range);
47+
const dep = new RequireContextDependency(requestExpr.string, recursive, regExp, weak, chunkName, expr.range);
3448
dep.loc = expr.loc;
3549
dep.optional = parser.scope.inTry;
3650
parser.state.current.addDependency(dep);

0 commit comments

Comments
 (0)