@bleedingdev/modern-js-app-tools 3.5.0-ultramodern.98 → 3.8.1-ultramodern.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/bin/modern-bundle-docs.js +7 -0
  2. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +5 -1
  3. package/dist/cjs/builder/generator/getBuilderEnvironments.js +80 -11
  4. package/dist/cjs/bundleDocs.js +114 -0
  5. package/dist/cjs/commands/build.js +2 -1
  6. package/dist/cjs/commands/deploy.js +4 -2
  7. package/dist/cjs/commands/index.js +0 -4
  8. package/dist/cjs/config/default.js +2 -0
  9. package/dist/cjs/index.js +56 -15
  10. package/dist/cjs/plugins/analyze/index.js +2 -2
  11. package/dist/cjs/plugins/analyze/utils.js +3 -2
  12. package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/index.js +1 -1
  13. package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.js +94 -18
  14. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  15. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  16. package/dist/cjs/plugins/initialize/index.js +4 -3
  17. package/dist/cjs/plugins/serverBuild.js +3 -2
  18. package/dist/cjs/ultramodern-release-envelope/framework-output.js +109 -57
  19. package/dist/esm/builder/generator/createBuilderProviderConfig.mjs +5 -1
  20. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +70 -10
  21. package/dist/esm/bundleDocs.mjs +62 -0
  22. package/dist/esm/commands/build.mjs +2 -1
  23. package/dist/esm/commands/deploy.mjs +4 -2
  24. package/dist/esm/commands/index.mjs +0 -4
  25. package/dist/esm/config/default.mjs +2 -0
  26. package/dist/esm/index.mjs +15 -1
  27. package/dist/esm/plugins/analyze/index.mjs +2 -2
  28. package/dist/esm/plugins/analyze/utils.mjs +3 -2
  29. package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -1
  30. package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +93 -18
  31. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  32. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  33. package/dist/esm/plugins/initialize/index.mjs +4 -3
  34. package/dist/esm/plugins/serverBuild.mjs +3 -2
  35. package/dist/esm/ultramodern-release-envelope/framework-output.mjs +107 -58
  36. package/dist/esm-node/builder/generator/createBuilderProviderConfig.mjs +5 -1
  37. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +70 -10
  38. package/dist/esm-node/bundleDocs.mjs +63 -0
  39. package/dist/esm-node/commands/build.mjs +2 -1
  40. package/dist/esm-node/commands/deploy.mjs +4 -2
  41. package/dist/esm-node/commands/index.mjs +0 -4
  42. package/dist/esm-node/config/default.mjs +2 -0
  43. package/dist/esm-node/index.mjs +15 -1
  44. package/dist/esm-node/plugins/analyze/index.mjs +2 -2
  45. package/dist/esm-node/plugins/analyze/utils.mjs +3 -2
  46. package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -1
  47. package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +93 -18
  48. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  49. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  50. package/dist/esm-node/plugins/initialize/index.mjs +4 -3
  51. package/dist/esm-node/plugins/serverBuild.mjs +3 -2
  52. package/dist/esm-node/ultramodern-release-envelope/framework-output.mjs +107 -58
  53. package/dist/types/builder/generator/getBuilderEnvironments.d.ts +29 -0
  54. package/dist/types/bundleDocs.d.ts +20 -0
  55. package/dist/types/commands/deploy.d.ts +2 -1
  56. package/dist/types/index.d.ts +4 -1
  57. package/dist/types/plugins/analyze/utils.d.ts +1 -1
  58. package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.d.ts +1 -1
  59. package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.d.mts +1 -1
  60. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +13 -0
  61. package/dist/types/types/config/dev.d.ts +6 -0
  62. package/dist/types/ultramodern-release-envelope/framework-output.d.ts +1 -0
  63. package/docs/apis/app/commands.md +231 -0
  64. package/docs/apis/app/hooks/api/lambda.md +9 -0
  65. package/docs/apis/app/hooks/config/favicon.md +24 -0
  66. package/docs/apis/app/hooks/config/html.md +5 -0
  67. package/docs/apis/app/hooks/config/icon.md +24 -0
  68. package/docs/apis/app/hooks/config/mock.md +6 -0
  69. package/docs/apis/app/hooks/config/public.md +26 -0
  70. package/docs/apis/app/hooks/config/upload.md +50 -0
  71. package/docs/apis/app/hooks/modern-config.md +5 -0
  72. package/docs/apis/app/hooks/server/server.md +5 -0
  73. package/docs/apis/app/hooks/shared.md +3 -0
  74. package/docs/apis/app/hooks/src/app.md +30 -0
  75. package/docs/apis/app/hooks/src/entry.md +34 -0
  76. package/docs/apis/app/hooks/src/entry.server.md +51 -0
  77. package/docs/apis/app/hooks/src/modern.runtime.md +5 -0
  78. package/docs/apis/app/hooks/src/routes.md +86 -0
  79. package/docs/apis/app/hooks/src/server.md +3 -0
  80. package/docs/apis/app/runtime/bff/use-backend-context.md +27 -0
  81. package/docs/apis/app/runtime/core/create-root.md +19 -0
  82. package/docs/apis/app/runtime/core/render.md +39 -0
  83. package/docs/apis/app/runtime/core/runtime-context.md +156 -0
  84. package/docs/apis/app/runtime/router/router.md +283 -0
  85. package/docs/apis/app/runtime/ssr/no-ssr.md +35 -0
  86. package/docs/apis/app/runtime/ssr/renderStreaming.md +67 -0
  87. package/docs/apis/app/runtime/ssr/renderString.md +60 -0
  88. package/docs/apis/app/runtime/ssr/requestHandler.md +44 -0
  89. package/docs/apis/app/runtime/utility/css-in-js.md +40 -0
  90. package/docs/apis/app/runtime/utility/head.md +35 -0
  91. package/docs/apis/app/runtime/utility/loadable.md +82 -0
  92. package/docs/community/blog/2022-0708-updates.md +91 -0
  93. package/docs/community/blog/2022-0910-updates.md +76 -0
  94. package/docs/community/blog/overview.md +63 -0
  95. package/docs/community/blog/v2-release-note.md +238 -0
  96. package/docs/community/blog/v3-release-note.md +622 -0
  97. package/docs/community/contributing-guide.md +252 -0
  98. package/docs/community/releases.md +23 -0
  99. package/docs/community/showcase.md +24 -0
  100. package/docs/community/team.md +14 -0
  101. package/docs/configure/app/bff/cross-project.md +20 -0
  102. package/docs/configure/app/bff/effect.md +313 -0
  103. package/docs/configure/app/bff/prefix.md +29 -0
  104. package/docs/configure/app/bff/runtime-framework.md +26 -0
  105. package/docs/configure/app/builder-plugins.md +66 -0
  106. package/docs/configure/app/dev/asset-prefix.md +13 -0
  107. package/docs/configure/app/dev/before-start-url.md +17 -0
  108. package/docs/configure/app/dev/client.md +41 -0
  109. package/docs/configure/app/dev/hmr.md +10 -0
  110. package/docs/configure/app/dev/host.md +18 -0
  111. package/docs/configure/app/dev/https.md +77 -0
  112. package/docs/configure/app/dev/lazy-compilation.md +39 -0
  113. package/docs/configure/app/dev/live-reload.md +10 -0
  114. package/docs/configure/app/dev/mock-dir.md +31 -0
  115. package/docs/configure/app/dev/progress-bar.md +19 -0
  116. package/docs/configure/app/dev/server.md +124 -0
  117. package/docs/configure/app/dev/setup-middlewares.md +32 -0
  118. package/docs/configure/app/dev/start-url.md +48 -0
  119. package/docs/configure/app/dev/watch-files.md +27 -0
  120. package/docs/configure/app/dev/write-to-disk.md +10 -0
  121. package/docs/configure/app/experiments/source-build.md +31 -0
  122. package/docs/configure/app/html/app-icon.md +28 -0
  123. package/docs/configure/app/html/crossorigin.md +10 -0
  124. package/docs/configure/app/html/favicon.md +16 -0
  125. package/docs/configure/app/html/inject.md +10 -0
  126. package/docs/configure/app/html/meta.md +24 -0
  127. package/docs/configure/app/html/mount-id.md +10 -0
  128. package/docs/configure/app/html/output-structure.md +10 -0
  129. package/docs/configure/app/html/script-loading.md +10 -0
  130. package/docs/configure/app/html/tags.md +15 -0
  131. package/docs/configure/app/html/template-parameters.md +33 -0
  132. package/docs/configure/app/html/template.md +10 -0
  133. package/docs/configure/app/html/title.md +18 -0
  134. package/docs/configure/app/output/asset-prefix.md +11 -0
  135. package/docs/configure/app/output/assets-retry.md +77 -0
  136. package/docs/configure/app/output/charset.md +10 -0
  137. package/docs/configure/app/output/clean-dist-path.md +16 -0
  138. package/docs/configure/app/output/convert-to-rem.md +79 -0
  139. package/docs/configure/app/output/copy.md +10 -0
  140. package/docs/configure/app/output/css-modules.md +48 -0
  141. package/docs/configure/app/output/data-uri-limit.md +26 -0
  142. package/docs/configure/app/output/disable-css-module-extension.md +55 -0
  143. package/docs/configure/app/output/disable-inline-runtime-chunk.md +41 -0
  144. package/docs/configure/app/output/disable-svgr.md +18 -0
  145. package/docs/configure/app/output/disable-ts-checker.md +49 -0
  146. package/docs/configure/app/output/dist-path.md +43 -0
  147. package/docs/configure/app/output/enable-asset-manifest.md +36 -0
  148. package/docs/configure/app/output/enable-css-module-tsdeclaration.md +28 -0
  149. package/docs/configure/app/output/enable-inline-route-manifests.md +16 -0
  150. package/docs/configure/app/output/externals.md +20 -0
  151. package/docs/configure/app/output/filename-hash.md +10 -0
  152. package/docs/configure/app/output/filename.md +55 -0
  153. package/docs/configure/app/output/inject-styles.md +10 -0
  154. package/docs/configure/app/output/inline-scripts.md +29 -0
  155. package/docs/configure/app/output/inline-styles.md +29 -0
  156. package/docs/configure/app/output/legal-comments.md +18 -0
  157. package/docs/configure/app/output/minify.md +22 -0
  158. package/docs/configure/app/output/override-browserslist.md +22 -0
  159. package/docs/configure/app/output/polyfill.md +12 -0
  160. package/docs/configure/app/output/source-map.md +30 -0
  161. package/docs/configure/app/output/split-route-chunks.md +16 -0
  162. package/docs/configure/app/output/ssg.md +81 -0
  163. package/docs/configure/app/output/ssgByEntries.md +90 -0
  164. package/docs/configure/app/output/svg-default-export.md +30 -0
  165. package/docs/configure/app/output/temp-dir.md +20 -0
  166. package/docs/configure/app/performance/build-cache.md +44 -0
  167. package/docs/configure/app/performance/chunk-split.md +40 -0
  168. package/docs/configure/app/performance/dns-prefetch.md +15 -0
  169. package/docs/configure/app/performance/preconnect.md +16 -0
  170. package/docs/configure/app/performance/prefetch.md +21 -0
  171. package/docs/configure/app/performance/preload.md +23 -0
  172. package/docs/configure/app/performance/print-file-size.md +40 -0
  173. package/docs/configure/app/performance/profile.md +10 -0
  174. package/docs/configure/app/performance/remove-console.md +10 -0
  175. package/docs/configure/app/performance/remove-moment-locale.md +10 -0
  176. package/docs/configure/app/performance/rsdoctor.md +38 -0
  177. package/docs/configure/app/plugins.md +59 -0
  178. package/docs/configure/app/resolve/alias-strategy.md +10 -0
  179. package/docs/configure/app/resolve/alias.md +9 -0
  180. package/docs/configure/app/resolve/condition-names.md +13 -0
  181. package/docs/configure/app/resolve/dedupe.md +9 -0
  182. package/docs/configure/app/resolve/extensions.md +13 -0
  183. package/docs/configure/app/runtime/0-intro.md +58 -0
  184. package/docs/configure/app/runtime/plugins.md +58 -0
  185. package/docs/configure/app/runtime/router.md +35 -0
  186. package/docs/configure/app/security/check-syntax.md +69 -0
  187. package/docs/configure/app/security/nonce.md +15 -0
  188. package/docs/configure/app/security/sri.md +20 -0
  189. package/docs/configure/app/server/base-url.md +26 -0
  190. package/docs/configure/app/server/port.md +18 -0
  191. package/docs/configure/app/server/public-routes.md +22 -0
  192. package/docs/configure/app/server/routes.md +86 -0
  193. package/docs/configure/app/server/rsc.md +22 -0
  194. package/docs/configure/app/server/ssr-by-entries.md +25 -0
  195. package/docs/configure/app/server/ssr.md +80 -0
  196. package/docs/configure/app/server/tsconfig-path.md +59 -0
  197. package/docs/configure/app/source/alias-strategy.md +14 -0
  198. package/docs/configure/app/source/alias.md +23 -0
  199. package/docs/configure/app/source/config-dir.md +20 -0
  200. package/docs/configure/app/source/decorators.md +25 -0
  201. package/docs/configure/app/source/define.md +16 -0
  202. package/docs/configure/app/source/disable-default-entries.md +28 -0
  203. package/docs/configure/app/source/enable-async-entry.md +54 -0
  204. package/docs/configure/app/source/enable-async-pre-entry.md +26 -0
  205. package/docs/configure/app/source/entries-dir.md +35 -0
  206. package/docs/configure/app/source/entries.md +179 -0
  207. package/docs/configure/app/source/exclude.md +10 -0
  208. package/docs/configure/app/source/global-vars.md +106 -0
  209. package/docs/configure/app/source/include.md +36 -0
  210. package/docs/configure/app/source/main-entry-name.md +24 -0
  211. package/docs/configure/app/source/pre-entry.md +10 -0
  212. package/docs/configure/app/source/react-compiler.md +68 -0
  213. package/docs/configure/app/source/transform-import.md +27 -0
  214. package/docs/configure/app/split-chunks.md +17 -0
  215. package/docs/configure/app/tools/autoprefixer.md +44 -0
  216. package/docs/configure/app/tools/bundler-chain.md +26 -0
  217. package/docs/configure/app/tools/css-extract.md +33 -0
  218. package/docs/configure/app/tools/css-loader.md +17 -0
  219. package/docs/configure/app/tools/dev-server.md +113 -0
  220. package/docs/configure/app/tools/html-plugin.md +41 -0
  221. package/docs/configure/app/tools/less.md +81 -0
  222. package/docs/configure/app/tools/lightningcss-loader.md +35 -0
  223. package/docs/configure/app/tools/minify-css.md +53 -0
  224. package/docs/configure/app/tools/postcss.md +34 -0
  225. package/docs/configure/app/tools/rspack.md +10 -0
  226. package/docs/configure/app/tools/sass.md +78 -0
  227. package/docs/configure/app/tools/style-loader.md +10 -0
  228. package/docs/configure/app/tools/swc.md +65 -0
  229. package/docs/configure/app/tools/ts-checker.md +116 -0
  230. package/docs/configure/app/usage.md +276 -0
  231. package/docs/guides/advanced-features/bff/cross-project.md +109 -0
  232. package/docs/guides/advanced-features/bff/data-platform.md +116 -0
  233. package/docs/guides/advanced-features/bff/extend-server.md +120 -0
  234. package/docs/guides/advanced-features/bff/frameworks.md +243 -0
  235. package/docs/guides/advanced-features/bff/function.md +318 -0
  236. package/docs/guides/advanced-features/bff/operators.md +554 -0
  237. package/docs/guides/advanced-features/bff/sdk.md +116 -0
  238. package/docs/guides/advanced-features/bff/upload.md +101 -0
  239. package/docs/guides/advanced-features/bff.md +18 -0
  240. package/docs/guides/advanced-features/build-performance.md +130 -0
  241. package/docs/guides/advanced-features/compatibility.md +120 -0
  242. package/docs/guides/advanced-features/international/advanced.md +128 -0
  243. package/docs/guides/advanced-features/international/api.md +267 -0
  244. package/docs/guides/advanced-features/international/best-practices.md +286 -0
  245. package/docs/guides/advanced-features/international/configuration.md +228 -0
  246. package/docs/guides/advanced-features/international/locale-detection.md +126 -0
  247. package/docs/guides/advanced-features/international/quick-start.md +128 -0
  248. package/docs/guides/advanced-features/international/resource-loading.md +154 -0
  249. package/docs/guides/advanced-features/international/routing.md +173 -0
  250. package/docs/guides/advanced-features/international.md +27 -0
  251. package/docs/guides/advanced-features/low-level.md +46 -0
  252. package/docs/guides/advanced-features/page-performance/code-split.md +77 -0
  253. package/docs/guides/advanced-features/page-performance/inline-assets.md +159 -0
  254. package/docs/guides/advanced-features/page-performance/optimize-bundle.md +97 -0
  255. package/docs/guides/advanced-features/page-performance/react-compiler.md +51 -0
  256. package/docs/guides/advanced-features/server-monitor/logger.md +41 -0
  257. package/docs/guides/advanced-features/server-monitor/metrics.md +58 -0
  258. package/docs/guides/advanced-features/server-monitor/monitors.md +242 -0
  259. package/docs/guides/advanced-features/source-build.md +164 -0
  260. package/docs/guides/advanced-features/web-server.md +288 -0
  261. package/docs/guides/basic-features/alias.md +102 -0
  262. package/docs/guides/basic-features/css/css-in-js.md +72 -0
  263. package/docs/guides/basic-features/css/css-modules.md +212 -0
  264. package/docs/guides/basic-features/css/css.md +27 -0
  265. package/docs/guides/basic-features/css/tailwindcss.md +27 -0
  266. package/docs/guides/basic-features/data/data-cache.md +510 -0
  267. package/docs/guides/basic-features/data/data-fetch.md +415 -0
  268. package/docs/guides/basic-features/data/data-write.md +227 -0
  269. package/docs/guides/basic-features/debug/mock.md +109 -0
  270. package/docs/guides/basic-features/debug/proxy.md +21 -0
  271. package/docs/guides/basic-features/debug/rsdoctor.md +47 -0
  272. package/docs/guides/basic-features/debug/using-storybook.md +112 -0
  273. package/docs/guides/basic-features/deploy.md +458 -0
  274. package/docs/guides/basic-features/env-vars.md +177 -0
  275. package/docs/guides/basic-features/html.md +255 -0
  276. package/docs/guides/basic-features/output-files.md +141 -0
  277. package/docs/guides/basic-features/render/before-render.md +108 -0
  278. package/docs/guides/basic-features/render/overview.md +47 -0
  279. package/docs/guides/basic-features/render/rsc.md +516 -0
  280. package/docs/guides/basic-features/render/ssg.md +228 -0
  281. package/docs/guides/basic-features/render/ssr-cache.md +201 -0
  282. package/docs/guides/basic-features/render/ssr.md +321 -0
  283. package/docs/guides/basic-features/render/streaming-ssr.md +264 -0
  284. package/docs/guides/basic-features/routes/config-routes.md +426 -0
  285. package/docs/guides/basic-features/routes/routes.md +524 -0
  286. package/docs/guides/basic-features/static-assets/json-files.md +120 -0
  287. package/docs/guides/basic-features/static-assets/svg-assets.md +168 -0
  288. package/docs/guides/basic-features/static-assets/wasm-assets.md +62 -0
  289. package/docs/guides/basic-features/static-assets.md +160 -0
  290. package/docs/guides/basic-features/testing/playwright.md +120 -0
  291. package/docs/guides/basic-features/testing/rstest.md +251 -0
  292. package/docs/guides/concept/builder.md +37 -0
  293. package/docs/guides/concept/entries.md +319 -0
  294. package/docs/guides/concept/server.md +35 -0
  295. package/docs/guides/get-started/ai-coding-agents.md +58 -0
  296. package/docs/guides/get-started/glossary.md +63 -0
  297. package/docs/guides/get-started/introduction.md +40 -0
  298. package/docs/guides/get-started/quick-start.md +269 -0
  299. package/docs/guides/get-started/tech-stack.md +91 -0
  300. package/docs/guides/get-started/ultramodern.md +440 -0
  301. package/docs/guides/get-started/upgrade.md +118 -0
  302. package/docs/guides/topic-detail/module-federation/application.md +116 -0
  303. package/docs/guides/topic-detail/module-federation/deploy.md +104 -0
  304. package/docs/guides/topic-detail/module-federation/i18n.md +670 -0
  305. package/docs/guides/topic-detail/module-federation/introduce.md +35 -0
  306. package/docs/guides/topic-detail/module-federation/ssr.md +182 -0
  307. package/docs/guides/topic-detail/module-federation/usage.md +219 -0
  308. package/docs/guides/troubleshooting/builder.md +110 -0
  309. package/docs/guides/troubleshooting/cli.md +35 -0
  310. package/docs/guides/troubleshooting/dependencies.md +119 -0
  311. package/docs/guides/troubleshooting/hmr.md +144 -0
  312. package/docs/guides/upgrade/config.md +954 -0
  313. package/docs/guides/upgrade/entry.md +463 -0
  314. package/docs/guides/upgrade/other.md +183 -0
  315. package/docs/guides/upgrade/overview.md +33 -0
  316. package/docs/guides/upgrade/tailwindcss.md +91 -0
  317. package/docs/guides/upgrade/web-server.md +109 -0
  318. package/docs/index.md +33 -0
  319. package/docs/llms.txt +290 -0
  320. package/docs/plugin/cli-plugins/api.md +573 -0
  321. package/docs/plugin/cli-plugins/life-cycle.md +2 -0
  322. package/docs/plugin/introduction.md +152 -0
  323. package/docs/plugin/official/cli-plugins/plugin-bff.md +5 -0
  324. package/docs/plugin/official/cli-plugins/plugin-ssg.md +5 -0
  325. package/docs/plugin/official/cli-plugins/plugin-styled-components.md +5 -0
  326. package/docs/plugin/official/cli-plugins.md +4 -0
  327. package/docs/plugin/plugin-system.md +238 -0
  328. package/docs/plugin/runtime-plugins/api.md +194 -0
  329. package/docs/plugin/runtime-plugins/life-cycle.md +2 -0
  330. package/docs/plugin/server-plugins/api.md +209 -0
  331. package/docs/plugin/server-plugins/life-cycle.md +13 -0
  332. package/docs/tutorials/examples/csr-auth.md +9 -0
  333. package/docs/tutorials/foundations/introduction.md +16 -0
  334. package/package.json +63 -22
