Skip to content

Commit ea6d417

Browse files
fix(runtime): no new Function for loadEsmEntry (#3054)
1 parent a8dc7ef commit ea6d417

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

.changeset/ai-quick-eagle.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@module-federation/runtime": patch
3+
---
4+
5+
Replaced dynamic module import using `new Function` with a safer direct `import` call.
6+
7+
- Removed usage of `new Function` to execute dynamic import
8+
- Implemented a direct async import with `/* webpackIgnore: true */` for proper bundler handling

packages/runtime/src/utils/load.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ async function loadEsmEntry({
2020
return new Promise<RemoteEntryExports>((resolve, reject) => {
2121
try {
2222
if (!remoteEntryExports) {
23-
// eslint-disable-next-line no-eval
24-
new Function(
25-
'callbacks',
26-
`import("${entry}").then(callbacks[0]).catch(callbacks[1])`,
27-
)([resolve, reject]);
23+
import(/* webpackIgnore: true */ entry).then(resolve).catch(reject);
2824
} else {
2925
resolve(remoteEntryExports);
3026
}
@@ -44,11 +40,16 @@ async function loadSystemJsEntry({
4440
return new Promise<RemoteEntryExports>((resolve, reject) => {
4541
try {
4642
if (!remoteEntryExports) {
47-
// eslint-disable-next-line no-eval
48-
new Function(
49-
'callbacks',
50-
`System.import("${entry}").then(callbacks[0]).catch(callbacks[1])`,
51-
)([resolve, reject]);
43+
//@ts-ignore
44+
if (typeof __system_context__ === 'undefined') {
45+
//@ts-ignore
46+
System.import(entry).then(resolve).catch(reject);
47+
} else {
48+
new Function(
49+
'callbacks',
50+
`System.import("${entry}").then(callbacks[0]).catch(callbacks[1])`,
51+
)([resolve, reject]);
52+
}
5253
} else {
5354
resolve(remoteEntryExports);
5455
}

0 commit comments

Comments
 (0)