Skip to content

Commit 5c489b6

Browse files
committed
Refactor harmony modules
separate side effects from specifier fixes TDZ for export let/const bigger bundles are caused by correct export const/let behavior BREAKING CHANGE: Internal have changed. Plugins could rely on them.
1 parent 1ff24a7 commit 5c489b6

26 files changed

+664
-444
lines changed

lib/DependenciesBlock.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ class DependenciesBlock {
3939
this.dependencies.push(dependency);
4040
}
4141

42+
removeDependency(dependency) {
43+
const idx = this.dependencies.indexOf(dependency);
44+
if(idx >= 0)
45+
this.dependencies.splice(idx, 1);
46+
}
47+
4248
updateHash(hash) {
4349
function updateHash(i) {
4450
i.updateHash(hash);

lib/dependencies/HarmonyAcceptDependency.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
Author Tobias Koppers @sokra
44
*/
55
"use strict";
6+
67
const NullDependency = require("./NullDependency");
7-
const makeHarmonyImportStatement = require("./HarmonyImportDependency").makeImportStatement;
8+
const HarmonyImportDependency = require("./HarmonyImportDependency");
89

910
class HarmonyAcceptDependency extends NullDependency {
1011
constructor(range, dependencies, hasCallback) {
@@ -22,12 +23,9 @@ class HarmonyAcceptDependency extends NullDependency {
2223
HarmonyAcceptDependency.Template = class HarmonyAcceptDependencyTemplate {
2324
apply(dep, source, outputOptions, requestShortener) {
2425
const content = dep.dependencies
25-
.map(dependency => makeHarmonyImportStatement(
26-
false,
27-
dependency,
28-
outputOptions,
29-
requestShortener
30-
)).join("");
26+
.filter(dependency => HarmonyImportDependency.Template.isImportEmitted(dependency, source))
27+
.map(dependency => dependency.getImportStatement(false, outputOptions, requestShortener))
28+
.join("");
3129

3230
if(dep.hasCallback) {
3331
source.insert(dep.range[0], `function(__WEBPACK_OUTDATED_DEPENDENCIES__) { ${content}(`);

lib/dependencies/HarmonyAcceptImportDependency.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
const HarmonyImportDependency = require("./HarmonyImportDependency");
77

88
class HarmonyAcceptImportDependency extends HarmonyImportDependency {
9-
constructor(request, importedVar, range) {
10-
super(request, importedVar, range);
9+
constructor(request, originModule, parserScope) {
10+
super(request, originModule, NaN, parserScope);
1111
}
1212

1313
get type() {

lib/dependencies/HarmonyDetectionParserPlugin.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict";
66

77
const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
8+
const HarmonyInitDependency = require("./HarmonyInitDependency");
89

910
module.exports = class HarmonyDetectionParserPlugin {
1011
apply(parser) {
@@ -14,8 +15,21 @@ module.exports = class HarmonyDetectionParserPlugin {
1415
});
1516
if(isHarmony) {
1617
const module = parser.state.module;
17-
const dep = new HarmonyCompatibilityDependency(module);
18-
dep.loc = {
18+
const compatDep = new HarmonyCompatibilityDependency(module);
19+
compatDep.loc = {
20+
start: {
21+
line: -1,
22+
column: 0
23+
},
24+
end: {
25+
line: -1,
26+
column: 0
27+
},
28+
index: -3
29+
};
30+
module.addDependency(compatDep);
31+
const initDep = new HarmonyInitDependency(module);
32+
initDep.loc = {
1933
start: {
2034
line: -1,
2135
column: 0
@@ -26,7 +40,8 @@ module.exports = class HarmonyDetectionParserPlugin {
2640
},
2741
index: -2
2842
};
29-
module.addDependency(dep);
43+
module.addDependency(initDep);
44+
parser.state.harmonyParserScope = parser.state.harmonyParserScope || {};
3045
module.meta.harmonyModule = true;
3146
module.strict = true;
3247
module.exportsArgument = "__webpack_exports__";

lib/dependencies/HarmonyExportDependencyParserPlugin.js

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
"use strict";
66

77
const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
8+
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
89
const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
910
const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
1011
const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
11-
const HarmonyImportDependency = require("./HarmonyImportDependency");
12-
const HarmonyModulesHelpers = require("./HarmonyModulesHelpers");
12+
const ConstDependency = require("./ConstDependency");
1313

1414
module.exports = class HarmonyExportDependencyParserPlugin {
1515
apply(parser) {
@@ -21,11 +21,15 @@ module.exports = class HarmonyExportDependencyParserPlugin {
2121
return true;
2222
});
2323
parser.plugin("export import", (statement, source) => {
24-
const dep = new HarmonyImportDependency(source, HarmonyModulesHelpers.getNewModuleVar(parser.state, source), statement.range);
25-
dep.loc = Object.create(statement.loc);
26-
dep.loc.index = -1;
27-
parser.state.current.addDependency(dep);
28-
parser.state.lastHarmonyImport = dep;
24+
parser.state.lastHarmonyImportOrder = (parser.state.lastHarmonyImportOrder || 0) + 1;
25+
const clearDep = new ConstDependency("", statement.range);
26+
clearDep.loc = Object.create(statement.loc);
27+
clearDep.loc.index = -1;
28+
parser.state.current.addDependency(clearDep);
29+
const sideEffectDep = new HarmonyImportSideEffectDependency(source, parser.state.module, parser.state.lastHarmonyImportOrder, parser.state.harmonyParserScope);
30+
sideEffectDep.loc = Object.create(statement.loc);
31+
sideEffectDep.loc.index = -1;
32+
parser.state.current.addDependency(sideEffectDep);
2933
return true;
3034
});
3135
parser.plugin("export expression", (statement, expr) => {
@@ -40,36 +44,22 @@ module.exports = class HarmonyExportDependencyParserPlugin {
4044
const rename = parser.scope.renames.get(id);
4145
let dep;
4246
if(rename === "imported var") {
43-
const settings = parser.state.harmonySpecifier[`$${id}`];
44-
dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, settings[0], settings[1], settings[2], name);
47+
const settings = parser.state.harmonySpecifier.get(id);
48+
dep = new HarmonyExportImportedSpecifierDependency(settings.source, parser.state.module, settings.sourceOrder, parser.state.harmonyParserScope, settings.id, name);
4549
} else {
46-
const immutable = statement.declaration && isImmutableStatement(statement.declaration);
47-
const hoisted = statement.declaration && isHoistedStatement(statement.declaration);
48-
dep = new HarmonyExportSpecifierDependency(parser.state.module, id, name, !immutable || hoisted ? -2 : (statement.range[1] + 0.5), immutable);
50+
dep = new HarmonyExportSpecifierDependency(parser.state.module, id, name);
4951
}
5052
dep.loc = Object.create(statement.loc);
5153
dep.loc.index = idx;
5254
parser.state.current.addDependency(dep);
5355
return true;
5456
});
5557
parser.plugin("export import specifier", (statement, source, id, name, idx) => {
56-
const dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, parser.state.lastHarmonyImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id, name);
58+
const dep = new HarmonyExportImportedSpecifierDependency(source, parser.state.module, parser.state.lastHarmonyImportOrder, parser.state.harmonyParserScope, id, name);
5759
dep.loc = Object.create(statement.loc);
5860
dep.loc.index = idx;
5961
parser.state.current.addDependency(dep);
6062
return true;
6163
});
6264
}
6365
};
64-
65-
function isImmutableStatement(statement) {
66-
if(statement.type === "FunctionDeclaration") return true;
67-
if(statement.type === "ClassDeclaration") return true;
68-
if(statement.type === "VariableDeclaration" && statement.kind === "const") return true;
69-
return false;
70-
}
71-
72-
function isHoistedStatement(statement) {
73-
if(statement.type === "FunctionDeclaration") return true;
74-
return false;
75-
}

0 commit comments

Comments
 (0)