Skip to content

Commit c01715a

Browse files
authoredMar 17, 2025··
fix(rspack): support getPublicPath (#3422)
1 parent 790bdea commit c01715a

File tree

10 files changed

+803
-1812
lines changed

10 files changed

+803
-1812
lines changed
 

‎.changeset/shiny-geckos-switch.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@module-federation/rspack': patch
3+
---
4+
5+
fix(rspack): support getPublicPath

‎apps/router-demo/router-remote3-2003/rsbuild.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default defineConfig({
3131
'./export-app': './src/export-app.ts',
3232
},
3333
shared: ['vue', 'vue-router'],
34+
getPublicPath: `return 'http://localhost:2003/'`,
3435
}),
3536
],
3637
});

‎apps/router-demo/router-remote4-2004/rsbuild.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export default defineConfig({
5050
'./export-app': './src/export-App.tsx',
5151
},
5252
shared: ['react', 'react-dom'],
53+
getPublicPath: `function(){return 'http://localhost:2004/'}`,
5354
}),
5455
],
5556
});

‎packages/enhanced/src/lib/container/ModuleFederationPlugin.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import SharePlugin from '../sharing/SharePlugin';
1919
import ContainerPlugin from './ContainerPlugin';
2020
import ContainerReferencePlugin from './ContainerReferencePlugin';
2121
import FederationRuntimePlugin from './runtime/FederationRuntimePlugin';
22-
import { RemoteEntryPlugin } from './runtime/RemoteEntryPlugin';
22+
import { RemoteEntryPlugin } from '@module-federation/rspack/remote-entry-plugin';
2323
import { ExternalsType } from 'webpack/declarations/WebpackOptions';
2424
import StartupChunkDependenciesPlugin from '../startup/MfStartupChunkDependenciesPlugin';
2525
import FederationModulesPlugin from './runtime/FederationModulesPlugin';
@@ -69,6 +69,7 @@ class ModuleFederationPlugin implements WebpackPluginInstance {
6969
// must before ModuleFederationPlugin
7070
if (options.getPublicPath && options.name) {
7171
new RemoteEntryPlugin(options.name, options.getPublicPath).apply(
72+
// @ts-ignore
7273
compiler,
7374
);
7475
}

‎packages/rspack/package.json

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"module": "./dist/index.esm.mjs",
2525
"types": "./dist/index.cjs.d.ts",
2626
"dependencies": {
27+
"btoa": "1.2.1",
2728
"@module-federation/bridge-react-webpack-plugin": "workspace:*",
2829
"@module-federation/dts-plugin": "workspace:*",
2930
"@module-federation/managers": "workspace:*",
@@ -45,6 +46,11 @@
4546
"types": "./dist/plugin.cjs.d.ts",
4647
"import": "./dist/plugin.esm.mjs",
4748
"require": "./dist/plugin.cjs.js"
49+
},
50+
"./remote-entry-plugin": {
51+
"types": "./dist/remote-entry-plugin.cjs.d.ts",
52+
"import": "./dist/remote-entry-plugin.esm.mjs",
53+
"require": "./dist/remote-entry-plugin.cjs.js"
4854
}
4955
},
5056
"typesVersions": {
@@ -54,6 +60,9 @@
5460
],
5561
"plugin": [
5662
"./dist/plugin.cjs.d.ts"
63+
],
64+
"remote-entry-plugin": [
65+
"./dist/remote-entry-plugin.cjs.d.ts"
5766
]
5867
}
5968
},

‎packages/rspack/rollup.config.js

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ module.exports = (rollupConfig, projectOptions) => {
99
process.cwd(),
1010
'./packages/rspack/src/ModuleFederationPlugin.ts',
1111
);
12+
rollupConfig.input['remote-entry-plugin'] = path.resolve(
13+
process.cwd(),
14+
'./packages/rspack/src/RemoteEntryPlugin.ts',
15+
);
1216

