Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ede7e89
feat(modern-js-plugin-v3): port RSC bridge support into core
ScriptedAlchemy Feb 21, 2026
5c1d98b
chore(modern-js-plugin-v3): refresh lockfile for server-core dep
ScriptedAlchemy Feb 21, 2026
16742e3
fix(modern-js-plugin-v3): use server-core as peer dependency
ScriptedAlchemy Feb 21, 2026
7dded32
chore(modern-js-plugin-v3): refresh lockfile
ScriptedAlchemy Feb 21, 2026
021bc56
fix(modern-js-plugin-v3): resolve server-core from app runtime
ScriptedAlchemy Feb 21, 2026
76b126d
fix(retry-plugin): type loadEntryError args
ScriptedAlchemy Feb 21, 2026
d17d2c9
fix(modern-js-plugin-v3): avoid rsc bridge load deadlock
ScriptedAlchemy Feb 21, 2026
c160c7a
fix(sdk,modern-js-plugin-v3): stabilize node async-startup remote loa…
ScriptedAlchemy Feb 21, 2026
b7d17c6
fix(modern-js-plugin-v3): restore RSC runtime parity for host/remote
ScriptedAlchemy Feb 21, 2026
7e4148f
fix(modern-js-plugin-v3): preserve RSC resolve behavior
ScriptedAlchemy Feb 24, 2026
42d627a
fix(modernjs-rsc): sync lockfile for CI installs
ScriptedAlchemy Feb 24, 2026
ab21e4d
Merge remote-tracking branch 'origin/main' into feat/modernjs-rsc
ScriptedAlchemy Feb 24, 2026
e18f07b
fix(dts-plugin): align workspace entrypoints and RawSource typing
ScriptedAlchemy Feb 24, 2026
19390c0
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Feb 25, 2026
d2c332a
fix(sdk): align package entrypoints with emitted artifacts
ScriptedAlchemy Feb 25, 2026
f91dd7b
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Feb 25, 2026
0ef1754
fix(module-federation): tolerate metro serve shutdown exit in e2e script
ScriptedAlchemy Feb 25, 2026
44d5372
revert(modernjs-rsc): drop unrelated metro e2e shutdown behavior change
ScriptedAlchemy Feb 26, 2026
1957647
Merge origin/main into feat/modernjs-rsc
ScriptedAlchemy Feb 26, 2026
aef146f
Merge origin/main into feat/modernjs-rsc
ScriptedAlchemy Feb 26, 2026
9682ca4
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Feb 27, 2026
0eac7a1
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Feb 27, 2026
b49a069
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Feb 28, 2026
3d9f8a8
chore(modern-js-plugin-v3): remove global webpack require fallback
ScriptedAlchemy Feb 28, 2026
9677bd6
Merge origin/main into feat/modernjs-rsc
ScriptedAlchemy Feb 28, 2026
c0b4857
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Mar 2, 2026
a325c2e
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Mar 3, 2026
0068d40
Merge branch 'main' into feat/modernjs-rsc
ScriptedAlchemy Mar 5, 2026
a41e7ab
fix(modern-js-plugin-v3): harden RSC bridge runtime merge (#4484)
ScriptedAlchemy Mar 8, 2026
486a591
Merge remote-tracking branch 'origin/main' into feat/modernjs-rsc
ScriptedAlchemy Mar 9, 2026
a317b3f
Merge remote-tracking branch 'origin/main' into feat/modernjs-rsc
ScriptedAlchemy Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/tidy-bananas-relax.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@module-federation/modern-js-v3': patch
'@module-federation/sdk': patch
---

Improve Node-side async startup remote loading by stripping browser HMR bootstrap calls, normalizing async startup container exports, and resolving var/global container shapes reliably for RSC federation flows.
16 changes: 16 additions & 0 deletions apps/modernjs-rsc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# modernjs-rsc

Minimal ModernJS + Module Federation RSC example in `apps/`.

## Run

```bash
pnpm nx run modernjs-rsc:serve
```

Open `http://localhost:3060`.

This app enables `experiments.rsc` + `experiments.asyncStartup` and exposes:

- `modernjs_rsc/ServerMessage`
- `modernjs_rsc/ClientCounter`
13 changes: 13 additions & 0 deletions apps/modernjs-rsc/modern.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { appTools, defineConfig } from '@modern-js/app-tools';
import { moduleFederationPlugin } from '@module-federation/modern-js-v3';

export default defineConfig({
server: {
port: 3060,
ssr: {
mode: 'stream',
},
rsc: true,
},
plugins: [appTools(), moduleFederationPlugin()],
});
21 changes: 21 additions & 0 deletions apps/modernjs-rsc/module-federation.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { createModuleFederationConfig } from '@module-federation/modern-js-v3';

export default createModuleFederationConfig({
name: 'modernjs_rsc',
manifest: {
filePath: 'static',
},
filename: 'static/remoteEntry.js',
exposes: {
'./ServerMessage': './src/server/ServerMessage.tsx',
'./ClientCounter': './src/client/ClientCounter.tsx',
},
shared: {
react: { singleton: true },
'react-dom': { singleton: true },
},
experiments: {
asyncStartup: true,
rsc: true,
},
});
30 changes: 30 additions & 0 deletions apps/modernjs-rsc/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "modernjs-rsc",
"private": true,
"version": "0.1.0",
"scripts": {
"dev": "modern dev",
"build": "modern build",
"start": "modern start",
"serve": "modern serve",
"lint": "modern lint"
},
"engines": {
"node": ">=16.18.1"
},
"dependencies": {
"@babel/runtime": "7.28.2",
"@modern-js/runtime": "3.0.1",
"@module-federation/modern-js-v3": "workspace:*",
"react": "~18.3.1",
"react-dom": "~18.3.1"
},
"devDependencies": {
"@modern-js/app-tools": "3.0.1",
"@modern-js/tsconfig": "3.0.1",
"@types/node": "^20.19.5",
"@types/react": "~18.2.0",
"@types/react-dom": "~18.3.0",
"typescript": "~5.0.4"
}
}
44 changes: 44 additions & 0 deletions apps/modernjs-rsc/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"name": "modernjs-rsc",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "apps/modernjs-rsc/src",
"projectType": "application",
"tags": [],
"implicitDependencies": ["typescript"],
"targets": {
"build": {
"executor": "nx:run-commands",
"options": {
"dependsOn": [
{
"target": "build",
"dependencies": true
}
],
"commands": [
{
"command": "cd apps/modernjs-rsc; pnpm run build",
"forwardAllArgs": true
}
]
}
},
"serve": {
"executor": "nx:run-commands",
"options": {
"dependsOn": [
{
"target": "build",
"dependencies": true
}
],
"commands": [
{
"command": "cd apps/modernjs-rsc; pnpm run dev",
"forwardAllArgs": false
}
]
}
}
}
}
18 changes: 18 additions & 0 deletions apps/modernjs-rsc/src/client/ClientCounter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use client';

