Skip to content

Commit adb7076

Browse files
authored
Merge pull request webpack#8469 from webpack/refactor/amd_buildin
Use RuntimeModule for AMDPlugin
2 parents 3afdccb + 1d90704 commit adb7076

File tree

7 files changed

+161
-123
lines changed

7 files changed

+161
-123
lines changed

buildin/amd-define.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

buildin/amd-options.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

lib/RuntimeGlobals.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ exports.hmrDownloadUpdateHandlers = "__webpack_require__.hmrC";
135135
*/
136136
exports.hmrModuleData = "__webpack_require__.hmrD";
137137

138+
/**
139+
* the AMD define function
140+
*/
141+
exports.amdDefine = "__webpack_require__.amdD";
142+
143+
/**
144+
* the AMD options
145+
*/
146+
exports.amdOptions = "__webpack_require__.amdO";
147+
138148
/**
139149
* the System polyfill object
140150
*/

lib/dependencies/AMDPlugin.js

Lines changed: 92 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,47 @@
55

66
"use strict";
77

8-
const path = require("path");
8+
const {
9+
approve,
10+
evaluateToIdentifier,
11+
evaluateToString,
12+
toConstantDependency
13+
} = require("../JavascriptParserHelpers");
14+
const NullFactory = require("../NullFactory");
15+
const RuntimeGlobals = require("../RuntimeGlobals");
16+
917
const AMDDefineDependency = require("./AMDDefineDependency");
18+
const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
1019
const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
1120
const AMDRequireContextDependency = require("./AMDRequireContextDependency");
21+
const AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
1222
const AMDRequireDependency = require("./AMDRequireDependency");
1323
const AMDRequireItemDependency = require("./AMDRequireItemDependency");
24+
const {
25+
AMDDefineRuntimeModule,
26+
AMDOptionsRuntimeModule
27+
} = require("./AMDRuntimeModules");
28+
const ConstDependency = require("./ConstDependency");
1429
const LocalModuleDependency = require("./LocalModuleDependency");
1530
const UnsupportedDependency = require("./UnsupportedDependency");
1631

17-
const NullFactory = require("../NullFactory");
18-
19-
const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
20-
const AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
21-
22-
const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
23-
24-
const {
25-
approve,
26-
evaluateToIdentifier,
27-
evaluateToString,
28-
toConstantDependency
29-
} = require("../JavascriptParserHelpers");
32+
/** @typedef {import("../../declarations/WebpackOptions").ModuleOptions} ModuleOptions */
33+
/** @typedef {import("../Compiler")} Compiler */
3034

