Skip to content

Commit 6148a15

Browse files
fix: rename single nested __webpack_export__ and __webpack_require__ (#20097)
1 parent 77aa3c8 commit 6148a15

4 files changed

Lines changed: 92 additions & 7 deletions

File tree

lib/CompatibilityPlugin.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,9 @@ class CompatibilityPlugin {
151151
parser.hooks.pattern
152152
.for(RuntimeGlobals.exports)
153153
.tap(PLUGIN_NAME, (pattern) => {
154+
const newName = "__nested_webpack_exports__";
154155
parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, {
155-
name: "__nested_webpack_exports__",
156+
name: newName,
156157
declaration: {
157158
updated: false,
158159
loc: /** @type {DependencyLocation} */ (pattern.loc),
@@ -161,6 +162,28 @@ class CompatibilityPlugin {
161162
});
162163
return true;
163164
});
165+
// Update single `var __webpack_require__ = {};` and `var __webpack_exports__ = {};` without expression
166+
parser.hooks.declarator.tap(PLUGIN_NAME, (declarator) => {
167+
if (
168+
declarator.id.type === "Identifier" &&
169+
(declarator.id.name === RuntimeGlobals.exports ||
170+
declarator.id.name === RuntimeGlobals.require)
171+
) {
172+
const { name, declaration } =
173+
/** @type {CompatibilitySettings} */ (
174+
parser.getTagData(
175+
declarator.id.name,
176+
nestedWebpackIdentifierTag
177+
)
178+
);
179+
if (!declaration.updated) {
180+
const dep = new ConstDependency(name, declaration.range);
181+
dep.loc = declaration.loc;
182+
parser.state.module.addPresentationalDependency(dep);
183+
declaration.updated = true;
184+
}
185+
}
186+
});
164187
parser.hooks.expression
165188
.for(nestedWebpackIdentifierTag)
166189
.tap(PLUGIN_NAME, (expr) => {
Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,63 @@
11
import { __webpack_require__ as namedUse } from './runtime-export-named'
22
import defaultUse from './runtime-export-default'
33
import { __webpack_require__ as namedDeclUse } from './runtime-export-decl'
4+
import { __webpack_require__ as objectRequire, __webpack_exports__ as objectExport } from './runtime-single-require-and-export'
45

56
it("should compile and run", () => {
67
expect(namedUse()).toBe(42);
78
expect(defaultUse()).toBe(42);
89
expect(namedDeclUse()).toBe(42);
10+
expect(objectRequire.foo).toBe(42);
11+
expect(objectExport.foo).toBe(42);
912

1013
const path = __non_webpack_require__('path')
1114
const fs = __non_webpack_require__('fs')
1215
{
13-
const content = fs.readFileSync(path.resolve(__dirname, './bundle0.js'), 'utf-8')
14-
const NESTED_RE = /__nestede_webpack_require_(.+)__/
15-
expect(content.match(NESTED_RE)[1].length).toBeGreaterThan(1)
16+
const content = fs.readFileSync(path.resolve(__dirname, './bundle0.js'), 'utf-8');
17+
const NESTED_RE = /__nested_webpack_require_([^_]+)__/g;
18+
expect(content.match(NESTED_RE).length).toBe(11);
1619
}
1720

1821
{
19-
const content = fs.readFileSync(path.resolve(__dirname, './bundle1.js'), 'utf-8')
20-
const NESTED_RE = /__nestede_webpack_require_(.+)__/
21-
expect(content.match(NESTED_RE)[1].length).toBeGreaterThan(1)
22+
const content = fs.readFileSync(path.resolve(__dirname, './bundle0.js'), 'utf-8');
23+
const NESTED_RE = /__[n]ested_webpack_exports__/g;
24+
expect(content.match(NESTED_RE).length).toBe(2);
25+
}
26+
27+
{
28+
const content = fs.readFileSync(path.resolve(__dirname, './bundle1.js'), 'utf-8');
29+
const NESTED_RE = /__nested_webpack_require_([^_]+)__/g;
30+
expect(content.match(NESTED_RE).length).toBe(11);
31+
}
32+
33+
{
34+
const content = fs.readFileSync(path.resolve(__dirname, './bundle1.js'), 'utf-8');
35+
const NESTED_RE = /__[n]ested_webpack_exports__/g;
36+
expect(content.match(NESTED_RE).length).toBe(2);
37+
}
38+
39+
{
40+
const content = fs.readFileSync(path.resolve(__dirname, './bundle2.js'), 'utf-8');
41+
const NESTED_RE = /__nested_webpack_require_([^_]+)__/g;
42+
console.log(content.match(NESTED_RE))
43+
expect(content.match(NESTED_RE).length).toBe(11);
44+
}
45+
46+
{
47+
const content = fs.readFileSync(path.resolve(__dirname, './bundle2.js'), 'utf-8');
48+
const NESTED_RE = /__[n]ested_webpack_exports__/g;
49+
expect(content.match(NESTED_RE).length).toBe(2);
50+
}
51+
52+
{
53+
const content = fs.readFileSync(path.resolve(__dirname, './bundle3.js'), 'utf-8');
54+
const NESTED_RE = /__nested_webpack_require_([^_]+)__/g;
55+
expect(content.match(NESTED_RE).length).toBe(11);
56+
}
57+
58+
{
59+
const content = fs.readFileSync(path.resolve(__dirname, './bundle3.js'), 'utf-8');
60+
const NESTED_RE = /__[n]ested_webpack_exports__/g;
61+
expect(content.match(NESTED_RE).length).toBe(2);
2262
}
2363
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var __webpack_require__ = { foo: 42 };
2+
var __webpack_exports__ = { foo: 42 };
3+
4+
class Foo {}
5+
6+
export { __webpack_require__, __webpack_exports__ };

test/configCases/module/consume-webpack-runtime/webpack.config.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,21 @@ module.exports = [
1717
optimization: {
1818
concatenateModules: false
1919
}
20+
},
21+
{
22+
node: false,
23+
mode: "production",
24+
devtool: "eval",
25+
optimization: {
26+
concatenateModules: true
27+
}
28+
},
29+
{
30+
node: false,
31+
mode: "production",
32+
devtool: "eval",
33+
optimization: {
34+
concatenateModules: false
35+
}
2036
}
2137
];

0 commit comments

Comments
 (0)