Skip to content

Commit a13b3d0

Browse files
authored
fix(rsc): skip client entry mismatch without injections (#14018)
1 parent 1708761 commit a13b3d0

9 files changed

Lines changed: 123 additions & 6 deletions

File tree

crates/rspack_plugin_rsc/src/client_plugin.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,13 @@ async fn make(&self, compilation: &mut Compilation) -> Result<()> {
638638

639639
for (entry_name, entry_state) in &plugin_state.entries {
640640
let client_modules = &entry_state.injected_client_entries;
641+
if entry_state.injected_client_entries.is_empty()
642+
&& !entry_state.has_css_imports_by_server_entry()
643+
&& entry_state.root_css_imports.is_empty()
644+
{
645+
continue;
646+
}
647+
641648
if compilation.entries.get(entry_name.as_ref()).is_none() {
642649
compilation.push_diagnostic(Diagnostic::error(
643650
"RSC Client Entry Mismatch".to_string(),
@@ -688,12 +695,12 @@ async fn make(&self, compilation: &mut Compilation) -> Result<()> {
688695
.add_dependency(dependency);
689696
}
690697

691-
#[allow(clippy::unwrap_used)]
692-
let entry_data = compilation.entries.get_mut(entry_name.as_ref()).unwrap();
693-
entry_data.dependencies.append(&mut entry_dependencies);
694-
entry_data
695-
.include_dependencies
696-
.append(&mut include_dependencies);
698+
if let Some(entry_data) = compilation.entries.get_mut(entry_name.as_ref()) {
699+
entry_data.dependencies.append(&mut entry_dependencies);
700+
entry_data
701+
.include_dependencies
702+
.append(&mut include_dependencies);
703+
}
697704
}
698705

699706
Ok(())
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const { experiments } = require('@rspack/core');
2+
3+
const { createPlugins, Layers } = experiments.rsc;
4+
const { ServerPlugin, ClientPlugin } = createPlugins();
5+
6+
const swcLoaderRule = {
7+
test: /\.jsx?$/,
8+
use: [
9+
{
10+
loader: 'builtin:swc-loader',
11+
options: {
12+
detectSyntax: 'auto',
13+
rspackExperiments: {
14+
reactServerComponents: true,
15+
},
16+
},
17+
},
18+
],
19+
};
20+
21+
module.exports = [
22+
{
23+
mode: 'production',
24+
target: 'node',
25+
output: {
26+
filename: 'server-[name].js',
27+
},
28+
entry: {
29+
main: {
30+
import: './src/framework/entry.ssr.js',
31+
},
32+
rscService: {
33+
import: './src/framework/rsc-service.rsc.js',
34+
},
35+
},
36+
resolve: {
37+
extensions: ['...', '.jsx'],
38+
},
39+
module: {
40+
rules: [
41+
swcLoaderRule,
42+
{
43+
resource: /[\\/]framework[\\/].*\.ssr\.js$/,
44+
layer: Layers.ssr,
45+
},
46+
{
47+
resource: /[\\/]framework[\\/].*\.rsc\.js$/,
48+
layer: Layers.rsc,
49+
resolve: {
50+
conditionNames: ['react-server', '...'],
51+
},
52+
},
53+
{
54+
issuerLayer: Layers.rsc,
55+
resolve: {
56+
conditionNames: ['react-server', '...'],
57+
},
58+
},
59+
],
60+
},
61+
plugins: [new ServerPlugin()],
62+
},
63+
{
64+
mode: 'production',
65+
target: 'web',
66+
output: {
67+
filename: 'client-[name].js',
68+
},
69+
entry: {
70+
main: {
71+
import: './src/framework/entry.client.js',
72+
},
73+
},
74+
resolve: {
75+
extensions: ['...', '.jsx'],
76+
},
77+
module: {
78+
rules: [swcLoaderRule],
79+
},
80+
plugins: [new ClientPlugin()],
81+
},
82+
];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"use server-entry";
2+
3+
export const App = () => "main";
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"use server-entry";
2+
3+
const rspackRsc = import.meta.rspackRsc;
4+
5+
export const RscService = () => rspackRsc.loadCss().length;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { App } from '../App';
2+
3+
export const value = App();
4+
5+
it('should build the main RSC entry', () => {
6+
expect(value).toBe('main');
7+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { value } from './entry.rsc';
2+
3+
export default value;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { RscService } from '../RscService';
2+
3+
export const value = RscService();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/** @type {import("../../../..").TConfigCaseConfig} */
2+
module.exports = {
3+
findBundle: function () {
4+
return ['server-main.js'];
5+
},
6+
};

0 commit comments

Comments
 (0)