Skip to content

Commit

Permalink
Merge pull request #12132 from jakenorthey/feature/prioritize-eager-s…
Browse files Browse the repository at this point in the history
…hared-modules
  • Loading branch information
sokra committed Jan 18, 2021
2 parents ed60667 + 58d459b commit a08eca7
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 3 deletions.
2 changes: 1 addition & 1 deletion lib/sharing/ProvideSharedModule.js
Expand Up @@ -143,7 +143,7 @@ class ProvideSharedModule extends Module {
request: this._request,
runtimeRequirements
})
});`;
}${this._eager ? ", 1" : ""});`;
const sources = new Map();
const data = new Map();
data.set("share-init", [
Expand Down
4 changes: 2 additions & 2 deletions lib/sharing/ShareRuntimeModule.js
Expand Up @@ -83,11 +83,11 @@ class ShareRuntimeModule extends RuntimeModule {
)};`,
`var uniqueName = ${JSON.stringify(uniqueName || undefined)};`,
`var register = ${runtimeTemplate.basicFunction(
"name, version, factory",
"name, version, factory, eager",
[
"var versions = scope[name] = scope[name] || {};",
"var activeVersion = versions[version];",
"if(!activeVersion || !activeVersion.loaded && uniqueName > activeVersion.from) versions[version] = { get: factory, from: uniqueName };"
"if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };"
]
)};`,
`var initExternal = ${runtimeTemplate.basicFunction("id", [
Expand Down
75 changes: 75 additions & 0 deletions test/configCases/sharing/provide-eager-module/index.js
@@ -0,0 +1,75 @@
if (Math.random() < 0) {
require("common");
require("uncommon");
}

it("should overwrite non-eager shared module with eager shared module", async () => {
__webpack_require__.S = {
eagerOverrideNonEager: {
common: {
"1.0.0": {
eager: undefined, // any falsy value
from: "dashboard"
}
}
}
};
await __webpack_init_sharing__("eagerOverrideNonEager");
expect(
Object.keys(__webpack_share_scopes__["eagerOverrideNonEager"])
).toContain("common");
const commonModule = __webpack_share_scopes__.eagerOverrideNonEager.common;
expect(Object.keys(commonModule)).toContain("1.0.0");
expect(commonModule["1.0.0"].eager).toBe(true);
});
it("should not overwrite already shared eager module with non-eager module", async () => {
__webpack_require__.S = {
nonEagerDontOverrideEager: {
uncommon: {
"2.0.0": {
eager: 1, // any truthy value
from: "aaa"
}
}
}
};
await __webpack_init_sharing__("nonEagerDontOverrideEager");
expect(
Object.keys(__webpack_share_scopes__["nonEagerDontOverrideEager"])
).toContain("uncommon");
const uncommonModule =
__webpack_share_scopes__.nonEagerDontOverrideEager.uncommon;
expect(Object.keys(uncommonModule)).toContain("2.0.0");
expect(uncommonModule["2.0.0"].eager).toBe(1);
});
it("should prefer shared non-eager module from newer container", async () => {
__webpack_require__.S = {
newerNonEager: {
uncommon: {
"2.0.0": {
from: "appshell-1.0"
}
}
}
};
await __webpack_init_sharing__("newerNonEager");
const uncommonModule = __webpack_share_scopes__.newerNonEager.uncommon;
expect(Object.keys(uncommonModule)).toContain("2.0.0");
expect(uncommonModule["2.0.0"].from).toBe("appshell-2.0");
});
it("should prefer shared eager module from newer container", async () => {
__webpack_require__.S = {
newerEager: {
common: {
"1.0.0": {
from: "appshell-1.0",
eager: true
}
}
}
};
await __webpack_init_sharing__("newerEager");
const commonModule = __webpack_share_scopes__.newerEager.common;
expect(Object.keys(commonModule)).toContain("1.0.0");
expect(commonModule["1.0.0"].from).toBe("appshell-2.0");
});

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions test/configCases/sharing/provide-eager-module/package.json
@@ -0,0 +1,7 @@
{
"dependencies": {
"common": "*",
"uncommon": "*"
},
"name": "appshell-2.0"
}
43 changes: 43 additions & 0 deletions test/configCases/sharing/provide-eager-module/webpack.config.js
@@ -0,0 +1,43 @@
// eslint-disable-next-line node/no-unpublished-require
const { ProvideSharedPlugin } = require("../../../../").sharing;

/** @type {import("../../../../types").Configuration} */
module.exports = {
mode: "development",
plugins: [
new ProvideSharedPlugin({
shareScope: "eagerOverrideNonEager",
provides: {
common: {
shareKey: "common",
eager: true
}
}
}),
new ProvideSharedPlugin({
shareScope: "nonEagerDontOverrideEager",
provides: {
uncommon: {
shareKey: "uncommon"
}
}
}),
new ProvideSharedPlugin({
shareScope: "newerNonEager",
provides: {
uncommon: {
shareKey: "uncommon"
}
}
}),
new ProvideSharedPlugin({
shareScope: "newerEager",
provides: {
common: {
shareKey: "common",
eager: true
}
}
})
]
};

0 comments on commit a08eca7

Please sign in to comment.