@@ -0,0 +1,516 @@
1
+ # React Server Components (RSC)
2
+
3
+ React Server Components (RSC) is a new component type that allows components to be rendered in a server environment, bringing better performance and developer experience to modern web applications.
4
+
5
+ ## Core Advantages
6
+
7
+ - **Zero Client JavaScript**: Server Components code is not bundled to the client, significantly reducing client bundle size
8
+ - **Direct Access to Server Resources**: Can directly access server resources such as databases, file systems, and internal APIs without additional API layers
9
+ - **Better Performance**: Data fetching is closer to the data source, reducing client-side data waterfalls and improving first-screen load speed
10
+ - **Automatic Code Splitting**: Code splitting based on actual rendered data, not just routes, enabling more granular code optimization
11
+ - **Higher Cohesion**: Logic closely related to data, permissions, caching, etc., can remain in Server Components, improving component cohesion and reducing state lifting and cross-level passing
12
+
13
+ :::tip Prerequisite
14
+ Before starting, we recommend reading React's official [Server Components documentation](https://react.dev/reference/rsc/server-components) to get a basic understanding of Server Components.
15
+
16
+ :::
17
+
18
+ ## Quick Start
19
+
20
+ :::warning UltraModern availability
21
+ RSC is not shipped or supported in the current UltraModern company distribution. The framework keeps [`server.rsc`](/configure/app/server/rsc.md) disabled while the Rspack Flight runtime is completed upstream. Do not install `react-server-dom-rspack` or carry an application-level pnpm patch to enable it early.
22
+
23
+ The remainder of this page is retained as reference material for future upstream adoption.
24
+ :::
25
+
26
+ Keep [`server.rsc`](/configure/app/server/rsc.md) set to `false`:
27
+
28
+ ```ts title="modern.config.ts"
29
+ import { defineConfig } from '@modern-js/app-tools';
30
+
31
+ export default defineConfig({
32
+ server: {
33
+ rsc: false,
34
+ },
35
+ });
36
+ ```
37
+
38
+ :::info Migrating from Legacy CSR Projects
39
+ If you have a CSR project that uses Modern.js Data Loaders, after enabling RSC, Data Loaders will execute on the server by default.
40
+ For detailed migration guide, please refer to [CSR Project Migration to RSC](#csr-project-migration-guide).
41
+
42
+ :::
43
+
44
+ ## Usage Guide
45
+
46
+ ### Default Behavior
47
+
48
+ By default, when RSC is enabled, all components in Modern.js are **Server Components** by default. Server Components allow you to fetch data on the server and render UI. When you need interactivity (such as event handling, state management) or use browser APIs, you can use the `"use client"` directive to mark components as **Client Components**.
49
+
50
+ ### Component Type Selection
51
+
52
+ #### When to Use Client Component
53
+
54
+ When a component needs the following features, you need to use the `"use client"` directive to mark it as a Client Component:
55
+
56
+ - **Interactivity**: Using [State](https://react.dev/learn/managing-state) and [event handlers](https://react.dev/learn/responding-to-events), such as `onClick`, `onChange`, `onSubmit`
57
+ - **Lifecycle**: Using [lifecycle](https://react.dev/learn/lifecycle-of-reactive-effects)-related hooks, such as `useEffect`, `useLayoutEffect`
58
+ - **Browser APIs**: Using browser APIs (such as `window`, `document`, `localStorage`, `navigator`, etc.)
59
+ - **Custom Hooks**: Using [custom hooks](https://react.dev/learn/reusing-logic-with-custom-hooks), especially those that depend on client-side features
60
+
61
+ #### When to Use Server Component
62
+
63
+ The following scenarios should use Server Components (default behavior, no additional marking required):
64
+
65
+ 1. **Accessing Server Resources**: Using APIs available only on the server (such as Node.js APIs, file systems, consul, RPC, etc.)
66
+ 2. **Data Fetching**: Fetching data on the server to optimize performance and reduce client requests
67
+ 3. **Security**: Accessing private environment variables or API keys, avoiding exposure to the client
68
+ 4. **Reducing Bundle Size**: Using large dependency libraries that don't need to be included in the client bundle
69
+ 5. **Static Content**: Rendering static or infrequently changing content
70
+
71
+ ### Client Boundary
72
+
73
+ Once a file is marked with `"use client"`, all other modules it imports (if they haven't been marked with `"use client"` yet) will also be considered client code and included in the client JavaScript bundle. This is the concept of **Client Boundary**.
74
+
75
+ :::tip Understanding Client Boundary
76
+ The `"use client"` directive creates a boundary: all code within the boundary will be bundled to the client. This means that even if the `Button` and `Tooltip` components don't have the `"use client"` directive themselves, they will become client code because they are imported by `InteractiveCard`.
77
+
78
+ :::
79
+
80
+ ```tsx title="components/InteractiveCard.tsx"
81
+ 'use client'; // <--- This is where the Client Boundary starts
82
+
83
+ import { useState } from 'react';
84
+ import Button from './Button'; // Button.tsx doesn't have "use client", but will be included in the client bundle
85
+ import Tooltip from './Tooltip'; // Tooltip.tsx also doesn't have "use client", and will be included
86
+
87
+ export default function InteractiveCard() {
88
+ const [isActive, setIsActive] = useState(false);
89
+
90
+ return (
91
+ <div onClick={() => setIsActive(!isActive)}>
92
+ <p>Click me!</p>
93
+ <Button />
94
+ <Tooltip text="This is a card" />
95
+ </div>
96
+ );
97
+ }
98
+ ```
99
+
100
+ ### How to Combine Both Component Types
101
+
102
+ Server Components and Client Components don't exist in isolation; they need to work together. Remember the following two rules:
103
+
104
+ #### Server Component Can Import Client Component
105
+
106
+ This is the most common pattern. Your page body is a Server Component responsible for data fetching and layout, while interactive parts are embedded as Client Components.
107
+
108
+ ```tsx title="routes/page.tsx"
109
+ // Server Component (default, no marking needed)
110
+ import CounterButton from './CounterButton'; // This is a Client Component
111
+
112
+ async function getPageData() {
113
+ // Fetch data on the server
114
+ const res = await fetch('https://api.example.com/data');
115
+ return res.json();
116
+ }
117
+
118
+ export default async function Page() {
119
+ const data = await getPageData();
120
+
121
+ return (
122
+ <div>
123
+ <h1>{data.title}</h1> {/* Server-side rendered */}
124
+ <p>This part is static.</p>
125
+ {/* Client Component can be seamlessly embedded in Server Component */}
126
+ <CounterButton />
127
+ </div>
128
+ );
129
+ }
130
+ ```
131
+
132
+ ```tsx title="routes/CounterButton.tsx"
133
+ 'use client'; // Client Component
134
+
135
+ import { useState } from 'react';
136
+
137
+ export default function CounterButton() {
138
+ const [count, setCount] = useState(0);
139
+ return <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>;
140
+ }
141
+ ```
142
+
143
+ #### Client Component Cannot Directly Import Server Component
144
+
145
+ This may seem counterintuitive at first. The reason is that Server Component code doesn't exist on the client at all. When a Client Component renders in the browser, it cannot execute a function that only exists on the server.
146
+
147
+ However, there are two patterns to work around this limitation:
148
+
149
+ **1. Pass Server Component via `children` Prop**
150
+
151
+ You can pass Server Components as the `children` Prop to a Client Component. For example, an animated Tabs component where the tab switching logic is client-side, but the content of each tab might be static and fetched from the server.
152
+
153
+ ```tsx title="app/components/Tabs.tsx"
154
+ 'use client'; // Client Component
155
+
156
+ import React, { useState } from 'react';
157
+
158
+ interface TabsProps {
159
+ tabLabels: string[];
160
+ children: React.ReactNode;
161
+ }
162
+
163
+ export default function Tabs({ tabLabels, children }: TabsProps) {
164
+ const [activeTab, setActiveTab] = useState(0);
165
+
166
+ return (
167
+ <div>
168
+ <nav>
169
+ {tabLabels.map((label, index) => (
170
+ <button key={label} onClick={() => setActiveTab(index)}>
171
+ {label}
172
+ </button>
173
+ ))}
174
+ </nav>
175
+ {/* React.Children.toArray ensures only the active child component is rendered */}
176
+ <div>{React.Children.toArray(children)[activeTab]}</div>
177
+ </div>
178
+ );
179
+ }
180
+ ```
181
+
182
+ ```tsx title="app/dashboard/page.tsx"
183
+ // Server Component (default)
184
+ import Tabs from '../components/Tabs';
185
+ import Analytics from '../components/Analytics'; // Server Component
186
+ import UserSettings from '../components/UserSettings'; // Server Component
187
+
188
+ export default function DashboardPage() {
189
+ const labels = ['Analytics', 'Settings'];
190
+
191
+ return (
192
+ <main>
193
+ <h1>Dashboard</h1>
194
+ {/*
195
+ Here, Tabs is a Client Component (handling interactive logic),
196
+ but Analytics and UserSettings are Server Components rendered on the server,
197
+ passed to the Tabs component as children props.
198
+ This maintains interactivity while maximizing the advantages of server-side rendering.
199
+ */}
200
+ <Tabs tabLabels={labels}>
201
+ <Analytics />
202
+ <UserSettings />
203
+ </Tabs>
204
+ </main>
205
+ );
206
+ }
207
+ ```
208
+
209
+ Through this pattern, you can keep components on the server to the maximum extent while maintaining interactivity, achieving optimal performance. This is one of the most powerful composition patterns in RSC.
210
+
211
+ **2. Route Components Can Independently Choose Component Type**
212
+
213
+ Each level of route components (such as `layout.tsx`, `page.tsx`) can independently choose to be a Client Component or Server Component:
214
+
215
+ ```ts
216
+ -routes -
217
+ layout.tsx - // Can be a Client Component
218
+ page.tsx; // Can be a Server Component
219
+ ```
220
+
221
+ For example, if `layout.tsx` is a Client Component (requiring client-side interactivity), you can still set `page.tsx` as a Server Component (for data fetching and rendering). This approach provides great flexibility and allows non-RSC projects to gradually migrate to RSC projects.
222
+
223
+ ## Server Component and Data Loader
224
+
225
+ In RSC projects, you have two ways to fetch data: directly in Server Components, or using [Data Loader](/guides/basic-features/data/data-fetch.md). Both approaches have their advantages, and you can choose flexibly based on your scenario.
226
+
227
+ ### Comparison of Two Data Fetching Approaches
228
+
229
+ | Feature | Fetching in Server Component | Fetching in Data Loader |
230
+ | ----------------------- | ----------------------------------- | ---------------------------------------- |
231
+ | Avoid Request Waterfall | Requires manual optimization | ✅ Automatically parallel execution |
232
+ | Component Cohesion | ✅ Data and UI in the same place | Data logic separated into separate files |
233
+ | Maintainability | ✅ Easier to understand and maintain | Requires maintaining additional files |
234
+ | Type Safety | ✅ Natural type inference | Requires manual type management |
235
+
236
+ **Generally, we recommend fetching data in Server Components**, because waterfall requests have less performance impact on the server, and this approach makes components more cohesive, with data fetching logic and UI rendering in the same place, making it easier to understand and maintain. However, if your page has multiple independent data sources and you want to completely avoid request waterfall issues, Data Loader's parallel execution feature will be more advantageous.
237
+
238
+ ### Data Loader Execution Environment in RSC Projects
239
+
240
+ In RSC projects, the execution environment of Data Loaders is related to file naming:
241
+
242
+ - **`*.data.ts`**: Executes only on the **server**, and data can be consumed by both Client Components and Server Components
243
+ - **`*.data.client.ts`**: Executes only on the **client**
244
+
245
+ ```bash
246
+ .
247
+ └── routes
248
+ └── user
249
+ ├── page.tsx # Route component (can be Server or Client Component)
250
+ ├── page.data.ts # Executes on server, data can be consumed by any component
251
+ └── page.data.client.ts # Executes on client
252
+ ```
253
+
254
+ In Modern.js RSC projects, Server Components can receive data returned by Data Loaders through the `loaderData` prop:
255
+
256
+ ```tsx title="routes/user/page.tsx"
257
+ // Server Component receives loaderData through props
258
+ export default function UserPage({ loaderData }: { loaderData: { name: string } }) {
259
+ return <div>Welcome, {loaderData.name}</div>;
260
+ }
261
+ ```
262
+
263
+ ```tsx title="routes/user/page.tsx"
264
+ 'use client';
265
+ // Client Component can also receive loaderData through props
266
+ export default function UserPage({ loaderData }: { loaderData: { name: string } }) {
267
+ return <div>Welcome, {loaderData.name}</div>;
268
+ }
269
+ ```
270
+
271
+ ### Data Loader Returning Server Component
272
+
273
+ In Modern.js RSC projects, Data Loaders have a powerful feature: **they can return Server Components**. This is very helpful for gradual migration, allowing you to render server-generated content in Client Components.
274
+
275
+ ```tsx title="routes/user/layout.data.tsx"
276
+ // Server Component defined in data loader file
277
+ function UserProfile() {
278
+ return <div>User Profile (Server Rendered)</div>;
279
+ }
280
+
281
+ export const loader = async () => {
282
+ const userData = await fetchUserData();
283
+
284
+ return {
285
+ user: userData,
286
+ // Return a Server Component as part of the data
287
+ ProfileComponent: <UserProfile />,
288
+ };
289
+ };
290
+ ```
291
+
292
+ ```tsx title="routes/user/layout.tsx"
293
+ 'use client';
294
+ import { Outlet } from '@modern-js/runtime/router';
295
+
296
+ export default function UserLayout({
297
+ loaderData,
298
+ }: {
299
+ loaderData: { user: any; ProfileComponent: React.ReactNode };
300
+ }) {
301
+ const { user, ProfileComponent } = loaderData;
302
+
303
+ return (
304
+ <div>
305
+ {/* Directly render Server Component in Client Component */}
306
+ {ProfileComponent}
307
+ <div>User: {user.name}</div>
308
+ <Outlet />
309
+ </div>
310
+ );
311
+ }
312
+ ```
313
+
314
+ ## CSR Project Migration Guide
315
+
316
+ Modern.js's RSC capability supports both SSR and CSR projects. For existing CSR projects, if you want to gradually migrate to RSC, we recommend following these steps:
317
+
318
+ 1. **Enable RSC Configuration**
319
+
320
+ ```ts title="modern.config.ts"
321
+ import { defineConfig } from '@modern-js/app-tools';
322
+
323
+ export default defineConfig({
324
+ server: {
325
+ rsc: true,
326
+ },
327
+ });
328
+ ```
329
+
330
+ 2. **Mark All Route Components with `'use client'`**
331
+
332
+ This ensures that existing components maintain their behavior and continue to run as Client Components.
333
+
334
+ ```tsx title="routes/page.tsx"
335
+ 'use client';
336
+
337
+ export default function Page() {
338
+ // Existing client-side logic remains unchanged
339
+ }
340
+ ```
341
+
342
+ 3. **Rename All `*.data.ts` to `*.data.client.ts`**
343
+
344
+ Since `*.data.ts` in RSC projects executes on the server by default, to maintain consistency with CSR project behavior (Data Loaders execute on the client), you need to rename the files.
345
+
346
+ ```bash
347
+ # Before renaming
348
+ routes/user/page.data.ts
349
+
350
+ # After renaming
351
+ routes/user/page.data.client.ts
352
+ ```
353
+
354
+ After completing these steps, you can gradually migrate components to Server Components and enjoy the performance benefits of RSC.
355
+
356
+ ## Notes
357
+
358
+ ### Projects Using Streaming SSR
359
+
360
+ If you're using both Streaming SSR and RSC, in React 19 you need to use `use` instead of the `Await` component:
361
+
362
+ ```typescript
363
+ function NonCriticalUI({ p }: { p: Promise<string> }) {
364
+ let value = React.use(p);
365
+ return <h3>Non critical value {value}</h3>;
366
+ }
367
+
368
+ <React.Suspense fallback={<div>Loading...</div>}>
369
+ <NonCriticalUI p={nonCriticalData} />
370
+ </React.Suspense>;
371
+ ```
372
+
373
+ ## Best Practices
374
+
375
+ ### Data Fetching
376
+
377
+ 1. Whether it's an SSR or RSC project, it's recommended to use the `cache` function provided by Modern.js for data fetching logic executed on the server by default. This ensures that for each server-side render, no matter how many times the function is called, it will only execute once.
378
+
379
+ > This is also the recommended usage by React.js, which provides the [cache](https://react.dev/reference/react/cache) function. Modern.js's [cache](/guides/basic-features/data/data-cache.md) can be considered a superset of it.
380
+
381
+ ```typescript
382
+ import { cache } from '@modern-js/runtime/cache';
383
+
384
+ const getCriticalCached = cache(getCritical);
385
+ ```
386
+
387
+ - Based on using the `cache` function, you no longer need to manage server-side state through `props`, `context`, etc. We recommend fetching data in the nearest Server Component where it's needed. With the `cache` function, even if the same function is called multiple times, this makes project state management, business logic, and performance optimization simpler.
388
+
389
+ ```typescript
390
+ // layout.tsx
391
+ export default async function Layout() {
392
+ const criticalData = await getCriticalCached();
393
+ }
394
+
395
+ export default async function Page() {
396
+ const criticalData = await getCriticalCached();
397
+ }
398
+ ```
399
+
400
+ ### Optimal Performance
401
+
402
+ To leverage the advantages of RSC or Streaming SSR, we need to make as many components as possible flow. A core principle is to make the area wrapped by Suspense as small as possible (this is also one of the reasons we recommend using the `cache` function).
403
+
404
+ For Server Components that directly consume data, we recommend wrapping them with Suspense at a higher level:
405
+
406
+ > In this scenario, Server Components are often asynchronous. There's another case where Server Components are synchronous and data is consumed by Client Components, described below.
407
+
408
+ ```javascript
409
+ // profile/components/PostsList.tsx
410
+ export default async function PostsList() {
411
+ const posts = await getUserPosts();
412
+
413
+ return (
414
+ <ul>
415
+ {posts.map(post => (
416
+ <li key={post.id}>{post.title}</li>
417
+ ))}
418
+ </ul>
419
+ );
420
+ }
421
+ ```
422
+
423
+ ```javascript
424
+ // profile/page.tsx
425
+ import { Suspense } from 'react';
426
+ import UserInfo from './components/UserInfo';
427
+ import PostsList from './components/PostsList';
428
+ import PostsSkeleton from './components/PostsSkeleton';
429
+
430
+ export default function ProfilePage() {
431
+ return (
432
+ <div>
433
+ <UserInfo />
434
+
435
+ <hr />
436
+
437
+ {/*
438
+ We wrap the slow PostsList in Suspense.
439
+ While PostsList is fetching data, users will see PostsSkeleton.
440
+ Once PostsList data is ready, it will automatically replace the skeleton.
441
+ */}
442
+ <Suspense fallback={<PostsSkeleton />}>
443
+ <PostsList posts={postsPromise} />
444
+ </Suspense>
445
+ </div>
446
+ );
447
+ }
448
+ ```
449
+
450
+ There's another scenario where data is consumed in Client Components. In this case, we should avoid using `await` in Server Components to avoid blocking rendering:
451
+
452
+ ```javascript
453
+ // profile/components/PostsList.tsx
454
+ 'use client';
455
+ export default function PostsList({ postsPromise }) {
456
+ const posts = use(postsPromise);
457
+
458
+ return (
459
+ <ul>
460
+ {posts.map(post => (
461
+ <li key={post.id}>{post.title}</li>
462
+ ))}
463
+ </ul>
464
+ );
465
+ }
466
+ ```
467
+
468
+ ```javascript
469
+ // profile/page.tsx
470
+ import { Suspense } from 'react';
471
+ import UserInfo from './components/UserInfo';
472
+ import PostsList from './components/PostsList'; // Now a Client Component
473
+ import PostsSkeleton from './components/PostsSkeleton';
474
+ import { getUserPosts } from '../lib/data'; // Import data fetching function
475
+
476
+ // Note: This component is not async
477
+ export default function ProfilePage() {
478
+ // 1. Call the data fetching function on the server, but don't await it
479
+ // This immediately returns a Promise
480
+ const postsPromise = getUserPosts();
481
+
482
+ return (
483
+ <div>
484
+ <UserInfo />
485
+
486
+ <hr />
487
+
488
+ {/* 2. Suspense boundary is still required. It will catch
489
+ the Promise thrown by the `use` hook inside PostsList */}
490
+ <Suspense fallback={<PostsSkeleton />}>
491
+ {/* 3. Pass the Promise object itself as a prop to the client component */}
492
+ <PostsList postsPromise={postsPromise} />
493
+ </Suspense>
494
+ </div>
495
+ );
496
+ }
497
+ ```
498
+
499
+ ### Helmet
500
+
501
+ When using React 19, you no longer need to use Helmet. We recommend directly using the [components](https://react.dev/reference/react-dom/components) provided by React.
502
+
503
+
504
+ ## Common Issues
505
+
506
+ ### `This entry point is not yet supported outside of experimental channels`
507
+
508
+ The project's bundle has introduced a non-19 React version, commonly seen in monorepos. Please ensure all dependencies use React 19.
509
+
510
+ ## Related Links
511
+
512
+ - [React Server Components Official Documentation](https://react.dev/reference/rsc/server-components)
513
+ - [React Server Functions Documentation](https://react.dev/reference/rsc/server-functions)
514
+ - [Data Cache](/guides/basic-features/data/data-cache.md)
515
+ - [Server-Side Rendering (SSR)](/guides/basic-features/render/ssr.md)
516
+ - [Streaming SSR](/guides/basic-features/render/streaming-ssr.md)