@modern-js/app-tools 3.7.0 → 3.8.0

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 (306) 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/bundleDocs.js +114 -0
  4. package/dist/cjs/commands/build.js +2 -1
  5. package/dist/cjs/commands/deploy.js +4 -2
  6. package/dist/cjs/commands/index.js +0 -4
  7. package/dist/cjs/config/default.js +2 -0
  8. package/dist/cjs/index.js +52 -14
  9. package/dist/cjs/plugins/analyze/index.js +2 -2
  10. package/dist/cjs/plugins/analyze/utils.js +3 -2
  11. package/dist/cjs/plugins/initialize/index.js +4 -3
  12. package/dist/cjs/plugins/serverBuild.js +3 -2
  13. package/dist/esm/builder/generator/createBuilderProviderConfig.mjs +5 -1
  14. package/dist/esm/bundleDocs.mjs +62 -0
  15. package/dist/esm/commands/build.mjs +2 -1
  16. package/dist/esm/commands/deploy.mjs +4 -2
  17. package/dist/esm/commands/index.mjs +0 -4
  18. package/dist/esm/config/default.mjs +2 -0
  19. package/dist/esm/index.mjs +15 -1
  20. package/dist/esm/plugins/analyze/index.mjs +2 -2
  21. package/dist/esm/plugins/analyze/utils.mjs +3 -2
  22. package/dist/esm/plugins/initialize/index.mjs +4 -3
  23. package/dist/esm/plugins/serverBuild.mjs +3 -2
  24. package/dist/esm-node/builder/generator/createBuilderProviderConfig.mjs +5 -1
  25. package/dist/esm-node/bundleDocs.mjs +63 -0
  26. package/dist/esm-node/commands/build.mjs +2 -1
  27. package/dist/esm-node/commands/deploy.mjs +4 -2
  28. package/dist/esm-node/commands/index.mjs +0 -4
  29. package/dist/esm-node/config/default.mjs +2 -0
  30. package/dist/esm-node/index.mjs +15 -1
  31. package/dist/esm-node/plugins/analyze/index.mjs +2 -2
  32. package/dist/esm-node/plugins/analyze/utils.mjs +3 -2
  33. package/dist/esm-node/plugins/initialize/index.mjs +4 -3
  34. package/dist/esm-node/plugins/serverBuild.mjs +3 -2
  35. package/dist/types/bundleDocs.d.ts +20 -0
  36. package/dist/types/commands/deploy.d.ts +2 -1
  37. package/dist/types/index.d.ts +4 -1
  38. package/dist/types/plugins/analyze/utils.d.ts +1 -1
  39. package/dist/types/types/config/dev.d.ts +6 -0
  40. package/docs/apis/app/commands.md +241 -0
  41. package/docs/apis/app/hooks/api/lambda.md +9 -0
  42. package/docs/apis/app/hooks/config/favicon.md +24 -0
  43. package/docs/apis/app/hooks/config/html.md +5 -0
  44. package/docs/apis/app/hooks/config/icon.md +24 -0
  45. package/docs/apis/app/hooks/config/mock.md +6 -0
  46. package/docs/apis/app/hooks/config/public.md +26 -0
  47. package/docs/apis/app/hooks/config/upload.md +50 -0
  48. package/docs/apis/app/hooks/modern-config.md +5 -0
  49. package/docs/apis/app/hooks/server/server.md +5 -0
  50. package/docs/apis/app/hooks/shared.md +3 -0
  51. package/docs/apis/app/hooks/src/app.md +30 -0
  52. package/docs/apis/app/hooks/src/entry.md +34 -0
  53. package/docs/apis/app/hooks/src/entry.server.md +51 -0
  54. package/docs/apis/app/hooks/src/modern.runtime.md +5 -0
  55. package/docs/apis/app/hooks/src/routes.md +86 -0
  56. package/docs/apis/app/hooks/src/server.md +3 -0
  57. package/docs/apis/app/runtime/bff/use-hono-context.md +27 -0
  58. package/docs/apis/app/runtime/core/create-root.md +19 -0
  59. package/docs/apis/app/runtime/core/render.md +39 -0
  60. package/docs/apis/app/runtime/core/runtime-context.md +156 -0
  61. package/docs/apis/app/runtime/router/router.md +280 -0
  62. package/docs/apis/app/runtime/ssr/no-ssr.md +35 -0
  63. package/docs/apis/app/runtime/ssr/renderStreaming.md +67 -0
  64. package/docs/apis/app/runtime/ssr/renderString.md +60 -0
  65. package/docs/apis/app/runtime/ssr/requestHandler.md +44 -0
  66. package/docs/apis/app/runtime/utility/css-in-js.md +40 -0
  67. package/docs/apis/app/runtime/utility/head.md +35 -0
  68. package/docs/apis/app/runtime/utility/loadable.md +82 -0
  69. package/docs/community/blog/2022-0708-updates.md +91 -0
  70. package/docs/community/blog/2022-0910-updates.md +76 -0
  71. package/docs/community/blog/overview.md +63 -0
  72. package/docs/community/blog/v2-release-note.md +238 -0
  73. package/docs/community/blog/v3-release-note.md +622 -0
  74. package/docs/community/contributing-guide.md +253 -0
  75. package/docs/community/releases.md +27 -0
  76. package/docs/community/showcase.md +34 -0
  77. package/docs/community/team.md +14 -0
  78. package/docs/configure/app/bff/cross-project.md +20 -0
  79. package/docs/configure/app/bff/prefix.md +29 -0
  80. package/docs/configure/app/builder-plugins.md +66 -0
  81. package/docs/configure/app/dev/asset-prefix.md +13 -0
  82. package/docs/configure/app/dev/before-start-url.md +17 -0
  83. package/docs/configure/app/dev/client.md +41 -0
  84. package/docs/configure/app/dev/hmr.md +10 -0
  85. package/docs/configure/app/dev/host.md +18 -0
  86. package/docs/configure/app/dev/https.md +77 -0
  87. package/docs/configure/app/dev/lazy-compilation.md +39 -0
  88. package/docs/configure/app/dev/live-reload.md +10 -0
  89. package/docs/configure/app/dev/mock-dir.md +31 -0
  90. package/docs/configure/app/dev/progress-bar.md +19 -0
  91. package/docs/configure/app/dev/server.md +124 -0
  92. package/docs/configure/app/dev/setup-middlewares.md +32 -0
  93. package/docs/configure/app/dev/start-url.md +48 -0
  94. package/docs/configure/app/dev/watch-files.md +27 -0
  95. package/docs/configure/app/dev/write-to-disk.md +10 -0
  96. package/docs/configure/app/experiments/source-build.md +31 -0
  97. package/docs/configure/app/html/app-icon.md +28 -0
  98. package/docs/configure/app/html/crossorigin.md +10 -0
  99. package/docs/configure/app/html/favicon.md +16 -0
  100. package/docs/configure/app/html/inject.md +10 -0
  101. package/docs/configure/app/html/meta.md +24 -0
  102. package/docs/configure/app/html/mount-id.md +10 -0
  103. package/docs/configure/app/html/output-structure.md +10 -0
  104. package/docs/configure/app/html/script-loading.md +10 -0
  105. package/docs/configure/app/html/tags.md +15 -0
  106. package/docs/configure/app/html/template-parameters.md +33 -0
  107. package/docs/configure/app/html/template.md +10 -0
  108. package/docs/configure/app/html/title.md +18 -0
  109. package/docs/configure/app/output/asset-prefix.md +11 -0
  110. package/docs/configure/app/output/assets-retry.md +77 -0
  111. package/docs/configure/app/output/charset.md +10 -0
  112. package/docs/configure/app/output/clean-dist-path.md +16 -0
  113. package/docs/configure/app/output/convert-to-rem.md +79 -0
  114. package/docs/configure/app/output/copy.md +10 -0
  115. package/docs/configure/app/output/css-modules.md +48 -0
  116. package/docs/configure/app/output/data-uri-limit.md +26 -0
  117. package/docs/configure/app/output/disable-css-module-extension.md +55 -0
  118. package/docs/configure/app/output/disable-inline-runtime-chunk.md +41 -0
  119. package/docs/configure/app/output/disable-svgr.md +16 -0
  120. package/docs/configure/app/output/disable-ts-checker.md +49 -0
  121. package/docs/configure/app/output/dist-path.md +43 -0
  122. package/docs/configure/app/output/enable-asset-manifest.md +36 -0
  123. package/docs/configure/app/output/enable-css-module-tsdeclaration.md +28 -0
  124. package/docs/configure/app/output/enable-inline-route-manifests.md +16 -0
  125. package/docs/configure/app/output/externals.md +20 -0
  126. package/docs/configure/app/output/filename-hash.md +10 -0
  127. package/docs/configure/app/output/filename.md +55 -0
  128. package/docs/configure/app/output/inject-styles.md +10 -0
  129. package/docs/configure/app/output/inline-scripts.md +29 -0
  130. package/docs/configure/app/output/inline-styles.md +29 -0
  131. package/docs/configure/app/output/legal-comments.md +18 -0
  132. package/docs/configure/app/output/minify.md +22 -0
  133. package/docs/configure/app/output/override-browserslist.md +22 -0
  134. package/docs/configure/app/output/polyfill.md +12 -0
  135. package/docs/configure/app/output/source-map.md +30 -0
  136. package/docs/configure/app/output/split-route-chunks.md +16 -0
  137. package/docs/configure/app/output/ssg.md +81 -0
  138. package/docs/configure/app/output/ssgByEntries.md +90 -0
  139. package/docs/configure/app/output/svg-default-export.md +30 -0
  140. package/docs/configure/app/output/temp-dir.md +20 -0
  141. package/docs/configure/app/performance/build-cache.md +39 -0
  142. package/docs/configure/app/performance/chunk-split.md +40 -0
  143. package/docs/configure/app/performance/dns-prefetch.md +15 -0
  144. package/docs/configure/app/performance/preconnect.md +16 -0
  145. package/docs/configure/app/performance/prefetch.md +21 -0
  146. package/docs/configure/app/performance/preload.md +23 -0
  147. package/docs/configure/app/performance/print-file-size.md +40 -0
  148. package/docs/configure/app/performance/profile.md +10 -0
  149. package/docs/configure/app/performance/remove-console.md +10 -0
  150. package/docs/configure/app/performance/remove-moment-locale.md +10 -0
  151. package/docs/configure/app/plugins.md +59 -0
  152. package/docs/configure/app/resolve/alias-strategy.md +10 -0
  153. package/docs/configure/app/resolve/alias.md +9 -0
  154. package/docs/configure/app/resolve/condition-names.md +13 -0
  155. package/docs/configure/app/resolve/dedupe.md +9 -0
  156. package/docs/configure/app/resolve/extensions.md +13 -0
  157. package/docs/configure/app/runtime/0-intro.md +58 -0
  158. package/docs/configure/app/runtime/plugins.md +58 -0
  159. package/docs/configure/app/runtime/router.md +35 -0
  160. package/docs/configure/app/security/check-syntax.md +69 -0
  161. package/docs/configure/app/security/nonce.md +15 -0
  162. package/docs/configure/app/security/sri.md +20 -0
  163. package/docs/configure/app/server/base-url.md +26 -0
  164. package/docs/configure/app/server/port.md +18 -0
  165. package/docs/configure/app/server/public-routes.md +22 -0
  166. package/docs/configure/app/server/routes.md +86 -0
  167. package/docs/configure/app/server/rsc.md +26 -0
  168. package/docs/configure/app/server/ssr-by-entries.md +25 -0
  169. package/docs/configure/app/server/ssr.md +78 -0
  170. package/docs/configure/app/server/tsconfig-path.md +59 -0
  171. package/docs/configure/app/source/alias-strategy.md +14 -0
  172. package/docs/configure/app/source/alias.md +23 -0
  173. package/docs/configure/app/source/config-dir.md +20 -0
  174. package/docs/configure/app/source/decorators.md +25 -0
  175. package/docs/configure/app/source/define.md +16 -0
  176. package/docs/configure/app/source/disable-default-entries.md +28 -0
  177. package/docs/configure/app/source/enable-async-entry.md +54 -0
  178. package/docs/configure/app/source/enable-async-pre-entry.md +26 -0
  179. package/docs/configure/app/source/entries-dir.md +35 -0
  180. package/docs/configure/app/source/entries.md +179 -0
  181. package/docs/configure/app/source/exclude.md +10 -0
  182. package/docs/configure/app/source/global-vars.md +106 -0
  183. package/docs/configure/app/source/include.md +36 -0
  184. package/docs/configure/app/source/main-entry-name.md +24 -0
  185. package/docs/configure/app/source/pre-entry.md +10 -0
  186. package/docs/configure/app/source/react-compiler.md +68 -0
  187. package/docs/configure/app/source/transform-import.md +27 -0
  188. package/docs/configure/app/split-chunks.md +17 -0
  189. package/docs/configure/app/tools/autoprefixer.md +44 -0
  190. package/docs/configure/app/tools/bundler-chain.md +26 -0
  191. package/docs/configure/app/tools/css-extract.md +33 -0
  192. package/docs/configure/app/tools/css-loader.md +17 -0
  193. package/docs/configure/app/tools/dev-server.md +113 -0
  194. package/docs/configure/app/tools/html-plugin.md +41 -0
  195. package/docs/configure/app/tools/less.md +81 -0
  196. package/docs/configure/app/tools/lightningcss-loader.md +35 -0
  197. package/docs/configure/app/tools/minify-css.md +53 -0
  198. package/docs/configure/app/tools/postcss.md +34 -0
  199. package/docs/configure/app/tools/rspack.md +10 -0
  200. package/docs/configure/app/tools/sass.md +78 -0
  201. package/docs/configure/app/tools/style-loader.md +10 -0
  202. package/docs/configure/app/tools/swc.md +65 -0
  203. package/docs/configure/app/tools/ts-checker.md +109 -0
  204. package/docs/configure/app/usage.md +276 -0
  205. package/docs/guides/advanced-features/bff/cross-project.md +109 -0
  206. package/docs/guides/advanced-features/bff/extend-server.md +120 -0
  207. package/docs/guides/advanced-features/bff/frameworks.md +124 -0
  208. package/docs/guides/advanced-features/bff/function.md +314 -0
  209. package/docs/guides/advanced-features/bff/operators.md +554 -0
  210. package/docs/guides/advanced-features/bff/sdk.md +116 -0
  211. package/docs/guides/advanced-features/bff/upload.md +101 -0
  212. package/docs/guides/advanced-features/bff.md +18 -0
  213. package/docs/guides/advanced-features/build-performance.md +130 -0
  214. package/docs/guides/advanced-features/compatibility.md +120 -0
  215. package/docs/guides/advanced-features/international/advanced.md +128 -0
  216. package/docs/guides/advanced-features/international/api.md +231 -0
  217. package/docs/guides/advanced-features/international/best-practices.md +286 -0
  218. package/docs/guides/advanced-features/international/configuration.md +227 -0
  219. package/docs/guides/advanced-features/international/locale-detection.md +126 -0
  220. package/docs/guides/advanced-features/international/quick-start.md +128 -0
  221. package/docs/guides/advanced-features/international/resource-loading.md +154 -0
  222. package/docs/guides/advanced-features/international/routing.md +130 -0
  223. package/docs/guides/advanced-features/international.md +27 -0
  224. package/docs/guides/advanced-features/low-level.md +46 -0
  225. package/docs/guides/advanced-features/page-performance/code-split.md +77 -0
  226. package/docs/guides/advanced-features/page-performance/inline-assets.md +159 -0
  227. package/docs/guides/advanced-features/page-performance/optimize-bundle.md +97 -0
  228. package/docs/guides/advanced-features/page-performance/react-compiler.md +69 -0
  229. package/docs/guides/advanced-features/server-monitor/logger.md +41 -0
  230. package/docs/guides/advanced-features/server-monitor/metrics.md +58 -0
  231. package/docs/guides/advanced-features/server-monitor/monitors.md +242 -0
  232. package/docs/guides/advanced-features/source-build.md +164 -0
  233. package/docs/guides/advanced-features/web-server.md +288 -0
  234. package/docs/guides/basic-features/alias.md +102 -0
  235. package/docs/guides/basic-features/css/css-in-js.md +72 -0
  236. package/docs/guides/basic-features/css/css-modules.md +212 -0
  237. package/docs/guides/basic-features/css/css.md +27 -0
  238. package/docs/guides/basic-features/css/tailwindcss.md +27 -0
  239. package/docs/guides/basic-features/data/data-cache.md +510 -0
  240. package/docs/guides/basic-features/data/data-fetch.md +415 -0
  241. package/docs/guides/basic-features/data/data-write.md +227 -0
  242. package/docs/guides/basic-features/debug/mock.md +109 -0
  243. package/docs/guides/basic-features/debug/proxy.md +21 -0
  244. package/docs/guides/basic-features/debug/rsdoctor.md +62 -0
  245. package/docs/guides/basic-features/debug/using-storybook.md +112 -0
  246. package/docs/guides/basic-features/deploy.md +458 -0
  247. package/docs/guides/basic-features/env-vars.md +177 -0
  248. package/docs/guides/basic-features/html.md +255 -0
  249. package/docs/guides/basic-features/output-files.md +141 -0
  250. package/docs/guides/basic-features/render/before-render.md +108 -0
  251. package/docs/guides/basic-features/render/overview.md +47 -0
  252. package/docs/guides/basic-features/render/rsc.md +525 -0
  253. package/docs/guides/basic-features/render/ssg.md +228 -0
  254. package/docs/guides/basic-features/render/ssr-cache.md +201 -0
  255. package/docs/guides/basic-features/render/ssr.md +321 -0
  256. package/docs/guides/basic-features/render/streaming-ssr.md +264 -0
  257. package/docs/guides/basic-features/routes/config-routes.md +426 -0
  258. package/docs/guides/basic-features/routes/routes.md +498 -0
  259. package/docs/guides/basic-features/static-assets/json-files.md +120 -0
  260. package/docs/guides/basic-features/static-assets/svg-assets.md +168 -0
  261. package/docs/guides/basic-features/static-assets/wasm-assets.md +62 -0
  262. package/docs/guides/basic-features/static-assets.md +160 -0
  263. package/docs/guides/basic-features/testing/playwright.md +120 -0
  264. package/docs/guides/basic-features/testing/rstest.md +251 -0
  265. package/docs/guides/concept/builder.md +37 -0
  266. package/docs/guides/concept/entries.md +319 -0
  267. package/docs/guides/concept/server.md +35 -0
  268. package/docs/guides/get-started/ai-coding-agents.md +58 -0
  269. package/docs/guides/get-started/glossary.md +63 -0
  270. package/docs/guides/get-started/introduction.md +36 -0
  271. package/docs/guides/get-started/quick-start.md +236 -0
  272. package/docs/guides/get-started/tech-stack.md +82 -0
  273. package/docs/guides/get-started/upgrade.md +123 -0
  274. package/docs/guides/topic-detail/module-federation/application.md +116 -0
  275. package/docs/guides/topic-detail/module-federation/deploy.md +104 -0
  276. package/docs/guides/topic-detail/module-federation/i18n.md +670 -0
  277. package/docs/guides/topic-detail/module-federation/introduce.md +35 -0
  278. package/docs/guides/topic-detail/module-federation/ssr.md +118 -0
  279. package/docs/guides/topic-detail/module-federation/usage.md +219 -0
  280. package/docs/guides/troubleshooting/builder.md +110 -0
  281. package/docs/guides/troubleshooting/cli.md +35 -0
  282. package/docs/guides/troubleshooting/dependencies.md +119 -0
  283. package/docs/guides/troubleshooting/hmr.md +144 -0
  284. package/docs/guides/upgrade/config.md +963 -0
  285. package/docs/guides/upgrade/entry.md +463 -0
  286. package/docs/guides/upgrade/other.md +183 -0
  287. package/docs/guides/upgrade/overview.md +33 -0
  288. package/docs/guides/upgrade/tailwindcss.md +91 -0
  289. package/docs/guides/upgrade/web-server.md +109 -0
  290. package/docs/index.md +33 -0
  291. package/docs/llms.txt +285 -0
  292. package/docs/plugin/cli-plugins/api.md +573 -0
  293. package/docs/plugin/cli-plugins/life-cycle.md +2 -0
  294. package/docs/plugin/introduction.md +152 -0
  295. package/docs/plugin/official/cli-plugins/plugin-bff.md +5 -0
  296. package/docs/plugin/official/cli-plugins/plugin-ssg.md +5 -0
  297. package/docs/plugin/official/cli-plugins/plugin-styled-components.md +5 -0
  298. package/docs/plugin/official/cli-plugins.md +4 -0
  299. package/docs/plugin/plugin-system.md +238 -0
  300. package/docs/plugin/runtime-plugins/api.md +194 -0
  301. package/docs/plugin/runtime-plugins/life-cycle.md +2 -0
  302. package/docs/plugin/server-plugins/api.md +209 -0
  303. package/docs/plugin/server-plugins/life-cycle.md +13 -0
  304. package/docs/tutorials/examples/csr-auth.md +9 -0
  305. package/docs/tutorials/foundations/introduction.md +16 -0
  306. package/package.json +46 -13