1317
if (Array.isArray(rollupConfig.output)) {
1418
rollupConfig.output = rollupConfig.output.map((c) => ({

‎packages/rspack/src/ModuleFederationPlugin.ts

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { DtsPlugin } from '@module-federation/dts-plugin';
1313
import ReactBridgePlugin from '@module-federation/bridge-react-webpack-plugin';
1414
import path from 'node:path';
1515
import fs from 'node:fs';
16+
import { RemoteEntryPlugin } from './RemoteEntryPlugin';
1617

1718
type ExcludeFalse<T> = T extends undefined | false ? never : T;
1819
type SplitChunks = Compiler['options']['optimization']['splitChunks'];
@@ -75,6 +76,13 @@ export class ModuleFederationPlugin implements RspackPluginInstance {
7576
this._patchChunkSplit(compiler, options.name);
7677
}
7778

79+
// must before ModuleFederationPlugin
80+
if (options.getPublicPath && options.name) {
81+
new RemoteEntryPlugin(options.name, options.getPublicPath).apply(
82+
compiler,
83+
);
84+
}
85+
7886
if (options.experiments?.provideExternalRuntime) {
7987
if (options.exposes) {
8088
throw new Error(

‎packages/enhanced/src/lib/container/runtime/RemoteEntryPlugin.ts ‎packages/rspack/src/RemoteEntryPlugin.ts

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
1-
import type { Compiler, WebpackPluginInstance } from 'webpack';
1+
import type { Compiler, RspackPluginInstance } from '@rspack/core';
2+
// @ts-ignore
23
import pBtoa from 'btoa';
34

4-
export class RemoteEntryPlugin implements WebpackPluginInstance {
5+
const charMap: Record<string, string> = {
6+
'<': '\\u003C',
7+
'>': '\\u003E',
8+
'/': '\\u002F',
9+
'\\': '\\\\',
10+
'\b': '\\b',
11+
'\f': '\\f',
12+
'\n': '\\n',
13+
'\r': '\\r',
14+
'\t': '\\t',
15+
'\0': '\\0',
16+
'\u2028': '\\u2028',
17+
'\u2029': '\\u2029',
18+
};
19+
20+
function escapeUnsafeChars(str: string) {
21+
return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g, (x) => charMap[x]);
22+
}
23+
24+
export class RemoteEntryPlugin implements RspackPluginInstance {
525
readonly name = 'VmokRemoteEntryPlugin';
626
private _name: string;
727
private _getPublicPath: string;
@@ -13,12 +33,14 @@ export class RemoteEntryPlugin implements WebpackPluginInstance {
1333

1434
apply(compiler: Compiler): void {
1535
let code;
36+
const sanitizedPublicPath = escapeUnsafeChars(this._getPublicPath);
37+
1638
if (!this._getPublicPath.startsWith('function')) {
1739
code = `${
1840
compiler.webpack.RuntimeGlobals.publicPath
19-
} = new Function(${JSON.stringify(this._getPublicPath)})()`;
41+
} = new Function(${JSON.stringify(sanitizedPublicPath)})()`;
2042
} else {
21-
code = `(${this._getPublicPath})()`;
43+
code = `(${sanitizedPublicPath}())`;
2244
}
2345
const base64Code = pBtoa(code);
2446
const dataUrl = `data:text/javascript;base64,${base64Code}`;

‎packages/runtime-plugins/inject-external-runtime-core-plugin/project.json

-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
"tsConfig": "packages/runtime-plugins/inject-external-runtime-core-plugin/tsconfig.lib.json",
1515
"assets": [],
1616
"project": "packages/runtime-plugins/inject-external-runtime-core-plugin/package.json",
17-
"additionalEntryPoints": [
18-
"packages/runtime-plugins/inject-external-runtime-core-plugin/src/normalize-webpack-path.ts"
19-
],
2017
"rollupConfig": "packages/runtime-plugins/inject-external-runtime-core-plugin/rollup.config.js",
2118
"compiler": "swc",
2219
"generatePackageJson": false,

‎pnpm-lock.yaml

+747-1,804
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.