@modern-js/main-doc 0.0.0-next-20221116121040

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 (531) hide show
  1. package/.eslintrc.js +12 -0
  2. package/CHANGELOG.md +15 -0
  3. package/LICENSE +144 -0
  4. package/en/configure/app/dev/asset-prefix.md +13 -0
  5. package/en/configure/app/dev/hmr.md +13 -0
  6. package/en/configure/app/dev/https.md +13 -0
  7. package/en/configure/app/dev/port.md +13 -0
  8. package/en/configure/app/dev/progress-bar.md +13 -0
  9. package/en/configure/app/dev/start-url.md +13 -0
  10. package/en/configure/app/html/app-icon.md +13 -0
  11. package/en/configure/app/html/crossorigin.md +13 -0
  12. package/en/configure/app/html/disable-html-folder.md +13 -0
  13. package/en/configure/app/html/favicon-by-entries.md +13 -0
  14. package/en/configure/app/html/favicon.md +13 -0
  15. package/en/configure/app/html/inject-by-entries.md +13 -0
  16. package/en/configure/app/html/inject.md +13 -0
  17. package/en/configure/app/html/meta-by-entries.md +13 -0
  18. package/en/configure/app/html/meta.md +13 -0
  19. package/en/configure/app/html/mount-id.md +13 -0
  20. package/en/configure/app/html/template-by-entries.md +13 -0
  21. package/en/configure/app/html/template-parameters-by-entries.md +13 -0
  22. package/en/configure/app/html/template-parameters.md +13 -0
  23. package/en/configure/app/html/template.md +13 -0
  24. package/en/configure/app/html/title-by-entries.md +13 -0
  25. package/en/configure/app/html/title.md +13 -0
  26. package/en/configure/app/output/asset-prefix.md +13 -0
  27. package/en/configure/app/output/assets-retry.md +13 -0
  28. package/en/configure/app/output/charset.md +13 -0
  29. package/en/configure/app/output/clean-dist-path.md +13 -0
  30. package/en/configure/app/output/convert-to-rem.md +13 -0
  31. package/en/configure/app/output/copy.md +13 -0
  32. package/en/configure/app/output/css-module-local-ident-name.md +13 -0
  33. package/en/configure/app/output/data-uri-limit.md +13 -0
  34. package/en/configure/app/output/disable-css-module-extension.md +13 -0
  35. package/en/configure/app/output/disable-filename-hash.md +13 -0
  36. package/en/configure/app/output/disable-inline-runtime-chunk.md +13 -0
  37. package/en/configure/app/output/disable-minimize.md +13 -0
  38. package/en/configure/app/output/disable-source-map.md +13 -0
  39. package/en/configure/app/output/dist-path.md +13 -0
  40. package/en/configure/app/output/enable-asset-fallback.md +13 -0
  41. package/en/configure/app/output/enable-asset-manifest.md +13 -0
  42. package/en/configure/app/output/enable-css-module-tsdeclaration.md +13 -0
  43. package/en/configure/app/output/enable-inline-scripts.md +13 -0
  44. package/en/configure/app/output/enable-inline-styles.md +13 -0
  45. package/en/configure/app/output/enable-latest-decorators.md +13 -0
  46. package/en/configure/app/output/externals.md +13 -0
  47. package/en/configure/app/output/filename.md +13 -0
  48. package/en/configure/app/output/legal-comments.md +13 -0
  49. package/en/configure/app/output/override-browserslist.md +13 -0
  50. package/en/configure/app/output/polyfill.md +13 -0
  51. package/en/configure/app/output/svg-default-export.md +13 -0
  52. package/en/configure/app/performance/build-cache.md +13 -0
  53. package/en/configure/app/performance/bundle-analyze.md +13 -0
  54. package/en/configure/app/performance/chunk-split.md +13 -0
  55. package/en/configure/app/performance/print-file-size.md +13 -0
  56. package/en/configure/app/performance/profile.md +13 -0
  57. package/en/configure/app/performance/remove-console.md +13 -0
  58. package/en/configure/app/performance/remove-moment-locale.md +13 -0
  59. package/en/configure/app/security/sri.md +13 -0
  60. package/en/configure/app/source/alias.md +13 -0
  61. package/en/configure/app/source/compile-js-data-uri.md +13 -0
  62. package/en/configure/app/source/define.md +13 -0
  63. package/en/configure/app/source/global-vars.md +13 -0
  64. package/en/configure/app/source/include.md +13 -0
  65. package/en/configure/app/source/module-scopes.md +13 -0
  66. package/en/configure/app/source/pre-entry.md +13 -0
  67. package/en/configure/app/source/resolve-extension-prefix.md +13 -0
  68. package/en/configure/app/source/resolve-main-fields.md +13 -0
  69. package/en/configure/app/tools/autoprefixer.md +13 -0
  70. package/en/configure/app/tools/babel.md +13 -0
  71. package/en/configure/app/tools/css-extract.md +13 -0
  72. package/en/configure/app/tools/css-loader.md +13 -0
  73. package/en/configure/app/tools/dev-server.md +13 -0
  74. package/en/configure/app/tools/html-plugin.md +13 -0
  75. package/en/configure/app/tools/inspector.md +13 -0
  76. package/en/configure/app/tools/less.md +13 -0
  77. package/en/configure/app/tools/minify-css.md +13 -0
  78. package/en/configure/app/tools/postcss.md +13 -0
  79. package/en/configure/app/tools/pug.md +13 -0
  80. package/en/configure/app/tools/sass.md +13 -0
  81. package/en/configure/app/tools/style-loader.md +13 -0
  82. package/en/configure/app/tools/styled-components.md +13 -0
  83. package/en/configure/app/tools/terser.md +13 -0
  84. package/en/configure/app/tools/ts-checker.md +13 -0
  85. package/en/configure/app/tools/ts-loader.md +13 -0
  86. package/en/configure/app/tools/webpack-chain.md +13 -0
  87. package/en/configure/app/tools/webpack.md +13 -0
  88. package/en/tutorials/foundations/_category_.json +5 -0
  89. package/en/tutorials/foundations/basic.md +8 -0
  90. package/en/tutorials/foundations/introduction.md +43 -0
  91. package/package.json +30 -0
  92. package/scripts/gen-config.ts +60 -0
  93. package/scripts/sync.ts +36 -0
  94. package/tsconfig.json +7 -0
  95. package/zh/apis/app/commands/_category_.json +8 -0
  96. package/zh/apis/app/commands/build.md +44 -0
  97. package/zh/apis/app/commands/dev.md +31 -0
  98. package/zh/apis/app/commands/index.md +12 -0
  99. package/zh/apis/app/commands/inspect.md +39 -0
  100. package/zh/apis/app/commands/lint.md +22 -0
  101. package/zh/apis/app/commands/new.md +59 -0
  102. package/zh/apis/app/commands/start.md +32 -0
  103. package/zh/apis/app/commands/test.md +36 -0
  104. package/zh/apis/app/commands/upgrade.md +23 -0
  105. package/zh/apis/app/hooks/_category_.json +8 -0
  106. package/zh/apis/app/hooks/api/_category_.json +4 -0
  107. package/zh/apis/app/hooks/api/framework/_category_.json +4 -0
  108. package/zh/apis/app/hooks/api/framework/app.md +100 -0
  109. package/zh/apis/app/hooks/api/framework/lambda.md +79 -0
  110. package/zh/apis/app/hooks/api/functions/_category_.json +4 -0
  111. package/zh/apis/app/hooks/api/functions/api.md +50 -0
  112. package/zh/apis/app/hooks/api/functions/app.md +10 -0
  113. package/zh/apis/app/hooks/api/functions/common.md +10 -0
  114. package/zh/apis/app/hooks/api/test.md +12 -0
  115. package/zh/apis/app/hooks/config/_category_.json +4 -0
  116. package/zh/apis/app/hooks/config/html.md +10 -0
  117. package/zh/apis/app/hooks/config/icon.md +17 -0
  118. package/zh/apis/app/hooks/config/mock.md +12 -0
  119. package/zh/apis/app/hooks/config/public.md +30 -0
  120. package/zh/apis/app/hooks/config/storybook.md +14 -0
  121. package/zh/apis/app/hooks/config/upload.md +48 -0
  122. package/zh/apis/app/hooks/index.md +12 -0
  123. package/zh/apis/app/hooks/modern-config.md +10 -0
  124. package/zh/apis/app/hooks/server/_category_.json +4 -0
  125. package/zh/apis/app/hooks/server/index.md +14 -0
  126. package/zh/apis/app/hooks/server/test.md +12 -0
  127. package/zh/apis/app/hooks/shared.md +8 -0
  128. package/zh/apis/app/hooks/src/_category_.json +4 -0
  129. package/zh/apis/app/hooks/src/app.md +41 -0
  130. package/zh/apis/app/hooks/src/error.md +10 -0
  131. package/zh/apis/app/hooks/src/eslint.md +9 -0
  132. package/zh/apis/app/hooks/src/index.md +35 -0
  133. package/zh/apis/app/hooks/src/pages.md +183 -0
  134. package/zh/apis/app/hooks/src/stories.md +14 -0
  135. package/zh/apis/app/hooks/src/test.md +12 -0
  136. package/zh/apis/app/overview.md +11 -0
  137. package/zh/apis/app/runtime/_category_.json +9 -0
  138. package/zh/apis/app/runtime/app/_category_.json +4 -0
  139. package/zh/apis/app/runtime/app/bootstrap.md +83 -0
  140. package/zh/apis/app/runtime/app/create-app.md +47 -0
  141. package/zh/apis/app/runtime/app/define-config.md +57 -0
  142. package/zh/apis/app/runtime/app/head.md +43 -0
  143. package/zh/apis/app/runtime/app/no-ssr.md +41 -0
  144. package/zh/apis/app/runtime/app/pre-render.md +77 -0
  145. package/zh/apis/app/runtime/app/use-module-app.md +60 -0
  146. package/zh/apis/app/runtime/app/use-module-apps.md +64 -0
  147. package/zh/apis/app/runtime/app/use-runtime-context.md +39 -0
  148. package/zh/apis/app/runtime/bff-server/_category_.json +4 -0
  149. package/zh/apis/app/runtime/bff-server/after-lambda-registed.md +35 -0
  150. package/zh/apis/app/runtime/bff-server/hook.md +120 -0
  151. package/zh/apis/app/runtime/bff-server/use-context.md +70 -0
  152. package/zh/apis/app/runtime/container/_category_.json +4 -0
  153. package/zh/apis/app/runtime/container/router.md +492 -0
  154. package/zh/apis/app/runtime/container/use-loader.md +64 -0
  155. package/zh/apis/app/runtime/default-alias.md +26 -0
  156. package/zh/apis/app/runtime/env.md +68 -0
  157. package/zh/apis/app/runtime/index.md +12 -0
  158. package/zh/apis/app/runtime/model/Provider.md +36 -0
  159. package/zh/apis/app/runtime/model/_category_.json +4 -0
  160. package/zh/apis/app/runtime/model/auto-actions.md +121 -0
  161. package/zh/apis/app/runtime/model/connect.md +134 -0
  162. package/zh/apis/app/runtime/model/create-app.md +74 -0
  163. package/zh/apis/app/runtime/model/create-store.md +60 -0
  164. package/zh/apis/app/runtime/model/handle-effect.md +106 -0
  165. package/zh/apis/app/runtime/model/model_.md +199 -0
  166. package/zh/apis/app/runtime/model/use-local-model.md +28 -0
  167. package/zh/apis/app/runtime/model/use-model.md +87 -0
  168. package/zh/apis/app/runtime/model/use-static-model.md +47 -0
  169. package/zh/apis/app/runtime/model/use-store.md +48 -0
  170. package/zh/apis/app/runtime/plugin/_category_.json +4 -0
  171. package/zh/apis/app/runtime/plugin/abstract.md +26 -0
  172. package/zh/apis/app/runtime/plugin/hook-api.md +896 -0
  173. package/zh/apis/app/runtime/plugin/hook.md +170 -0
  174. package/zh/apis/app/runtime/plugin/plugin-api.md +117 -0
  175. package/zh/apis/app/runtime/testing/_category_.json +4 -0
  176. package/zh/apis/app/runtime/testing/act.md +34 -0
  177. package/zh/apis/app/runtime/testing/cleanup.md +37 -0
  178. package/zh/apis/app/runtime/testing/render.md +52 -0
  179. package/zh/apis/app/runtime/testing/renderApp.md +31 -0
  180. package/zh/apis/app/runtime/utility/_category_.json +4 -0
  181. package/zh/apis/app/runtime/utility/css-in-js.md +60 -0
  182. package/zh/apis/app/runtime/utility/loadable/_category_.json +4 -0
  183. package/zh/apis/app/runtime/utility/loadable/lazy.md +29 -0
  184. package/zh/apis/app/runtime/utility/loadable/loadable-component.md +61 -0
  185. package/zh/apis/app/runtime/utility/loadable/loadable-library.md +67 -0
  186. package/zh/apis/app/runtime/utility/loadable/loadable_.md +110 -0
  187. package/zh/apis/app/runtime/web-server/_category_.json +4 -0
  188. package/zh/apis/app/runtime/web-server/hook.md +121 -0
  189. package/zh/apis/generator/overview.md +32 -0
  190. package/zh/apis/generator/plugin/_category_.json +4 -0
  191. package/zh/apis/generator/plugin/file/_category_.json +4 -0
  192. package/zh/apis/generator/plugin/file/addFile.md +52 -0
  193. package/zh/apis/generator/plugin/file/addHelper.md +26 -0
  194. package/zh/apis/generator/plugin/file/addManyFile.md +55 -0
  195. package/zh/apis/generator/plugin/file/addPartial.md +26 -0
  196. package/zh/apis/generator/plugin/file/introduce.md +37 -0
  197. package/zh/apis/generator/plugin/file/rmDir.md +24 -0
  198. package/zh/apis/generator/plugin/file/rmFile.md +24 -0
  199. package/zh/apis/generator/plugin/file/updateJSONFile.md +52 -0
  200. package/zh/apis/generator/plugin/file/updateModernConfig.md +26 -0
  201. package/zh/apis/generator/plugin/file/updateTextRawFile.md +33 -0
  202. package/zh/apis/generator/plugin/git/_category_.json +4 -0
  203. package/zh/apis/generator/plugin/git/gitAddAndCommit.md +20 -0
  204. package/zh/apis/generator/plugin/git/initGitRepo.md +16 -0
  205. package/zh/apis/generator/plugin/git/isInGitRepo.md +16 -0
  206. package/zh/apis/generator/plugin/hook/_category_.json +4 -0
  207. package/zh/apis/generator/plugin/hook/afterForged.md +35 -0
  208. package/zh/apis/generator/plugin/hook/onForged.md +35 -0
  209. package/zh/apis/generator/plugin/info/_category_.json +4 -0
  210. package/zh/apis/generator/plugin/info/isFileExit.md +22 -0
  211. package/zh/apis/generator/plugin/info/locale.md +17 -0
  212. package/zh/apis/generator/plugin/info/readDir.md +22 -0
  213. package/zh/apis/generator/plugin/input/_category_.json +4 -0
  214. package/zh/apis/generator/plugin/input/addInputAfter.md +48 -0
  215. package/zh/apis/generator/plugin/input/addInputBefore.md +48 -0
  216. package/zh/apis/generator/plugin/input/addOptionAfter.md +45 -0
  217. package/zh/apis/generator/plugin/input/addOptionBefore.md +45 -0
  218. package/zh/apis/generator/plugin/input/setInput.md +42 -0
  219. package/zh/apis/generator/plugin/input/setInputValue.md +28 -0
  220. package/zh/apis/generator/plugin/input/type.md +101 -0
  221. package/zh/apis/generator/plugin/introduce.md +93 -0
  222. package/zh/apis/generator/plugin/new/_category_.json +4 -0
  223. package/zh/apis/generator/plugin/new/createElement.md +33 -0
  224. package/zh/apis/generator/plugin/new/createSubProject.md +35 -0
  225. package/zh/apis/generator/plugin/new/enableFunc.md +46 -0
  226. package/zh/apis/generator/plugin/new/introduce.md +15 -0
  227. package/zh/apis/generator/plugin/npm/_category_.json +4 -0
  228. package/zh/apis/generator/plugin/npm/install.md +16 -0
  229. package/zh/apis/monorepo/commands/_category_.json +8 -0
  230. package/zh/apis/monorepo/commands/bump.md +42 -0
  231. package/zh/apis/monorepo/commands/change.md +58 -0
  232. package/zh/apis/monorepo/commands/clear.md +27 -0
  233. package/zh/apis/monorepo/commands/deploy.md +39 -0
  234. package/zh/apis/monorepo/commands/gen-release-note.md +35 -0
  235. package/zh/apis/monorepo/commands/index.md +12 -0
  236. package/zh/apis/monorepo/commands/lint.md +21 -0
  237. package/zh/apis/monorepo/commands/new.md +41 -0
  238. package/zh/apis/monorepo/commands/pre.md +68 -0
  239. package/zh/apis/monorepo/commands/release.md +20 -0
  240. package/zh/apis/monorepo/commands/upgrade.md +23 -0
  241. package/zh/apis/monorepo/hooks/_category_.json +8 -0
  242. package/zh/apis/monorepo/hooks/apps.md +12 -0
  243. package/zh/apis/monorepo/hooks/code-workspace.md +10 -0
  244. package/zh/apis/monorepo/hooks/examples.md +14 -0
  245. package/zh/apis/monorepo/hooks/features.md +14 -0
  246. package/zh/apis/monorepo/hooks/index.md +12 -0
  247. package/zh/apis/monorepo/hooks/packages.md +14 -0
  248. package/zh/apis/monorepo/hooks/pnpm-workspace.md +10 -0
  249. package/zh/apis/monorepo/hooks/pnpmfile.md +10 -0
  250. package/zh/apis/monorepo/overview.md +11 -0
  251. package/zh/community/index.md +3 -0
  252. package/zh/components/command-tip.md +57 -0
  253. package/zh/components/deploy.md +60 -0
  254. package/zh/components/dev-ide.md +1 -0
  255. package/zh/components/entry-name.md +15 -0
  256. package/zh/components/env-prepare.md +1 -0
  257. package/zh/components/launch-bff-choices.md +6 -0
  258. package/zh/components/reduck-tip.md +5 -0
  259. package/zh/configure/app/bff/_category_.json +4 -0
  260. package/zh/configure/app/bff/fetcher.md +32 -0
  261. package/zh/configure/app/bff/prefix.md +38 -0
  262. package/zh/configure/app/bff/proxy.md +76 -0
  263. package/zh/configure/app/dev/_category_.json +4 -0
  264. package/zh/configure/app/dev/asset-prefix.md +13 -0
  265. package/zh/configure/app/dev/hmr.md +13 -0
  266. package/zh/configure/app/dev/https.md +13 -0
  267. package/zh/configure/app/dev/port.md +13 -0
  268. package/zh/configure/app/dev/progress-bar.md +13 -0
  269. package/zh/configure/app/dev/proxy.md +79 -0
  270. package/zh/configure/app/dev/start-url.md +13 -0
  271. package/zh/configure/app/dev/with-master-app.md +35 -0
  272. package/zh/configure/app/html/app-icon.md +13 -0
  273. package/zh/configure/app/html/crossorigin.md +13 -0
  274. package/zh/configure/app/html/disable-html-folder.md +13 -0
  275. package/zh/configure/app/html/favicon-by-entries.md +13 -0
  276. package/zh/configure/app/html/favicon.md +13 -0
  277. package/zh/configure/app/html/inject-by-entries.md +13 -0
  278. package/zh/configure/app/html/inject.md +13 -0
  279. package/zh/configure/app/html/meta-by-entries.md +13 -0
  280. package/zh/configure/app/html/meta.md +13 -0
  281. package/zh/configure/app/html/mount-id.md +13 -0
  282. package/zh/configure/app/html/template-by-entries.md +13 -0
  283. package/zh/configure/app/html/template-parameters-by-entries.md +13 -0
  284. package/zh/configure/app/html/template-parameters.md +13 -0
  285. package/zh/configure/app/html/template.md +13 -0
  286. package/zh/configure/app/html/title-by-entries.md +13 -0
  287. package/zh/configure/app/html/title.md +13 -0
  288. package/zh/configure/app/output/_category_.json +4 -0
  289. package/zh/configure/app/output/asset-prefix.md +13 -0
  290. package/zh/configure/app/output/assets-retry.md +13 -0
  291. package/zh/configure/app/output/charset.md +13 -0
  292. package/zh/configure/app/output/clean-dist-path.md +13 -0
  293. package/zh/configure/app/output/convert-to-rem.md +13 -0
  294. package/zh/configure/app/output/copy.md +13 -0
  295. package/zh/configure/app/output/css-module-local-ident-name.md +13 -0
  296. package/zh/configure/app/output/data-uri-limit.md +13 -0
  297. package/zh/configure/app/output/disable-css-module-extension.md +13 -0
  298. package/zh/configure/app/output/disable-filename-hash.md +13 -0
  299. package/zh/configure/app/output/disable-inline-runtime-chunk.md +13 -0
  300. package/zh/configure/app/output/disable-minimize.md +13 -0
  301. package/zh/configure/app/output/disable-node-polyfill.md +24 -0
  302. package/zh/configure/app/output/disable-source-map.md +13 -0
  303. package/zh/configure/app/output/dist-path.md +13 -0
  304. package/zh/configure/app/output/enable-asset-fallback.md +13 -0
  305. package/zh/configure/app/output/enable-asset-manifest.md +13 -0
  306. package/zh/configure/app/output/enable-css-module-tsdeclaration.md +13 -0
  307. package/zh/configure/app/output/enable-inline-scripts.md +13 -0
  308. package/zh/configure/app/output/enable-inline-styles.md +13 -0
  309. package/zh/configure/app/output/enable-latest-decorators.md +13 -0
  310. package/zh/configure/app/output/enable-modern-mode.md +26 -0
  311. package/zh/configure/app/output/externals.md +13 -0
  312. package/zh/configure/app/output/filename.md +13 -0
  313. package/zh/configure/app/output/legal-comments.md +13 -0
  314. package/zh/configure/app/output/override-browserslist.md +13 -0
  315. package/zh/configure/app/output/polyfill.md +13 -0
  316. package/zh/configure/app/output/ssg.md +226 -0
  317. package/zh/configure/app/output/svg-default-export.md +13 -0
  318. package/zh/configure/app/performance/build-cache.md +13 -0
  319. package/zh/configure/app/performance/bundle-analyze.md +13 -0
  320. package/zh/configure/app/performance/chunk-split.md +13 -0
  321. package/zh/configure/app/performance/print-file-size.md +13 -0
  322. package/zh/configure/app/performance/profile.md +13 -0
  323. package/zh/configure/app/performance/remove-console.md +13 -0
  324. package/zh/configure/app/performance/remove-moment-locale.md +13 -0
  325. package/zh/configure/app/plugins.md +74 -0
  326. package/zh/configure/app/runtime/_category_.json +4 -0
  327. package/zh/configure/app/runtime/master-app.md +72 -0
  328. package/zh/configure/app/runtime/router.md +54 -0
  329. package/zh/configure/app/runtime/state.md +45 -0
  330. package/zh/configure/app/security/sri.md +13 -0
  331. package/zh/configure/app/server/_category_.json +4 -0
  332. package/zh/configure/app/server/base-url.md +36 -0
  333. package/zh/configure/app/server/port.md +21 -0
  334. package/zh/configure/app/server/public-routes.md +29 -0
  335. package/zh/configure/app/server/routes.md +92 -0
  336. package/zh/configure/app/server/ssr-by-entries.md +32 -0
  337. package/zh/configure/app/server/ssr.md +24 -0
  338. package/zh/configure/app/source/_category_.json +4 -0
  339. package/zh/configure/app/source/alias.md +13 -0
  340. package/zh/configure/app/source/compile-js-data-uri.md +13 -0
  341. package/zh/configure/app/source/config-dir.md +15 -0
  342. package/zh/configure/app/source/define.md +13 -0
  343. package/zh/configure/app/source/design-system.md +1156 -0
  344. package/zh/configure/app/source/disable-default-entries.md +23 -0
  345. package/zh/configure/app/source/enable-async-entry.md +53 -0
  346. package/zh/configure/app/source/entries-dir.md +42 -0
  347. package/zh/configure/app/source/entries.md +55 -0
  348. package/zh/configure/app/source/global-vars.md +13 -0
  349. package/zh/configure/app/source/include.md +13 -0
  350. package/zh/configure/app/source/module-scopes.md +13 -0
  351. package/zh/configure/app/source/pre-entry.md +13 -0
  352. package/zh/configure/app/source/resolve-extension-prefix.md +13 -0
  353. package/zh/configure/app/source/resolve-main-fields.md +13 -0
  354. package/zh/configure/app/testing/_category_.json +4 -0
  355. package/zh/configure/app/testing/transformer.md +17 -0
  356. package/zh/configure/app/tools/_category_.json +4 -0
  357. package/zh/configure/app/tools/autoprefixer.md +13 -0
  358. package/zh/configure/app/tools/babel.md +13 -0
  359. package/zh/configure/app/tools/css-extract.md +13 -0
  360. package/zh/configure/app/tools/css-loader.md +13 -0
  361. package/zh/configure/app/tools/dev-server.md +13 -0
  362. package/zh/configure/app/tools/esbuild.md +61 -0
  363. package/zh/configure/app/tools/html-plugin.md +13 -0
  364. package/zh/configure/app/tools/inspector.md +13 -0
  365. package/zh/configure/app/tools/jest.md +41 -0
  366. package/zh/configure/app/tools/less.md +13 -0
  367. package/zh/configure/app/tools/minify-css.md +13 -0
  368. package/zh/configure/app/tools/postcss.md +13 -0
  369. package/zh/configure/app/tools/pug.md +13 -0
  370. package/zh/configure/app/tools/sass.md +13 -0
  371. package/zh/configure/app/tools/style-loader.md +13 -0
  372. package/zh/configure/app/tools/styled-components.md +13 -0
  373. package/zh/configure/app/tools/tailwindcss.md +48 -0
  374. package/zh/configure/app/tools/terser.md +13 -0
  375. package/zh/configure/app/tools/ts-checker.md +13 -0
  376. package/zh/configure/app/tools/ts-loader.md +13 -0
  377. package/zh/configure/app/tools/webpack-chain.md +13 -0
  378. package/zh/configure/app/tools/webpack.md +13 -0
  379. package/zh/configure/app/usage.md +81 -0
  380. package/zh/configure/generator/introduce.md +113 -0
  381. package/zh/configure/generator/module.md +43 -0
  382. package/zh/configure/generator/monorepo.md +28 -0
  383. package/zh/configure/generator/mwa.md +127 -0
  384. package/zh/guides/advanced-features/_category_.json +9 -0
  385. package/zh/guides/advanced-features/bff/_category_.json +4 -0
  386. package/zh/guides/advanced-features/bff/bff-proxy.md +25 -0
  387. package/zh/guides/advanced-features/bff/bff-server.md +142 -0
  388. package/zh/guides/advanced-features/bff/frameworks.md +348 -0
  389. package/zh/guides/advanced-features/bff/function.md +236 -0
  390. package/zh/guides/advanced-features/code-split.md +68 -0
  391. package/zh/guides/advanced-features/compatibility.md +89 -0
  392. package/zh/guides/advanced-features/custom-app.md +4 -0
  393. package/zh/guides/advanced-features/eslint.md +146 -0
  394. package/zh/guides/advanced-features/index.md +12 -0
  395. package/zh/guides/advanced-features/low-level.md +44 -0
  396. package/zh/guides/advanced-features/ssg.md +151 -0
  397. package/zh/guides/advanced-features/ssr.md +186 -0
  398. package/zh/guides/advanced-features/testing.md +4 -0
  399. package/zh/guides/advanced-features/typescript.md +4 -0
  400. package/zh/guides/advanced-features/web-server.md +135 -0
  401. package/zh/guides/basic-features/_category_.json +9 -0
  402. package/zh/guides/basic-features/alias.md +67 -0
  403. package/zh/guides/basic-features/css/_category_.json +4 -0
  404. package/zh/guides/basic-features/css/css-in-js.md +38 -0
  405. package/zh/guides/basic-features/css/css-modules.md +86 -0
  406. package/zh/guides/basic-features/css/less-sass.md +29 -0
  407. package/zh/guides/basic-features/css/postcss.md +81 -0
  408. package/zh/guides/basic-features/css/tailwindcss.md +98 -0
  409. package/zh/guides/basic-features/data-fetch.md +4 -0
  410. package/zh/guides/basic-features/env-vars.md +83 -0
  411. package/zh/guides/basic-features/html.md +128 -0
  412. package/zh/guides/basic-features/image.md +43 -0
  413. package/zh/guides/basic-features/index.md +12 -0
  414. package/zh/guides/basic-features/mock.md +85 -0
  415. package/zh/guides/basic-features/proxy.md +85 -0
  416. package/zh/guides/basic-features/routes.md +4 -0
  417. package/zh/guides/concept/_category_.json +5 -0
  418. package/zh/guides/concept/entries.md +4 -0
  419. package/zh/guides/concept/integrated.md +4 -0
  420. package/zh/guides/concept/lifecycle.md +4 -0
  421. package/zh/guides/concept/solutions.md +4 -0
  422. package/zh/guides/get-started/_category_.json +5 -0
  423. package/zh/guides/get-started/quick-start.md +4 -0
  424. package/zh/guides/get-started/upgrade.md +4 -0
  425. package/zh/guides/overview.md +11 -0
  426. package/zh/guides/topic-detail/_category_.json +5 -0
  427. package/zh/guides/topic-detail/changesets/_category_.json +4 -0
  428. package/zh/guides/topic-detail/changesets/add.md +125 -0
  429. package/zh/guides/topic-detail/changesets/changelog.md +239 -0
  430. package/zh/guides/topic-detail/changesets/commit.md +272 -0
  431. package/zh/guides/topic-detail/changesets/config.md +146 -0
  432. package/zh/guides/topic-detail/changesets/github.md +168 -0
  433. package/zh/guides/topic-detail/changesets/introduce.md +57 -0
  434. package/zh/guides/topic-detail/changesets/release-note.md +262 -0
  435. package/zh/guides/topic-detail/changesets/release-pre.md +49 -0
  436. package/zh/guides/topic-detail/changesets/release.md +228 -0
  437. package/zh/guides/topic-detail/compile-speed.md +182 -0
  438. package/zh/guides/topic-detail/framework-plugin/_category_.json +4 -0
  439. package/zh/guides/topic-detail/framework-plugin/abstract.md +27 -0
  440. package/zh/guides/topic-detail/framework-plugin/extend.md +163 -0
  441. package/zh/guides/topic-detail/framework-plugin/implement.md +188 -0
  442. package/zh/guides/topic-detail/framework-plugin/relationship.md +119 -0
  443. package/zh/guides/topic-detail/generator-plugin/_category_.json +4 -0
  444. package/zh/guides/topic-detail/generator-plugin/abstract.md +23 -0
  445. package/zh/guides/topic-detail/generator-plugin/develop.md +120 -0
  446. package/zh/guides/topic-detail/generator-plugin/use.md +61 -0
  447. package/zh/guides/topic-detail/micro-frontend/_category_.json +4 -0
  448. package/zh/guides/topic-detail/micro-frontend/communicate.md +39 -0
  449. package/zh/guides/topic-detail/micro-frontend/debugging.md +168 -0
  450. package/zh/guides/topic-detail/micro-frontend/introduction.md +13 -0
  451. package/zh/guides/topic-detail/micro-frontend/mixed-stack.md +24 -0
  452. package/zh/guides/topic-detail/micro-frontend/route-mode.md +110 -0
  453. package/zh/guides/topic-detail/model/_category_.json +4 -0
  454. package/zh/guides/topic-detail/model/auto-actions.md +90 -0
  455. package/zh/guides/topic-detail/model/computed-state.md +151 -0
  456. package/zh/guides/topic-detail/model/define-model.md +66 -0
  457. package/zh/guides/topic-detail/model/faq.md +43 -0
  458. package/zh/guides/topic-detail/model/manage-effects.md +259 -0
  459. package/zh/guides/topic-detail/model/model-communicate.md +219 -0
  460. package/zh/guides/topic-detail/model/performance.md +173 -0
  461. package/zh/guides/topic-detail/model/quick-start.md +112 -0
  462. package/zh/guides/topic-detail/model/redux-integration.md +21 -0
  463. package/zh/guides/topic-detail/model/test-model.md +43 -0
  464. package/zh/guides/topic-detail/model/typescript-best-practice.md +71 -0
  465. package/zh/guides/topic-detail/model/use-model.md +244 -0
  466. package/zh/guides/topic-detail/model/use-out-of-modernjs.md +51 -0
  467. package/zh/guides/topic-detail/monorepo/_category_.json +4 -0
  468. package/zh/guides/topic-detail/monorepo/create-sub-project.md +64 -0
  469. package/zh/guides/topic-detail/monorepo/deploy.md +43 -0
  470. package/zh/guides/topic-detail/monorepo/intro.md +15 -0
  471. package/zh/guides/topic-detail/monorepo/publish.md +68 -0
  472. package/zh/guides/topic-detail/monorepo/sub-project-interface.md +170 -0
  473. package/zh/guides/troubleshooting/_category_.json +5 -0
  474. package/zh/guides/troubleshooting/compile.md +379 -0
  475. package/zh/guides/troubleshooting/dependencies.md +168 -0
  476. package/zh/tutorials/first-app/_category_.json +5 -0
  477. package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +25 -0
  478. package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +118 -0
  479. package/zh/tutorials/first-app/c01-getting-started/1.3-dev-command.md +29 -0
  480. package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +44 -0
  481. package/zh/tutorials/first-app/c01-getting-started/1.5-start-command.md +18 -0
  482. package/zh/tutorials/first-app/c01-getting-started/1.6-create-repo.md +31 -0
  483. package/zh/tutorials/first-app/c01-getting-started/_category_.json +3 -0
  484. package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +87 -0
  485. package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +28 -0
  486. package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +21 -0
  487. package/zh/tutorials/first-app/c02-generator-and-studio/_category_.json +3 -0
  488. package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +55 -0
  489. package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +66 -0
  490. package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +11 -0
  491. package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +63 -0
  492. package/zh/tutorials/first-app/c03-ide/_category_.json +3 -0
  493. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +67 -0
  494. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +111 -0
  495. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.3-compatibility.md +67 -0
  496. package/zh/tutorials/first-app/c04-es6-plus-and-ts/_category_.json +3 -0
  497. package/zh/tutorials/first-app/c05-component/5.1-use-ui-library.md +68 -0
  498. package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +92 -0
  499. package/zh/tutorials/first-app/c05-component/_category_.json +3 -0
  500. package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +110 -0
  501. package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +148 -0
  502. package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +84 -0
  503. package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +83 -0
  504. package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +77 -0
  505. package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +113 -0
  506. package/zh/tutorials/first-app/c06-css-and-component/_category_.json +3 -0
  507. package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +64 -0
  508. package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +104 -0
  509. package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +74 -0
  510. package/zh/tutorials/first-app/c07-app-entry/_category_.json +3 -0
  511. package/zh/tutorials/first-app/c08-client-side-routing/8.1-code-based-routing.md +153 -0
  512. package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +318 -0
  513. package/zh/tutorials/first-app/c08-client-side-routing/_category_.json +3 -0
  514. package/zh/tutorials/first-app/c09-bff/9.1-serverless.md +30 -0
  515. package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +93 -0
  516. package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +205 -0
  517. package/zh/tutorials/first-app/c09-bff/_category_.json +3 -0
  518. package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +23 -0
  519. package/zh/tutorials/first-app/c10-model/10.2-add-model.md +185 -0
  520. package/zh/tutorials/first-app/c10-model/10.3-use-model.md +54 -0
  521. package/zh/tutorials/first-app/c10-model/10.4-testing.md +69 -0
  522. package/zh/tutorials/first-app/c10-model/_category_.json +3 -0
  523. package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +274 -0
  524. package/zh/tutorials/first-app/c11-container/11.2-add-container.md +106 -0
  525. package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +61 -0
  526. package/zh/tutorials/first-app/c11-container/11.4-testing.md +56 -0
  527. package/zh/tutorials/first-app/c11-container/_category_.json +3 -0
  528. package/zh/tutorials/first-app/overview.md +11 -0
  529. package/zh/tutorials/foundations/_category_.json +5 -0
  530. package/zh/tutorials/foundations/basic.md +8 -0
  531. package/zh/tutorials/foundations/introduction.md +41 -0