@@ -0,0 +1,426 @@
1
+ # Config Routes
2
+
3
+ By default, Modern.js recommends using [Convention Routes](/guides/basic-features/routes/routes.md) as the way to define routes. At the same time, Modern.js also provides a config-based routing capability that can be used together with convention routes or used separately.
4
+
5
+ ## When to Use Config Routes
6
+
7
+ Config routes are particularly useful in the following scenarios:
8
+
9
+ - **Need flexible route control**: When the file structure cannot directly map to the desired URL structure
10
+ - **Multiple routes pointing to the same component**: Need to point different URL paths to the same page component
11
+ - **Conditional routes**: Dynamically configure routes based on different conditions
12
+ - **Legacy project migration**: Maintain the original routing structure when migrating from other routing systems
13
+ - **Complex route naming**: Need to customize route paths without being limited by file directory structure
14
+
15
+ ## Basic Usage
16
+
17
+ In the `src` directory or each entry directory, you can define a `modern.routes.ts` file to configure routes:
18
+
19
+ ```ts
20
+ import { defineRoutes } from '@modern-js/runtime/config-routes'
21
+
22
+ export default defineRoutes(({ route, layout, page, $ }, fileRoutes) => {
23
+ return [
24
+ route("home.tsx", "/"),
25
+ ]
26
+ })
27
+ ```
28
+
29
+ ### Function Signature Description
30
+
31
+ `defineRoutes` accepts a callback function with two parameters:
32
+
33
+ 1. `routeFunctions`: An object containing `route`, `layout`, `page`, `$` functions
34
+ 2. `fileRoutes`: An array of route configurations generated by convention routes
35
+
36
+ Basic signature of route functions:
37
+
38
+ - First parameter: File path relative to `modern.routes.ts`
39
+ - Second parameter: Route path (optional, must be a string)
40
+ - Third parameter: Array of child routes (optional)
41
+
42
+ ## Route Functions
43
+
44
+ Modern.js provides four main route configuration functions:
45
+
46
+ :::tip Path Description
47
+
48
+ The first parameter (path) of all route functions is a **relative path**, which will be concatenated with the parent path to generate the final route path:
49
+
50
+ - **Root path**: `"/"` or `""` represents the root path of the current level
51
+ - **Relative path**: Child route paths will be concatenated relative to the parent path
52
+ - **Dynamic path**: Use `:param` syntax to represent dynamic parameters
53
+ - **Wildcard path**: Use `"*"` syntax to match all paths
54
+
55
+ :::
56
+
57
+ :::info
58
+
59
+ - The first parameter (component file path) of functions like `route`, `layout`, `page`, `$` must point to real files in the current project. Files from `node_modules` and other repositories in Monorepo are not currently supported.
60
+ - Path aliases are not supported (such as `@/pages/...`, `~/pages/...`, etc.); please use relative paths relative to `modern.routes.ts`.
61
+
62
+ :::
63
+
64
+ ### `route` Function
65
+
66
+ The `route` function is a general-purpose route configuration function that automatically determines whether to generate a page route or layout route based on whether there are child routes. It can replace `layout`, `page`, `$` and other functions.
67
+
68
+ ```ts
69
+ export default defineRoutes(({ route }, fileRoutes) => {
70
+ return [
71
+ // When no child routes, automatically generates page route
72
+ route("home.tsx", "/"),
73
+ route("about.tsx", "about"),
74
+
75
+ // When has child routes, automatically generates layout route
76
+ // dashboard/layout.tsx needs to contain <Outlet> to render child routes
77
+ route("dashboard/layout.tsx", "dashboard", [
78
+ route("dashboard/overview.tsx", "overview"), // Generated path: /dashboard/overview
79
+ route("dashboard/settings.tsx", "settings"), // Generated path: /dashboard/settings
80
+ ]),
81
+
82
+ // Dynamic routes
83
+ route("products/detail.tsx", "products/:id"),
84
+
85
+ // Multiple paths pointing to the same component
86
+ route("user/profile.tsx", "user"),
87
+ route("user/profile.tsx", "profile"),
88
+ ]
89
+ })
90
+ ```
91
+
92
+ **Use cases**:
93
+
94
+ - Quick route configuration without explicitly specifying page or layout
95
+ - Simplify the complexity of route configuration
96
+
97
+ ### `layout` Function
98
+
99
+ The `layout` function is specifically used to configure layout routes, always generates layout components, and must contain child routes:
100
+
101
+ ```ts
102
+ export default defineRoutes(({ layout, page }, fileRoutes) => {
103
+ return [
104
+ // Generate layout route with path "/auth", must contain child routes
105
+ layout("auth/layout.tsx", "auth", [
106
+ page("auth/login/page.tsx", "login"), // Generated path: /auth/login
107
+ page("auth/register/page.tsx", "register"), // Generated path: /auth/register
108
+ ]),
109
+ ]
110
+ })
111
+ ```
112
+
113
+ **Use cases**:
114
+
115
+ - Need to explicitly specify a component as a layout component
116
+ - Provide common layout structure for multiple pages
117
+ - Need to share navigation, sidebar and other UI components across multiple routes
118
+
119
+ ### `page` Function
120
+
121
+ The `page` function is specifically used to configure page routes, always generates page components:
122
+
123
+ ```ts
124
+ export default defineRoutes(({ layout, page }, fileRoutes) => {
125
+ return [
126
+ layout("dashboard/layout.tsx", "dashboard", [
127
+ page("dashboard/overview.tsx", "overview"), // Generated path: /dashboard/overview
128
+ page("dashboard/settings.tsx", "settings"), // Generated path: /dashboard/settings
129
+ ]),
130
+ ]
131
+ })
132
+ ```
133
+
134
+ **Use cases**:
135
+
136
+ - Need to explicitly specify a component as a page component
137
+ - Ensure the component does not contain `<Outlet>` child component rendering
138
+ - Provide clearer semantic expression
139
+
140
+ ### `$` Function
141
+
142
+ The `$` function is specifically used to configure wildcard routes for handling unmatched routes:
143
+
144
+ ```ts
145
+ export default defineRoutes(({ layout, page, $ }, fileRoutes) => {
146
+ return [
147
+ layout("blog/layout.tsx", "blog", [
148
+ page("blog/page.tsx", ""), // Generated path: /blog
149
+ page("blog/[id]/page.tsx", ":id"), // Generated path: /blog/:id
150
+ $("blog/$.tsx", "*"), // Wildcard route, matches all unmatched paths under /blog
151
+ ]),
152
+ ]
153
+ })
154
+ ```
155
+
156
+ **Use cases**:
157
+
158
+ - Custom 404 pages
159
+ - Handle all unmatched requests under specific paths
160
+
161
+ :::tip
162
+ The `$` function has the same functionality as the `$.tsx` file in convention routes, used to catch unmatched route requests.
163
+ :::
164
+
165
+ ## Configuring Routes
166
+
167
+ ### Basic Example
168
+
169
+ ```ts
170
+ export default defineRoutes(({ page }, fileRoutes) => {
171
+ return [
172
+ // Use page function to explicitly specify page route
173
+ page("home.tsx", "/"),
174
+ page("about.tsx", "about"),
175
+ page("contact.tsx", "contact"),
176
+ ]
177
+ })
178
+ ```
179
+
180
+ ### Routes Without Path
181
+
182
+ When no path is specified, routes inherit the parent path:
183
+
184
+ ```ts
185
+ export default defineRoutes(({ layout, page }, fileRoutes) => {
186
+ return [
187
+ // Use layout function to explicitly specify layout route
188
+ // auth/layout.tsx needs to contain <Outlet> to render child routes
189
+ layout("auth/layout.tsx", [
190
+ page("login/page.tsx", "login"),
191
+ page("register/page.tsx", "register"),
192
+ ]),
193
+ ]
194
+ })
195
+ ```
196
+
197
+ The above configuration will generate:
198
+
199
+ - `/login` → `auth/layout.tsx` + `login/page.tsx`
200
+ - `/register` → `auth/layout.tsx` + `register/page.tsx`
201
+
202
+ ### Multiple Paths Pointing to the Same Component
203
+
204
+ ```ts
205
+ export default defineRoutes(({ page }, fileRoutes) => {
206
+ return [
207
+ page("user.tsx", "user"),
208
+ page("user.tsx", "profile"),
209
+ page("user.tsx", "account"),
210
+ ]
211
+ })
212
+ ```
213
+
214
+ ### Dynamic Routes
215
+
216
+ Config routes support dynamic route parameters:
217
+
218
+ ```ts
219
+ export default defineRoutes(({ page }, fileRoutes) => {
220
+ return [
221
+ // Required parameter
222
+ page("blog/detail.tsx", "blog/:id"),
223
+
224
+ // Optional parameter
225
+ page("blog/index.tsx", "blog/:slug?"),
226
+ ]
227
+ })
228
+ ```
229
+
230
+ ## Automatic Route-Related File Discovery
231
+
232
+ Config routes automatically discover component-related files without manual configuration. For any component file specified in `modern.routes.ts`, Modern.js will automatically find the following related files:
233
+
234
+ ```ts
235
+ // modern.routes.ts
236
+ export default defineRoutes(({ route }, fileRoutes) => {
237
+ return [
238
+ route("pages/profile.tsx", "profile"),
239
+ route("pages/user/detail.tsx", "user/:id"),
240
+ ]
241
+ })
242
+ ```
243
+
244
+ Modern.js will automatically find and load:
245
+
246
+ - `pages/profile.data.ts` → Data loader
247
+ - `pages/profile.config.ts` → Route configuration
248
+ - `pages/profile.error.tsx` → Error boundary
249
+ - `pages/profile.loading.tsx` → Loading component
250
+
251
+ ### Discovery Rules
252
+
253
+ - **File location**: Related files must be in the same directory as the component file
254
+ - **File naming**: Related file names are the same as the component file name (excluding extension)
255
+ - **Auto-discovery**: Modern.js automatically discovers and loads these files
256
+
257
+ :::tip
258
+
259
+ For more detailed information about data fetching, please refer to the [Data Fetching](/guides/basic-features/data/data-fetch.md) documentation. For Loading component usage, please refer to [Convention Routes - Loading](/guides/basic-features/routes/routes.md#loading-experimental).
260
+
261
+ :::
262
+
263
+ ## Route Merging
264
+
265
+ Config routes can be used together with convention routes. You can merge routes by modifying the `fileRoutes` parameter:
266
+
267
+ 1. **Override routes**: You can actively remove convention routes and replace them with config routes
268
+ 2. **Supplement routes**: You can add new config routes based on convention routes
269
+ 3. **Mixed usage**: You can add config child routes under convention layout routes
270
+
271
+ :::info
272
+
273
+ Current route structure can be viewed through the [`modern routes`](#debugging-routes) command
274
+
275
+ :::
276
+
277
+ ### Merging Examples
278
+
279
+ The following examples demonstrate how to merge config routes with convention routes:
280
+
281
+ ```ts
282
+ // modern.routes.ts
283
+ import { defineRoutes } from '@modern-js/runtime/config-routes';
284
+
285
+ export default defineRoutes(({ page }, fileRoutes) => {
286
+ // Scenario 1: Override convention routes
287
+ // Remove the original shop route and replace with custom component
288
+ const shopPageIndex = fileRoutes[0].children?.findIndex(
289
+ route => route.id === 'three_shop/page',
290
+ );
291
+ fileRoutes[0].children?.splice(shopPageIndex!, 1);
292
+ fileRoutes[0].children?.push(page('routes/CustomShop.tsx', 'shop'));
293
+
294
+ // Scenario 2: Supplement convention routes
295
+ // Add config routes without corresponding convention routes
296
+ fileRoutes[0].children?.push(page('routes/Settings.tsx', 'settings'));
297
+
298
+ // Scenario 3: Mixed nested routes
299
+ // Add config child routes under convention layout routes
300
+ const userRoute = fileRoutes[0].children?.find(
301
+ (route: any) => route.path === 'user',
302
+ );
303
+ if (userRoute?.children) {
304
+ userRoute.children.push(page('routes/user/CustomTab.tsx', 'custom-tab'));
305
+ }
306
+
307
+ // Scenario 4: Automatic discovery of related files
308
+ // Product.tsx will automatically discover Product.data.ts and Product.error.tsx
309
+ fileRoutes[0].children?.push(page('routes/Product.tsx', 'product/:id'));
310
+
311
+ return fileRoutes;
312
+ });
313
+ ```
314
+
315
+ ## Debugging Routes
316
+
317
+ Since the final structure after route merging may not be intuitive, Modern.js provides debugging commands to help you view complete route information:
318
+
319
+ ```bash
320
+ # Generate route structure analysis report
321
+ npx modern routes
322
+ ```
323
+
324
+ This command will generate the final route structure in the `dist/routes-inspect.json` file, helping you understand the complete route information after merging.
325
+
326
+ ### Report File Examples
327
+
328
+ #### Single Entry Scenario
329
+
330
+ ```json title="dist/routes-inspect.json"
331
+ {
332
+ "routes": [
333
+ {
334
+ "path": "/",
335
+ "component": "@_modern_js_src/routes/page",
336
+ "data": "@_modern_js_src/routes/page.data",
337
+ "clientData": "@_modern_js_src/routes/page.data.client",
338
+ "error": "@_modern_js_src/routes/page.error",
339
+ "loading": "@_modern_js_src/routes/page.loading"
340
+ },
341
+ {
342
+ "path": "/dashboard",
343
+ "component": "pages/admin",
344
+ "config": "pages/admin.config",
345
+ "error": "pages/admin.error"
346
+ },
347
+ {
348
+ "path": "/user",
349
+ "component": "layouts/user",
350
+ "children": [
351
+ {
352
+ "path": "/user/profile",
353
+ "component": "@_modern_js_src/routes/user/profile",
354
+ "data": "@_modern_js_src/routes/user/profile.data"
355
+ }
356
+ ]
357
+ },
358
+ {
359
+ "path": "@_modern_js_src/routes/blog/:id",
360
+ "component": "blog/detail",
361
+ "params": ["id"],
362
+ "data": "blog/detail.data",
363
+ "loading": "blog/detail.loading"
364
+ },
365
+ {
366
+ "path": "/files/*",
367
+ "component": "@_modern_js_src/routes/files/list"
368
+ }
369
+ ]
370
+ }
371
+ ```
372
+
373
+ #### Multi-entry Scenario
374
+
375
+ In multi-entry projects, the report file will be grouped by entry name, where the key is entryName:
376
+
377
+ ```json title="dist/routes-inspect.json"
378
+ {
379
+ "main": {
380
+ "routes": [
381
+ {
382
+ "path": "/",
383
+ "component": "@_modern_js_src/routes/page",
384
+ "data": "@_modern_js_src/routes/page.data",
385
+ "error": "@_modern_js_src/routes/page.error",
386
+ "loading": "@_modern_js_src/routes/page.loading"
387
+ },
388
+ {
389
+ "path": "/dashboard",
390
+ "component": "@_modern_js_src/routes/dashboard",
391
+ "config": "@_modern_js_src/routes/dashboard.config"
392
+ }
393
+ ]
394
+ },
395
+ "admin": {
396
+ "routes": [
397
+ {
398
+ "path": "/",
399
+ "component": "@_modern_js_src/routes/dashboard",
400
+ "data": "@_modern_js_src/routes/dashboard.data",
401
+ "clientData": "@_modern_js_src/routes/dashboard.data.client",
402
+ "config": "@_modern_js_src/routes/dashboard.config"
403
+ },
404
+ {
405
+ "path": "/users",
406
+ "component": "@_modern_js_src/routes/users",
407
+ "data": "@_modern_js_src/routes/users.data",
408
+ "error": "@_modern_js_src/routes/users.error",
409
+ "loading": "@_modern_js_src/routes/users.loading"
410
+ }
411
+ ]
412
+ }
413
+ }
414
+ ```
415
+
416
+ #### Route-Related File Field Descriptions
417
+
418
+ In addition to basic route information, the report also displays related files found for each route:
419
+
420
+ - **`data`**: Server-side data loading file (`.data.ts`), used to fetch data on the server
421
+ - **`clientData`**: Client-side data loading file (`.data.client.ts`), used to refetch data on the client
422
+ - **`error`**: Error boundary file (`.error.tsx`), used to handle route rendering errors
423
+ - **`loading`**: Loading state component file (`.loading.tsx`), used to display data loading state
424
+ - **`config`**: Route configuration file (`.config.ts`), used to configure route metadata
425
+
426
+ These fields are optional and will only be displayed in the report when corresponding files are found. By viewing these fields, you can quickly understand the complete file structure for each route.