import { useState } from 'react';

const ClientCounter = () => {
const [count, setCount] = useState(0);

return (
<section style={{ marginTop: 16 }}>
<h2>Client Component</h2>
<button type="button" onClick={() => setCount((value) => value + 1)}>
Count: {count}
</button>
</section>
);
};

export default ClientCounter;
4 changes: 4 additions & 0 deletions apps/modernjs-rsc/src/modern-app-env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/// <reference types='@modern-js/app-tools/types' />
/// <reference types='@modern-js/runtime/types' />
/// <reference types='@modern-js/runtime/types/router' />
/// <reference types='@module-federation/modern-js-v3/types' />
15 changes: 15 additions & 0 deletions apps/modernjs-rsc/src/routes/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import ClientCounter from '../client/ClientCounter';
import ServerMessage from '../server/ServerMessage';

const Page = async () => {
return (
<main style={{ padding: 24, fontFamily: 'sans-serif' }}>
<h1>ModernJS RSC + Module Federation</h1>
<p>This example exposes both server and client components.</p>
<ServerMessage />
<ClientCounter />
</main>
);
};

export default Page;
18 changes: 18 additions & 0 deletions apps/modernjs-rsc/src/server/ServerMessage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const wait = (ms: number) =>
new Promise<void>((resolve) => {
setTimeout(resolve, ms);
});

const ServerMessage = async () => {
await wait(20);
const renderedAt = new Date().toISOString();

return (
<section style={{ marginTop: 16 }}>
<h2>Server Component</h2>
<p>Rendered at: {renderedAt}</p>
</section>
);
};

export default ServerMessage;
17 changes: 17 additions & 0 deletions apps/modernjs-rsc/tsconfig.app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"types": ["node", "express"],
"target": "ES2015",
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts", "src/**/*.tsx"]
}
14 changes: 14 additions & 0 deletions apps/modernjs-rsc/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extends": "@modern-js/tsconfig/base",
"compilerOptions": {
"declaration": false,
"jsx": "preserve",
"baseUrl": "./",
"paths": {
"@/*": ["./src/*"],
"*": ["./@mf-types/*"]
}
},
"include": ["src", "config", "modern.config.ts", "./@mf-types"],
"exclude": ["**/node_modules"]
}
12 changes: 8 additions & 4 deletions packages/bridge/bridge-react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.es.js",
"require": "./dist/index.cjs.js"
"require": "./dist/index.cjs.js",
"default": "./dist/index.es.js"
},
"./base": {
"types": "./dist/base.d.ts",
Expand Down Expand Up @@ -64,17 +65,20 @@
"./lazy-utils": {
"types": "./dist/lazy-utils.d.ts",
"import": "./dist/lazy-utils.es.js",
"require": "./dist/lazy-utils.cjs.js"
"require": "./dist/lazy-utils.cjs.js",
"default": "./dist/lazy-utils.es.js"
},
"./data-fetch-utils": {
"types": "./dist/data-fetch-utils.d.ts",
"import": "./dist/data-fetch-utils.es.js",
"require": "./dist/data-fetch-utils.cjs.js"
"require": "./dist/data-fetch-utils.cjs.js",
"default": "./dist/data-fetch-utils.es.js"
},
"./data-fetch-server-middleware": {
"types": "./dist/data-fetch-server-middleware.d.ts",
"import": "./dist/data-fetch-server-middleware.es.js",
"require": "./dist/data-fetch-server-middleware.cjs.js"
"require": "./dist/data-fetch-server-middleware.cjs.js",
"default": "./dist/data-fetch-server-middleware.es.js"
},
"./lazy-load-component-plugin": {
"types": "./dist/lazy-load-component-plugin.d.ts",
Expand Down
4 changes: 2 additions & 2 deletions packages/dts-plugin/src/core/lib/typeScriptCompiler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import fse from 'fs-extra';
const { ensureDirSync, writeFileSync, existsSync } = fse;
import fsExtra from 'fs-extra';
import crypto from 'crypto';
import { stat, readdir, writeFile, rm, readFile } from 'fs/promises';
import {
Expand All @@ -24,6 +23,7 @@ import { TsConfigJson } from '../interfaces/TsConfigJson';
import { logger } from '../../server';

const STARTS_WITH_SLASH = /^\//;
const { ensureDirSync, writeFileSync, existsSync } = fsExtra;

const DEFINITION_FILE_EXTENSION = '.d.ts';

Expand Down
Loading
Loading