Skip to content

Commit 2f11ffe

Browse files
ihabadhamclaude
andcommitted
Create rscWebpackConfig.js for the RSC bundle
Derives from serverWebpackConfig(true) — inherits target:'node', libraryTarget:'commonjs2', CSS filtering, and all server transforms. Adds three RSC-specific pieces: 1. RSC WebpackLoader pushed into the babel rule's use array (runs before babel per right-to-left order) to detect 'use client' directives in raw source and replace client exports with registerClientReference proxies. 2. react-server resolve condition so React's RSC-specific entry points are used. 3. react-dom/server aliased to false (RSC bundles generate Flight payloads, not HTML; importing react-dom/server causes a runtime error). Loader placement follows Pro dummy pattern (push into rule.use) per docs/oss/migrating/rsc-preparing-app.md:167-195. NOT marketplace's enforce:'post' which runs after transpilation and can miss directive AST nodes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 325f3e3 commit 2f11ffe

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

config/webpack/rscWebpackConfig.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const { default: serverWebpackConfig, extractLoader } = require('./serverWebpackConfig');
2+
3+
const configureRsc = () => {
4+
const rscConfig = serverWebpackConfig(true);
5+
6+
const rscEntry = {
7+
'rsc-bundle': rscConfig.entry['server-bundle'],
8+
};
9+
rscConfig.entry = rscEntry;
10+
11+
// Runs before babel-loader (webpack loaders execute right-to-left) to
12+
// detect 'use client' directives in raw source before transpilation.
13+
const { rules } = rscConfig.module;
14+
rules.forEach((rule) => {
15+
if (Array.isArray(rule.use)) {
16+
const babelLoader = extractLoader(rule, 'babel-loader');
17+
if (babelLoader) {
18+
rule.use.push({
19+
loader: 'react-on-rails-rsc/WebpackLoader',
20+
});
21+
}
22+
}
23+
});
24+
25+
rscConfig.resolve = {
26+
...rscConfig.resolve,
27+
conditionNames: ['react-server', '...'],
28+
alias: {
29+
...rscConfig.resolve?.alias,
30+
// RSC payload generation doesn't need react-dom/server; importing
31+
// it in the react-server environment causes a runtime error.
32+
'react-dom/server': false,
33+
},
34+
};
35+
36+
rscConfig.output.filename = 'rsc-bundle.js';
37+
return rscConfig;
38+
};
39+
40+
module.exports = configureRsc;

0 commit comments

Comments
 (0)