3135
class AMDPlugin {
36+
/**
37+
* @param {ModuleOptions} options the plugin options
38+
* @param {Record<string, any>} amdOptions the AMD options
39+
*/
3240
constructor(options, amdOptions) {
33-
this.amdOptions = amdOptions;
3441
this.options = options;
42+
this.amdOptions = amdOptions;
3543
}
3644

45+
/**
46+
* @param {Compiler} compiler the compiler instance
47+
* @returns {void}
48+
*/
3749
apply(compiler) {
3850
const options = this.options;
3951
const amdOptions = this.amdOptions;
@@ -103,44 +115,76 @@ class AMDPlugin {
103115
new LocalModuleDependency.Template()
104116
);
105117

118+
compilation.hooks.runtimeRequirementInModule
119+
.for(RuntimeGlobals.amdDefine)
120+
.tap("AMDPlugin", (module, set) => {
121+
set.add(RuntimeGlobals.require);
122+
});
123+
124+
compilation.hooks.runtimeRequirementInModule
125+
.for(RuntimeGlobals.amdOptions)
126+
.tap("AMDPlugin", (module, set) => {
127+
set.add(RuntimeGlobals.require);
128+
});
129+
130+
compilation.hooks.runtimeRequirementInTree
131+
.for(RuntimeGlobals.amdDefine)
132+
.tap("AMDPlugin", (chunk, set) => {
133+
compilation.addRuntimeModule(chunk, new AMDDefineRuntimeModule());
134+
});
135+
136+
compilation.hooks.runtimeRequirementInTree
137+
.for(RuntimeGlobals.amdOptions)
138+
.tap("AMDPlugin", (chunk, set) => {
139+
compilation.addRuntimeModule(
140+
chunk,
141+
new AMDOptionsRuntimeModule(amdOptions)
142+
);
143+
});
144+
106145
const handler = (parser, parserOptions) => {
107146
if (parserOptions.amd !== undefined && !parserOptions.amd) return;
108147

109-
const setExpressionToModule = (outerExpr, module) => {
110-
parser.hooks.expression.for(outerExpr).tap("AMDPlugin", expr => {
111-
const dep = new AMDRequireItemDependency(module, expr.range);
112-
dep.userRequest = outerExpr;
113-
dep.loc = expr.loc;
114-
parser.state.current.addDependency(dep);
115-
return true;
116-
});
148+
const tapOptionsHooks = optionExpr => {
149+
parser.hooks.expression
150+
.for(optionExpr)
151+
.tap(
152+
"AMDPlugin",
153+
toConstantDependency(parser, RuntimeGlobals.amdOptions, [
154+
RuntimeGlobals.amdOptions
155+
])
156+
);
157+
parser.hooks.evaluateIdentifier
158+
.for(optionExpr)
159+
.tap("AMDPlugin", evaluateToIdentifier(optionExpr, true));
160+
parser.hooks.evaluateTypeof
161+
.for(optionExpr)
162+
.tap("AMDPlugin", evaluateToString("object"));
163+
parser.hooks.typeof
164+
.for(optionExpr)
165+
.tap(
166+
"AMDPlugin",
167+
toConstantDependency(parser, JSON.stringify("object"))
168+
);
117169
};
118170

119171
new AMDRequireDependenciesBlockParserPlugin(options).apply(parser);
120172
new AMDDefineDependencyParserPlugin(options).apply(parser);
121173

122-
setExpressionToModule("require.amd", "!!webpack amd options");
123-
setExpressionToModule("define.amd", "!!webpack amd options");
124-
setExpressionToModule("define", "!!webpack amd define");
174+
tapOptionsHooks("define.amd");
175+
tapOptionsHooks("require.amd");
176+
tapOptionsHooks("__webpack_amd_options__");
125177

126-
parser.hooks.expression
127-
.for("__webpack_amd_options__")
128-
.tap(
129-
"AMDPlugin",
130-
toConstantDependency(parser, JSON.stringify(amdOptions))
178+
parser.hooks.expression.for("define").tap("AMDPlugin", expr => {
179+
const dep = new ConstDependency(
180+
RuntimeGlobals.amdDefine,
181+
expr.range,
182+
[RuntimeGlobals.amdDefine]
131183
);
132-
parser.hooks.evaluateTypeof
133-
.for("define.amd")
134-
.tap("AMDPlugin", evaluateToString(typeof amdOptions));
135-
parser.hooks.evaluateTypeof
136-
.for("require.amd")
137-
.tap("AMDPlugin", evaluateToString(typeof amdOptions));
138-
parser.hooks.evaluateIdentifier
139-
.for("define.amd")
140-
.tap("AMDPlugin", evaluateToIdentifier("define.amd", true));
141-
parser.hooks.evaluateIdentifier
142-
.for("require.amd")
143-
.tap("AMDPlugin", evaluateToIdentifier("require.amd", true));
184+
dep.loc = expr.loc;
185+
parser.state.current.addDependency(dep);
186+
return true;
187+
});
144188
parser.hooks.typeof
145189
.for("define")
146190
.tap(
@@ -152,11 +196,11 @@ class AMDPlugin {
152196
.tap("AMDPlugin", evaluateToString("function"));
153197
parser.hooks.canRename.for("define").tap("AMDPlugin", approve);
154198
parser.hooks.rename.for("define").tap("AMDPlugin", expr => {
155-
const dep = new AMDRequireItemDependency(
156-
"!!webpack amd define",
157-
expr.range
199+
const dep = new ConstDependency(
200+
RuntimeGlobals.amdDefine,
201+
expr.range,
202+
[RuntimeGlobals.amdDefine]
158203
);
159-
dep.userRequest = "define";
160204
dep.loc = expr.loc;
161205
parser.state.current.addDependency(dep);
162206
return false;
@@ -180,54 +224,7 @@ class AMDPlugin {
180224
.tap("AMDPlugin", handler);
181225
}
182226
);
183-
compiler.hooks.afterResolvers.tap("AMDPlugin", () => {
184-
compiler.resolverFactory.hooks.resolver
185-
.for("normal")
186-
.tap("AMDPlugin", resolver => {
187-
new AliasPlugin(
188-
"described-resolve",
189-
{
190-
name: "amdefine",
191-
alias: path.join(
192-
__dirname,
193-
"..",
194-
"..",
195-
"buildin",
196-
"amd-define.js"
197-
)
198-
},
199-
"resolve"
200-
).apply(resolver);
201-
new AliasPlugin(
202-
"described-resolve",
203-
{
204-
name: "webpack amd options",
205-
alias: path.join(
206-
__dirname,
207-
"..",
208-
"..",
209-
"buildin",
210-
"amd-options.js"
211-
)
212-
},
213-
"resolve"
214-
).apply(resolver);
215-
new AliasPlugin(
216-
"described-resolve",
217-
{
218-
name: "webpack amd define",
219-
alias: path.join(
220-
__dirname,
221-
"..",
222-
"..",
223-
"buildin",
224-
"amd-define.js"
225-
)
226-
},
227-
"resolve"
228-
).apply(resolver);
229-
});
230-
});
231227
}
232228
}
229+
233230
module.exports = AMDPlugin;

lib/dependencies/AMDRuntimeModules.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
*/
4+
5+
"use strict";
6+
7+
const RuntimeGlobals = require("../RuntimeGlobals");
8+
const RuntimeModule = require("../RuntimeModule");
9+
const Template = require("../Template");
10+
11+
class AMDDefineRuntimeModule extends RuntimeModule {
12+
constructor() {
13+
super("amd define");
14+
}
15+
16+
/**
17+
* @returns {string} runtime code
18+
*/
19+
generate() {
20+
return Template.asString([
21+
`${RuntimeGlobals.amdDefine} = function () {`,
22+
Template.indent("throw new Error('define cannot be used indirect');"),
23+
"};"
24+
]);
25+
}
26+
}
27+
28+
class AMDOptionsRuntimeModule extends RuntimeModule {
29+
/**
30+
* @param {Record<string, boolean | number | string>} options the AMD options
31+
*/
32+
constructor(options) {
33+
super("amd options");
34+
this.options = options;
35+
}
36+
37+
/**
38+
* @returns {string} runtime code
39+
*/
40+
generate() {
41+
return Template.asString([
42+
`${RuntimeGlobals.amdOptions} = ${JSON.stringify(this.options)};`
43+
]);
44+
}
45+
}
46+
47+
exports.AMDDefineRuntimeModule = AMDDefineRuntimeModule;
48+
exports.AMDOptionsRuntimeModule = AMDOptionsRuntimeModule;

lib/dependencies/SystemPlugin.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const {
1313
const RuntimeGlobals = require("../RuntimeGlobals");
1414
const WebpackError = require("../WebpackError");
1515
const ConstDependency = require("./ConstDependency");
16-
const ProvidedDependency = require("./ProvidedDependency");
1716
const SystemRuntimeModule = require("./SystemRuntimeModule");
1817

1918
class SystemPlugin {
@@ -25,15 +24,6 @@ class SystemPlugin {
2524
compiler.hooks.compilation.tap(
2625
"SystemPlugin",
2726
(compilation, { normalModuleFactory }) => {
28-
compilation.dependencyFactories.set(
29-
ProvidedDependency,
30-
normalModuleFactory
31-
);
32-
compilation.dependencyTemplates.set(
33-
ProvidedDependency,
34-
new ProvidedDependency.Template()
35-
);
36-
3727
compilation.hooks.runtimeRequirementInModule
3828
.for(RuntimeGlobals.system)
3929
.tap("SystemPlugin", (module, set) => {

lib/dependencies/SystemRuntimeModule.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,6 @@ const RuntimeGlobals = require("../RuntimeGlobals");
99
const RuntimeModule = require("../RuntimeModule");
1010
const Template = require("../Template");
1111

12-
const SystemPolyfill = Template.asString([
13-
`${RuntimeGlobals.system} = {`,
14-
Template.indent([
15-
"import: function () {",
16-
Template.indent([
17-
"throw new Error('System.import cannot be used indirectly');"
18-
]),
19-
"}"
20-
]),
21-
"}"
22-
]);
23-
2412
class SystemRuntimeModule extends RuntimeModule {
2513
constructor() {
2614
super("system");
@@ -30,7 +18,17 @@ class SystemRuntimeModule extends RuntimeModule {
3018
* @returns {string} runtime code
3119
*/
3220
generate() {
33-
return SystemPolyfill;
21+
return Template.asString([
22+
`${RuntimeGlobals.system} = {`,
23+
Template.indent([
24+
"import: function () {",
25+
Template.indent(
26+
"throw new Error('System.import cannot be used indirectly');"
27+
),
28+
"}"
29+
]),
30+
"};"
31+
]);
3432
}
3533
}
3634

0 commit comments

Comments
 (0)