@@ -0,0 +1,74 @@
1
+ ---
2
+ title: 管理应用入口​​​
3
+ ---
4
+
5
+ 上一个小节中,我们学习了使用命令行手动创建新的入口。
6
+
7
+ 在这一小节中,我们将通过配置项来对入口进行管理。
8
+
9
+ 我们可以在 `package.json` 中的 `modernConfig`,或是在符合[业界主流惯例](https://github.com/davidtheclark/cosmiconfig)的 Modern.js 配置文件里,自己写代码来控制项目的配置。
10
+
11
+ 之前的章节中,我们都是直接修改 `package.json` 中的 `modernConfig` 字段来实现修改配置。
12
+
13
+ 现在,让我们在项目目录下,新建一个 `modern.config.js`(若已新建可忽略),并在里面添加内容:
14
+
15
+ ```js title="modern.config.js"
16
+ export default defineConfig({
17
+ server: {
18
+ ssr: true,
19
+ ssrByEntries: {
20
+ 'landing-page': false,
21
+ },
22
+ },
23
+ };
24
+ ```
25
+
26
+ 执行 `pnpm run dev`,再用浏览器打开 `view-source:http://localhost:8080/landing-page`,可以看到 `landing-page` 网页内容是通过 js 动态加载的,且此页面的 SSR 功能被关闭。
27
+
28
+ 注:此时,其他页面的 SSR 功能仍然正常开启。
29
+
30
+ 如果注释掉 `ssrByEntries` 和它的值,landing-page 的 SSR 功能就恢复开启了。
31
+
32
+ :::info 注
33
+ 当相同配置字段出现于两个文件中时, `package.json` 中 `modernConfig` 字段里的配置会优先于 `modern.config.js` 中的配置。
34
+ :::
35
+
36
+ 当需要配置包含复杂逻辑的选项时,比如,开发者想在项目中使用 `*.myext` 文件,这是一种非主流的文件类型,Modern.js 没有默认集成对它的支持。
37
+
38
+ 所以,开发者可以在 `modern.config.js` 里增加对它的支持(通过webpack配置),如下所示:
39
+
40
+ :::info 注
41
+ 更多 webpack 配置相关可以查看 [Webpack 配置文档](/docs/configure/app/tools/webpack)。
42
+ :::
43
+
44
+ ```js
45
+ // 注:以下为伪代码,loader等名字皆为虚构,仅做演示使用
46
+ export default defineConfig({
47
+ tools: {
48
+ webpackChain: (chain) => {
49
+ chain.module
50
+ .rule('my-loader')
51
+ .test(/\.myext$/)
52
+ .use('custom-loader')
53
+ .loader('myext-loader')
54
+ .options({});
55
+ },
56
+ },
57
+ };
58
+ ```
59
+
60
+ 这个需求要修改 webpack 配置,用 Modern.js 配置的`tools.webpack`选项来实现显然是更方便的。
61
+
62
+ 还有一些时候,需要一些更复杂的逻辑来做设置,比如需要 JS 变量、表达式、导入模块等,这种时候也适合用 `modern.config.js` 来手动配置,比如:
63
+
64
+ ```js
65
+ export default defineConfig({
66
+ server: {
67
+ ssrByEntries: {
68
+ 'landing-page': process.env.NODE_ENV !== 'production',
69
+ },
70
+ },
71
+ };
72
+ ```
73
+
74
+ 以上代码实现表示只在开发环境里开启 SSR。
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "7: 添加应用入口"
3
+ }
@@ -0,0 +1,153 @@
1
+ ---
2
+ title: 使用自控式路由​​​​
3
+ ---
4
+
5
+ 上一章节中,我们学习了如何创建应用入口。
6
+
7
+ 这一章节中,我们将会学习如何为入口增加【 客户端路由 】。
8
+
9
+ 我们分别用两种不同的方式,为 `contacts` 和 `landing-page` 增加客户端路由逻辑。
10
+
11
+ `contacts` 和 `landing-page` 这两个入口,都是通过 CLI 自动创建出来的,在创建过程中我们没有修改入口的默认配置,因此每个入口的客户端路由都是默认开启的。
12
+
13
+ ```js title="modern.config.js"
14
+ export default defineConfig({
15
+ runtime: {
16
+ router: true,
17
+ state: true,
18
+ },
19
+ });
20
+ ```
21
+
22
+ 之前我们已经为联系人列表增加了 Archive 按钮,接下来我们添加一个客户端路由 `/archives`,访问这个路由时,只显示已存档的联系人,而原有的 `/` 继续显示所有联系人。
23
+
24
+ 打开 `src/contacts/App.tsx`,在原有的 `mockData` 下方新增 `mockArchivedData`:
25
+
26
+ ```js
27
+ const mockData = getAvatar([
28
+ { name: 'Thomas', email: 'w.kccip@bllmfbgv.dm' },
29
+ { name: 'Chow', email: 'f.lfqljnlk@ywoefljhc.af' },
30
+ { name: 'Bradley', email: 'd.wfovsqyo@gpkcjwjgb.fr' },
31
+ { name: 'Davis', email: '"t.kqkoj@utlkwnpwk.nu' },
32
+ ]);
33
+
34
+ const mockArchivedData = getAvatar([
35
+ { name: 'Thomas', email: 'w.kccip@bllmfbgv.dm' },
36
+ { name: 'Chow', email: 'f.lfqljnlk@ywoefljhc.af' },
37
+ ]);
38
+ ```
39
+
40
+ 在文件顶部引入 [React Router](https://reactrouter.com/) 的 `Route`、`Switch` 和 [React Helmet](https://github.com/nfl/react-helmet) 的 `Helmet` 组件:
41
+
42
+ ```js
43
+ import { Route, Switch } from '@modern-js/runtime/router';
44
+ import { Helmet } from '@modern-js/runtime/head';
45
+ ```
46
+
47
+ 在 `App` 组件中使用 `Route` 写两个路由,分别用不同的 mock 数据渲染列表:
48
+
49
+ ```js
50
+ function App() {
51
+ return (
52
+ <div className="container lg mx-auto">
53
+ <Switch>
54
+ <Route path="/" exact={true}>
55
+ <Helmet>
56
+ <title>All</title>
57
+ </Helmet>
58
+ <List
59
+ dataSource={mockData}
60
+ renderItem={info => <Item key={info.name} info={info} />}
61
+ />
62
+ </Route>
63
+ <Route path="/archives" exact={true}>
64
+ <Helmet>
65
+ <title>Archives</title>
66
+ </Helmet>
67
+ <List
68
+ dataSource={mockArchivedData}
69
+ renderItem={info => <Item key={info.name} info={info} />}
70
+ />
71
+ </Route>
72
+ </Switch>
73
+ </div>
74
+ );
75
+ }
76
+ ```
77
+
78
+ :::info 注
79
+ Modern.js 默认集成了 react-helmet,无需安装依赖,可以直接使用,也可以结合 SSR 使用,满足 SEO 需求。
80
+
81
+ Modern.js 也默认集成了 react-router,无需安装依赖和自己配置 `BrowserRouter` 等样板代码,可以直接用 Route、Switch 等组件实现路由逻辑。
82
+ :::
83
+
84
+ React Router v4+ 有两种用法,一种是 `component-based` 的,一种是基于全局配置的。这两种都由开发者自己用代码来控制客户端路由逻辑,所以我们把这种模式称作【**自控式路由**】。
85
+
86
+ 执行 `pnpm run dev`,访问 `http://localhost:8080/contacts`,可以看到完整的联系人,页面的标题是 All:
87
+
88
+ ![display](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/display.png)
89
+
90
+ 访问 `http://localhost:8080/contacts/archives`,只会看到已存档的联系人,页面的标题是 Archives:
91
+
92
+ ![display1](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/display1.png)
93
+
94
+ 查看页面 HTML 源码,可以看到两个页面的内容是一样,是在客户端针对不同 URL 渲染不同内容。
95
+
96
+ **接下来我们增加一个简单的导航栏,让用户能在两个列表之间切换**。
97
+
98
+ 打开 src/contacts/App.tsx,在顶部导入 Radio 组件:
99
+
100
+ ```tsx
101
+ import { List, Radio } from 'antd';
102
+ ```
103
+
104
+ 然后将 UI 最顶部进行修改,增加一组单选框
105
+
106
+ ```tsx {3-8}
107
+ return (
108
+ <div className="container lg mx-auto">
109
+ <div className="h-16 p-2 flex items-center justify-center">
110
+ <Radio.Group onChange={handleSetList} value={currentList}>
111
+ <Radio value="/">All</Radio>
112
+ <Radio value="/archives">Archives</Radio>
113
+ </Radio.Group>
114
+ </div>
115
+ <Switch>
116
+ ```
117
+
118
+ 然后我们来实现 `currentList` 和 `handleSetList`。
119
+
120
+ 引入两个 React Hook:`useState` 和 `useHistory`,以及 Ant Design 的事件类型定义:
121
+
122
+ ```js
123
+ import { useState } from 'react';
124
+ import { List, Radio, RadioChangeEvent } from 'antd';
125
+ import { Route, Switch, useHistory } from '@modern-js/runtime/router';
126
+ ```
127
+
128
+ 最后在 App 组件里增加局部状态和相关逻辑:
129
+
130
+ ```js {2-8}
131
+ function App() {
132
+ const history = useHistory();
133
+ const [currentList, setList] = useState(history.location.pathname || '/');
134
+ const handleSetList = (e: RadioChangeEvent) => {
135
+ const { value } = e.target;
136
+ setList(value);
137
+ history.push(value);
138
+ };
139
+ ```
140
+
141
+ 到这里就已经完成了页面导航栏实现,执行 `pnpm run dev` 查看效果:
142
+
143
+ ![display2](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/display2.png)
144
+
145
+ 点击导航栏中 Archives,可以看到单选框的选中状态和 URL 都会变化,页面没有刷新,只发生了 CSR。
146
+
147
+ 如果我们将 contacts 入口的 SSR 选项开启后([配置教程](/docs/configure/app/server/ssr)),重新访问两个页面,可以看到 HTML 内容是不同的,这是因为在 SSR 阶段页面就执行了客户端路由的逻辑,HTML 里已经包含了最终的渲染结果。
148
+
149
+ 访问 `http://localhost:8080/contacts/archives`,点击顶部单选框,可以看到在有 SSR 的情况下,CSR 不受影响,跟开启 SSR 之前的效果一致,实现了 UX 的最大化(首屏 SSR,后续交互 CSR)。
150
+
151
+ ---
152
+
153
+ > 本小节的代码可以在[这里查看](https://github.com/modern-js-dev/modern-js-examples/tree/main/tutorials/c08/hello-modern)。
@@ -0,0 +1,318 @@
1
+ ---
2
+ title: 使用约定式路由​​​​
3
+ ---
4
+
5
+ 上一小节中,我们学习了如何使用【 自控式路由 】方式实现客户端路由。
6
+
7
+ 这一小节中,我们将在 landing-page 入口里,学习使用【 约定式路由 】。
8
+
9
+ 我们首先将 `landing-page` 入口的**标识** `App.tsx` 删除,换成另一种符合约定的**标识** `pages/`。
10
+
11
+ 我们在终端执行以下代码修改 `landing-page` 文件内容:
12
+
13
+ import Tabs from '@theme/Tabs';
14
+ import TabItem from '@theme/TabItem';
15
+
16
+ <Tabs>
17
+ <TabItem value="macOS" label="macOS" default>
18
+
19
+ ```bash
20
+ rm src/landing-page/App.tsx src/landing-page/App.css
21
+ mkdir -p src/landing-page/pages/
22
+ touch src/landing-page/pages/_app.tsx src/landing-page/pages/index.tsx src/landing-page/pages/docs.tsx
23
+ ```
24
+
25
+ </TabItem>
26
+ <TabItem value="Windows" label="Windows">
27
+
28
+ ```powershell
29
+ rm src/landing-page/App.tsx
30
+ rm src/landing-page/App.css
31
+ mkdir -p src/landing-page/pages/
32
+ ni src/landing-page/pages/_app.tsx
33
+ ni src/landing-page/pages/index.tsx
34
+ ni src/landing-page/pages/docs.tsx
35
+ ```
36
+
37
+ </TabItem>
38
+ </Tabs>
39
+
40
+
41
+ `pages/` 跟 `App.tsx` 一样,都起到入口**标识**的作用,让 `src/landing-page` 被识别为入口。
42
+
43
+ 如果存在 `App.tsx` 则优先使用 `App.tsx` 作为编译入口。而 `pages/` 则默认启用【 约定式路由 】的客户端路由实现方式,`pages/` 中的文件路径和文件内容,将被自动自动转换成客户端路由逻辑。
44
+
45
+ 执行命令后,项目结构如下:
46
+
47
+ ```md
48
+ .
49
+ ├── .vscode/
50
+ │ ├── extensions.json
51
+ │ └── settings.json
52
+ ├── src/
53
+ │ ├── contacts/
54
+ │ │ ├── components/
55
+ │ │ │ ├── Avatar/
56
+ │ │ │ │ ├── index.stories.tsx
57
+ │ │ │ │ └── index.tsx
58
+ │ │ │ └── Item/
59
+ │ │ │ ├── index.test.tsx
60
+ │ │ │ └── index.tsx
61
+ │ │ ├── styles/
62
+ │ │ │ └── utils.css
63
+ │ │ ├── App.css
64
+ │ │ └── App.tsx
65
+ │ ├── landing-page/
66
+ │ │ └── pages/
67
+ │ │ ├── _app.tsx
68
+ │ │ ├── docs.tsx
69
+ │ │ └── index.tsx
70
+ │ ├── .eslintrc.json
71
+ │ └── modern-app-env.d.ts
72
+ ├── .editorconfig
73
+ ├── .gitignore
74
+ ├── .npmrc
75
+ ├── .nvmrc
76
+ ├── README.md
77
+ ├── package.json
78
+ ├── pnpm-lock.yaml
79
+ └── tsconfig.json
80
+ ```
81
+
82
+ 注:以上展示的是手动创建入口的方式。
83
+
84
+ 以下介绍自动启用方式,开发者可在自己的项目中尝试:
85
+
86
+ 在 modern.js 项目中,执行`pnpm run new`命令, 按照以下选项选择,实现创建入口时,自动启用【 约定式路由 】:
87
+
88
+ ```bash
89
+ # 请选择你想要的操作:
90
+ ❯ 新建「应用入口」
91
+
92
+ #填写入口名称:
93
+ landing-page
94
+
95
+ # 是否需要调整默认配置?
96
+ ❯ 是
97
+
98
+ # 请选择客户端路由方式
99
+ 自控路由
100
+ ❯ 约定式路由
101
+ 不启用
102
+ ```
103
+
104
+ 假设这个 `landing-page` 入口是一个简单的有导航栏的落地页,包含两个子页面:一个首页和一个文档页,我们用客户端路由的方式来区别这两个子页面。
105
+
106
+ 我们先分别实现这个入口两个子页面的内容,`src/landing-page/pages/index.tsx` 是首页,内容为:
107
+
108
+ ```js
109
+ import { Helmet } from '@modern-js/runtime/head';
110
+
111
+ const Index = () => (
112
+ <>
113
+ <Helmet>
114
+ <title>Home</title>
115
+ </Helmet>
116
+ <p>
117
+ Welcome to <a href="/contacts">Contact List</a>!
118
+ </p>
119
+ </>
120
+ );
121
+
122
+ export default Index;
123
+ ```
124
+
125
+ `src/landing-page/pages/docs.tsx` 是文档页,内容为:
126
+
127
+ ```js
128
+ import { Helmet } from '@modern-js/runtime/head';
129
+
130
+ const Docs = () => (
131
+ <>
132
+ <Helmet>
133
+ <title>Docs</title>
134
+ </Helmet>
135
+ <p>I am docs</p>
136
+ </>
137
+ );
138
+
139
+ export default Docs;
140
+ ```
141
+
142
+ 最后,`src/landing-page/pages/_app.tsx` 是下划线开头的,代表这是【 约定式路由 】中一个特殊的功能文件,为整个入口提供根组件,可以用于实现全局布局、公共 UI 等。
143
+
144
+ 在这里,我们只实现一个简单的导航和结构:
145
+
146
+ ```js
147
+ import { ComponentType } from 'react';
148
+ import { NavLink } from '@modern-js/runtime/router';
149
+
150
+ const App = ({ Component, ...pageProps }: { Component: ComponentType }) => (
151
+ <div>
152
+ <h2>Nav:</h2>
153
+ <ul>
154
+ <li>
155
+ <NavLink
156
+ to="/"
157
+ exact={true}
158
+ activeStyle={{
159
+ color: '#f60',
160
+ }}>
161
+ Home
162
+ </NavLink>
163
+ </li>
164
+ <li>
165
+ <NavLink
166
+ to="/docs"
167
+ activeStyle={{
168
+ color: '#f60',
169
+ }}>
170
+ Docs
171
+ </NavLink>
172
+ </li>
173
+ </ul>
174
+ <h2>Content:</h2>
175
+ <Component {...pageProps} />
176
+ </div>
177
+ );
178
+
179
+ export default App;
180
+ ```
181
+
182
+ 执行 `pnpm run dev`,访问 `http://localhost:8080/landing-page/`,可以看到结果:
183
+
184
+ ![result](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result.png)
185
+
186
+ 点击 Nav 里的链接,URL 变为 `http://localhost:8080/landing-page/docs`,内容会变为:
187
+
188
+ ![result1](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result1.png)
189
+
190
+ 我们同样可以开启/关闭 SSR 选项([配置教程](/docs/configure/app/server/ssr)),并查看 HTML 源码。结果和【 自控式路由 】的 contacts 入口一样。
191
+
192
+ :::info 注
193
+ Modern.js Lint 规则集要求 React 组件的文件名或目录名都用 Pascal 命名风格,跟组件本身的名字保持一致,首字母大写。
194
+
195
+ `pages/` 里面的文件虽然也是 React 组件,但它们是基于约定用于指定路由的特殊组件文件,对应的是 URL 中的路径,所以这里是一种例外情况,文件名/目录名跟 [URL 命名风格](https://geemus.gitbooks.io/http-api-design/content/en/requests/downcase-paths-and-attributes.html)保持一致更好,最好用 dash 命名风格(全小写,- 连字符分隔)。
196
+ :::
197
+
198
+ 接下来我们再实现一个简单的评论详情页,因为评论会有很多条,所以评论详情页的 URL 包含动态部分,例如:`http://localhost:8080/landing-page/docs/comments/:commentTitle/`
199
+
200
+ 对于像 `:commentTitle` 这样的动态部分,Modern.js 提供了一种特殊的文件命名方式来实现。
201
+
202
+ 执行以下命令,新建以下文件:
203
+
204
+ <Tabs>
205
+ <TabItem value="macOS" label="macOS" default>
206
+
207
+ ```bash
208
+ mkdir -p src/landing-page/pages/comments/\[commentTitle\]
209
+ touch src/landing-page/pages/comments/\[commentTitle\]/index.tsx
210
+ ```
211
+
212
+ </TabItem>
213
+ <TabItem value="Windows" label="Windows">
214
+
215
+ ```powershell
216
+ mkdir -p src/landing-page/pages/comments/[commentTitle]
217
+ ni src/landing-page/pages/comments/[commentTitle\/index.tsx
218
+ ```
219
+
220
+ </TabItem>
221
+ </Tabs>
222
+
223
+ `landing-page` 入口中的文件结构变成:
224
+
225
+ ```md
226
+ .
227
+ └── pages/
228
+ ├── comments/
229
+ │ └── [commentTitle]/
230
+ │ └── index.tsx
231
+ ├── _app.tsx
232
+ ├── docs.tsx
233
+ └── index.tsx
234
+ ```
235
+
236
+ `[commentTitle]` 将会被 Modern.js 转换成动态路由。
237
+
238
+ 我们首先安装文件中需要的依赖:
239
+
240
+ ```bash
241
+ pnpm add lodash
242
+ pnpm add -D @types/lodash
243
+ ```
244
+
245
+ `pages/comments/[commentTitle]/index.tsx` 的内容为:
246
+
247
+ ```js
248
+ import { Helmet } from '@modern-js/runtime/head';
249
+ import { Link } from '@modern-js/runtime/router';
250
+ import _ from 'lodash';
251
+
252
+ const Index = ({ match: { params } }: any) => {
253
+ const title = _.startCase(params.commentTitle);
254
+ return (
255
+ <>
256
+ <Helmet>
257
+ <title>Comment: {title}</title>
258
+ </Helmet>
259
+ <p>
260
+ <Link to="/docs/">{'< Back'}</Link>
261
+ </p>
262
+ <h1>Subject: {title}</h1>
263
+ <p>Post: I am a comment</p>
264
+ </>
265
+ );
266
+ };
267
+
268
+ export default Index;
269
+ ```
270
+
271
+ 修改 `docs.tsx`,添加跳转到评论页的链接:
272
+
273
+ ```js
274
+ import { Helmet } from '@modern-js/runtime/head';
275
+ import { Link } from '@modern-js/runtime/router';
276
+
277
+ const Docs = () => (
278
+ <>
279
+ <Helmet>
280
+ <title>Docs</title>
281
+ </Helmet>
282
+ <p>I am docs</p>
283
+ <p>
284
+ <Link to="/comments/i-am-a-comment-title">[Random comment]</Link>
285
+ </p>
286
+ </>
287
+ );
288
+
289
+ export default Docs;
290
+ ```
291
+
292
+ :::info 注
293
+ `pages/` 和 `App.tsx` 一样,应该专注于路由的组织,具体的 UI 实现和业务逻辑,一旦复杂到要拆分成多个文件的程度,应该放到 `pages/` 外面,在同一个应用入口目录中,用 **feature 目录**、**role 目录**的方式来组织。
294
+
295
+ 例如使用 `src/landing-page/docs/components/Article/index.tsx` 来组织功能特性。
296
+
297
+ `landing-page/docs/` 和 `landing-page/pages/docs/` 不同,前者是 **feature 目录**,将修改频率不同或由不同人负责开发的业务逻辑,封装在同一个黑盒里,这种目录下的问题与具体路由解耦。
298
+
299
+ `pages/` 目录里的组件文件,负责把这些 feature 组件组织到一起,通过特定的路由结构提供给用户。
300
+
301
+ 因此 `pages/` 目录里基本上不应该有组件之外的文件,也不应该有过于复杂和具体的实现。
302
+ :::
303
+
304
+ 执行 `pnpm run dev`,访问 `http://localhost:8080/landing-page/docs/`,可以看到效果如下:
305
+
306
+ ![result2](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result2.png)
307
+
308
+ 点击评论链接,跳转到 `http://localhost:8080/landing-page/comments/i-am-a-comment-title`,效果如下:
309
+
310
+ ![result3](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result3.png)
311
+
312
+ URL 中的动态部分,在代码中被转换成了标题内容,修改最后部分 URL 后重新访问,标题内容同样发生改变。
313
+
314
+ 本小节中,我们学习了基本的【 约定式路由 】用法,除了 `_app.tsx` 外,我们还可以使用 [`_layout.tsx`](/docs/apis/app/hooks/src/pages#部分-layout) 实现这个访问路径下的公共 UI,可以用 [`404.tsx`](/docs/apis/app/hooks/src/pages#404-路由) 自定义 404 页面等。
315
+
316
+ ---
317
+
318
+ > 本小节的代码可以在[这里查看](https://github.com/modern-js-dev/modern-js-examples/tree/main/tutorials/c08/hello-modern-2)。
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "8: 添加客户端路由"
3
+ }
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: Serverless 开发范式
3
+ ---
4
+
5
+ 之前的章节中,我们用来渲染联系人列表的数据,都来自代码中的 Mock 数据。
6
+
7
+ 本章节中,我们将介绍如何通过 BFF 获取数据。
8
+
9
+ 在这之前,我们先回顾下上一章节 Demo 中的联系人列表应用,它有多种运行方式,比如:
10
+
11
+ - `pnpm run dev` - 在本地开发环境中用于调试
12
+ - `pnpm run build && pnpm run start` - 在生产环境中正式运行
13
+
14
+ 无论哪种方式,整个应用在运行时(runtime)都是一个【 Universal App 】,既有客户端部分(在客户端运行的 App 代码和框架代码),也有服务器端部分(框架内置的 Static Web Server 或 SSR Server,在 SSR 环节运行的 App 代码和框架代码)。
15
+
16
+ 但开发者对服务器几乎是无感知的,开发环节并没有专门写 server 代码,运行和部署的时候,也不跟具体 server 打交道,不需要运维 server,开发者可以专注于产品本身。
17
+
18
+ 这种开发范式,我们称作 Serverless Web Development。
19
+
20
+ 其中的 SSR 技术,我们称作 Serverless SSR,实现了 SSR 在开发、运行、部署全流程中的 Serverless。
21
+
22
+ 从本节开始,我们要接触 Serverless Web Development 的另一部分:Serverless BFF,跟 SSR 一样,能实现 [BFF(Backends for Frontends)](https://microservices.io/patterns/apigateway.html)在开发、运行、部署全流程中的 Serverless。
23
+
24
+ :::info 注
25
+ 我们这里说的 BFF,不是指任意的面向客户端程序的服务器端 API,而是是更纯粹、狭义的 BFF,指专门服务特定客户端程序、特定产品 UI 需求的服务器端 API。
26
+
27
+ 这种 API 更适合跟客户端代码在一起实现、调试、运行和部署,由同一个/批开发者负责。
28
+
29
+ 简单情况下这种 API 做的是对更底层 API(比如各种微服务)的聚合、映射、裁剪、代理等,复杂情况下也会访问数据存储(比如应用数据库、缓存等),有服务器端 Model 等业务逻辑分层,但都倾向于只维护很薄的一层服务器端业务逻辑。
30
+ :::
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: 启用 BFF
3
+ ---
4
+
5
+ 和之前章节一样,我们同样使用生成器来启用 BFF。
6
+
7
+ 在项目根目录下执行 `pnpm run new` 命令:
8
+
9
+ ```bash
10
+ # 启用可选功能
11
+ ❯ 启用「BFF」功能
12
+ ...
13
+
14
+ # 请选择 BFF 类型
15
+ ❯ 函数写法
16
+ 框架写法
17
+
18
+ # 请选择运行时框
19
+ ❯ Express
20
+ Koa
21
+ Egg
22
+ Nest
23
+ ```
24
+
25
+ :::info 注
26
+ 函数模式与框架模式都是基于 Modern.js 的 BFF 函数的,两种模式的主体都是函数,也都需要运行时框架的支持,这里的提问是为了提供不同的样板文件。更多相关内容可以查看[一体化 BFF 专题](/docs/guides/advanced-features/bff/function)。
27
+ :::
28
+
29
+ 我们先选择【 函数写法 】,并选择运行时框架为 Express,项目结构将变成:
30
+
31
+ ```md
32
+ .
33
+ ├── .vscode/
34
+ ├── api/
35
+ │ ├── info/
36
+ │ │ └── [type].ts
37
+ │ ├── .eslintrc.json
38
+ │ ├── _app.ts
39
+ │ └── index.ts
40
+ ├── src/
41
+ │ ├── contacts/
42
+ │ │ ├── components/
43
+ │ │ │ ├── Avatar/
44
+ │ │ │ │ ├── index.stories.tsx
45
+ │ │ │ │ └── index.tsx
46
+ │ │ │ └── Item/
47
+ │ │ │ ├── index.test.tsx
48
+ │ │ │ └── index.tsx
49
+ │ │ ├── styles/
50
+ │ │ │ └── utils.css
51
+ │ │ ├── App.css
52
+ │ │ └── App.tsx
53
+ │ ├── landing-page/
54
+ │ │ └── pages/
55
+ │ │ ├── comments/
56
+ │ │ │ └── [commentTitle]/
57
+ │ │ │ └── index.tsx
58
+ │ │ ├── _app.tsx
59
+ │ │ ├── docs.tsx
60
+ │ │ └── index.tsx
61
+ │ ├── .eslintrc.json
62
+ │ └── modern-app-env.d.ts
63
+ ├── .editorconfig
64
+ ├── .gitignore
65
+ ├── .npmrc
66
+ ├── .nvmrc
67
+ ├── README.md
68
+ ├── package.json
69
+ ├── pnpm-lock.yaml
70
+ └── tsconfig.json
71
+ ```
72
+
73
+ 新增的 `api/` 目录,跟 `src/` 目录一样是源代码目录,目录中有几个示范用法的样板文件
74
+
75
+ `package.json` 中则会增加 BFF 插件:
76
+
77
+ ```json
78
+ + "@modern-js/plugin-bff"
79
+ + "@modern-js/plugin-express"
80
+ + "express"
81
+ ```
82
+
83
+ 在函数写法中,BFF 的 API 路由也遵循类似【 约定式路由 】的生成逻辑。
84
+
85
+ Modern.js Serverless BFF 的默认前缀为 `/api`,例如上述目录结构可以得到两个 API 路由:
86
+
87
+ `http://localhost:8080/api`
88
+
89
+ `http://localhost:8080/api/info/:type`
90
+
91
+ ---
92
+
93
+ > 本小节的代码可以在[这里查看](https://github.com/modern-js-dev/modern-js-examples/tree/main/tutorials/c09/hello-modern-2)。