@modern-js/main-doc 2.0.0-beta.2 → 2.0.0-beta.4

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 (345) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/inspect.md +0 -4
  3. package/en/docusaurus-plugin-content-docs/current/apis/app/commands/new.md +0 -2
  4. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/bootstrap.md +17 -3
  5. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-app.md +1 -1
  6. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-store.md +0 -22
  7. package/en/docusaurus-plugin-content-docs/current/components/init-app.md +42 -0
  8. package/en/docusaurus-plugin-content-docs/current/components/reduck-migration.md +1 -0
  9. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/asset-prefix.md +1 -1
  10. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/hmr.md +1 -1
  11. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/https.md +1 -1
  12. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/port.md +1 -1
  13. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/progress-bar.md +1 -1
  14. package/en/docusaurus-plugin-content-docs/current/configure/app/dev/start-url.md +1 -1
  15. package/en/docusaurus-plugin-content-docs/current/configure/app/experiments/lazy-compilation.md +1 -1
  16. package/en/docusaurus-plugin-content-docs/current/configure/app/html/app-icon.md +1 -1
  17. package/en/docusaurus-plugin-content-docs/current/configure/app/html/crossorigin.md +1 -1
  18. package/en/docusaurus-plugin-content-docs/current/configure/app/html/disable-html-folder.md +1 -1
  19. package/en/docusaurus-plugin-content-docs/current/configure/app/html/favicon-by-entries.md +1 -1
  20. package/en/docusaurus-plugin-content-docs/current/configure/app/html/favicon.md +1 -1
  21. package/en/docusaurus-plugin-content-docs/current/configure/app/html/inject-by-entries.md +1 -1
  22. package/en/docusaurus-plugin-content-docs/current/configure/app/html/inject.md +1 -1
  23. package/en/docusaurus-plugin-content-docs/current/configure/app/html/meta-by-entries.md +1 -1
  24. package/en/docusaurus-plugin-content-docs/current/configure/app/html/meta.md +1 -1
  25. package/en/docusaurus-plugin-content-docs/current/configure/app/html/mount-id.md +1 -1
  26. package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-by-entries.md +1 -1
  27. package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-parameters-by-entries.md +1 -1
  28. package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-parameters.md +1 -1
  29. package/en/docusaurus-plugin-content-docs/current/configure/app/html/template.md +1 -1
  30. package/en/docusaurus-plugin-content-docs/current/configure/app/html/title-by-entries.md +1 -1
  31. package/en/docusaurus-plugin-content-docs/current/configure/app/html/title.md +1 -1
  32. package/en/docusaurus-plugin-content-docs/current/configure/app/output/asset-prefix.md +1 -1
  33. package/en/docusaurus-plugin-content-docs/current/configure/app/output/assets-retry.md +1 -1
  34. package/en/docusaurus-plugin-content-docs/current/configure/app/output/charset.md +1 -1
  35. package/en/docusaurus-plugin-content-docs/current/configure/app/output/clean-dist-path.md +1 -1
  36. package/en/docusaurus-plugin-content-docs/current/configure/app/output/convert-to-rem.md +1 -1
  37. package/en/docusaurus-plugin-content-docs/current/configure/app/output/copy.md +1 -1
  38. package/en/docusaurus-plugin-content-docs/current/configure/app/output/css-module-local-ident-name.md +1 -1
  39. package/en/docusaurus-plugin-content-docs/current/configure/app/output/data-uri-limit.md +1 -1
  40. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-extract.md +1 -1
  41. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-module-extension.md +1 -1
  42. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-filename-hash.md +1 -1
  43. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-inline-runtime-chunk.md +1 -1
  44. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-minimize.md +1 -1
  45. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-source-map.md +1 -1
  46. package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-ts-checker.md +1 -1
  47. package/en/docusaurus-plugin-content-docs/current/configure/app/output/dist-path.md +1 -1
  48. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-asset-fallback.md +1 -1
  49. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-asset-manifest.md +1 -1
  50. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-css-module-tsdeclaration.md +1 -1
  51. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-inline-scripts.md +1 -1
  52. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-inline-styles.md +1 -1
  53. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-latest-decorators.md +1 -1
  54. package/en/docusaurus-plugin-content-docs/current/configure/app/output/externals.md +1 -1
  55. package/en/docusaurus-plugin-content-docs/current/configure/app/output/filename.md +1 -1
  56. package/en/docusaurus-plugin-content-docs/current/configure/app/output/legal-comments.md +1 -1
  57. package/en/docusaurus-plugin-content-docs/current/configure/app/output/override-browserslist.md +1 -1
  58. package/en/docusaurus-plugin-content-docs/current/configure/app/output/polyfill.md +1 -1
  59. package/en/docusaurus-plugin-content-docs/current/configure/app/output/svg-default-export.md +1 -1
  60. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/build-cache.md +1 -1
  61. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/bundle-analyze.md +1 -1
  62. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/chunk-split.md +1 -1
  63. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/print-file-size.md +1 -1
  64. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/profile.md +1 -1
  65. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/remove-console.md +1 -1
  66. package/en/docusaurus-plugin-content-docs/current/configure/app/performance/remove-moment-locale.md +1 -1
  67. package/en/docusaurus-plugin-content-docs/current/configure/app/plugins.md +1 -1
  68. package/en/docusaurus-plugin-content-docs/current/configure/app/security/sri.md +1 -1
  69. package/en/docusaurus-plugin-content-docs/current/configure/app/server/routes.md +2 -4
  70. package/en/docusaurus-plugin-content-docs/current/configure/app/source/alias.md +1 -1
  71. package/en/docusaurus-plugin-content-docs/current/configure/app/source/compile-js-data-uri.md +1 -1
  72. package/en/docusaurus-plugin-content-docs/current/configure/app/source/define.md +1 -1
  73. package/en/docusaurus-plugin-content-docs/current/configure/app/source/exclude.md +1 -1
  74. package/en/docusaurus-plugin-content-docs/current/configure/app/source/global-vars.md +1 -1
  75. package/en/docusaurus-plugin-content-docs/current/configure/app/source/include.md +1 -1
  76. package/en/docusaurus-plugin-content-docs/current/configure/app/source/module-scopes.md +1 -1
  77. package/en/docusaurus-plugin-content-docs/current/configure/app/source/pre-entry.md +1 -1
  78. package/en/docusaurus-plugin-content-docs/current/configure/app/source/resolve-extension-prefix.md +1 -1
  79. package/en/docusaurus-plugin-content-docs/current/configure/app/source/resolve-main-fields.md +1 -1
  80. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/autoprefixer.md +1 -1
  81. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/babel.md +1 -1
  82. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/css-extract.md +1 -1
  83. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/css-loader.md +1 -1
  84. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/dev-server.md +1 -1
  85. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/esbuild.md +16 -39
  86. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/html-plugin.md +1 -1
  87. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/inspector.md +1 -1
  88. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/less.md +1 -1
  89. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/minify-css.md +1 -1
  90. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/postcss.md +1 -1
  91. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/pug.md +1 -1
  92. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/sass.md +1 -1
  93. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/style-loader.md +1 -1
  94. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/styled-components.md +1 -1
  95. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/swc.md +42 -0
  96. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/terser.md +1 -1
  97. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/ts-checker.md +1 -1
  98. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/ts-loader.md +1 -1
  99. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/webpack-chain.md +1 -1
  100. package/en/docusaurus-plugin-content-docs/current/configure/app/tools/webpack.md +1 -1
  101. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/builder.md +46 -0
  102. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-in-js.md +38 -0
  103. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/css-modules.md +86 -0
  104. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/less-sass.md +17 -0
  105. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/postcss.md +81 -0
  106. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/css/tailwindcss.md +95 -0
  107. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/data-fetch.md +66 -0
  108. package/en/docusaurus-plugin-content-docs/current/guides/basic-features/routes.md +270 -0
  109. package/en/docusaurus-plugin-content-docs/current/guides/concept/entries.md +116 -0
  110. package/en/docusaurus-plugin-content-docs/current/guides/concept/lifecycle.md +15 -0
  111. package/en/docusaurus-plugin-content-docs/current/guides/get-started/quick-start.md +162 -0
  112. package/en/docusaurus-plugin-content-docs/current/guides/get-started/upgrade.md +78 -0
  113. package/{zh/tutorials/first-app → en/docusaurus-plugin-content-docs/current/guides}/overview.md +4 -4
  114. package/en/docusaurus-plugin-content-docs/current/tutorials/foundations/introduction.md +1 -1
  115. package/en/docusaurus-plugin-content-docs/current.json +29 -29
  116. package/package.json +3 -3
  117. package/scripts/config.ts +2 -2
  118. package/zh/apis/app/commands/inspect.md +0 -4
  119. package/zh/apis/app/commands/new.md +1 -3
  120. package/zh/apis/app/hooks/src/index_.md +6 -5
  121. package/zh/apis/app/runtime/app/_category_.json +1 -1
  122. package/zh/apis/app/runtime/bff/_category_.json +1 -1
  123. package/zh/apis/app/runtime/core/_category_.json +1 -1
  124. package/zh/apis/app/runtime/core/bootstrap.md +17 -3
  125. package/zh/apis/app/runtime/model/_category_.json +1 -1
  126. package/zh/apis/app/runtime/model/create-app.md +1 -1
  127. package/zh/apis/app/runtime/model/use-store.md +1 -23
  128. package/zh/apis/app/runtime/router/_category_.json +1 -1
  129. package/zh/apis/app/runtime/ssr/_category_.json +1 -1
  130. package/zh/apis/app/runtime/testing/_category_.json +1 -1
  131. package/zh/apis/app/runtime/utility/_category_.json +1 -1
  132. package/zh/apis/app/runtime/web-server/_category_.json +1 -1
  133. package/zh/components/debug-app.md +18 -0
  134. package/zh/components/global-proxy.md +28 -0
  135. package/zh/components/init-app.md +44 -0
  136. package/zh/components/prerequisites.md +19 -0
  137. package/zh/components/reduck-migration.md +1 -0
  138. package/zh/configure/app/dev/asset-prefix.md +1 -1
  139. package/zh/configure/app/dev/hmr.md +1 -1
  140. package/zh/configure/app/dev/https.md +1 -1
  141. package/zh/configure/app/dev/port.md +1 -1
  142. package/zh/configure/app/dev/progress-bar.md +1 -1
  143. package/zh/configure/app/dev/start-url.md +1 -1
  144. package/zh/configure/app/experiments/_category_.json +4 -0
  145. package/zh/configure/app/experiments/lazy-compilation.md +1 -1
  146. package/zh/configure/app/html/_category_.json +4 -0
  147. package/zh/configure/app/html/app-icon.md +1 -1
  148. package/zh/configure/app/html/crossorigin.md +1 -1
  149. package/zh/configure/app/html/disable-html-folder.md +1 -1
  150. package/zh/configure/app/html/favicon-by-entries.md +1 -1
  151. package/zh/configure/app/html/favicon.md +1 -1
  152. package/zh/configure/app/html/inject-by-entries.md +1 -1
  153. package/zh/configure/app/html/inject.md +1 -1
  154. package/zh/configure/app/html/meta-by-entries.md +1 -1
  155. package/zh/configure/app/html/meta.md +1 -1
  156. package/zh/configure/app/html/mount-id.md +1 -1
  157. package/zh/configure/app/html/template-by-entries.md +1 -1
  158. package/zh/configure/app/html/template-parameters-by-entries.md +1 -1
  159. package/zh/configure/app/html/template-parameters.md +1 -1
  160. package/zh/configure/app/html/template.md +1 -1
  161. package/zh/configure/app/html/title-by-entries.md +1 -1
  162. package/zh/configure/app/html/title.md +1 -1
  163. package/zh/configure/app/output/asset-prefix.md +1 -1
  164. package/zh/configure/app/output/assets-retry.md +1 -1
  165. package/zh/configure/app/output/charset.md +1 -1
  166. package/zh/configure/app/output/clean-dist-path.md +1 -1
  167. package/zh/configure/app/output/convert-to-rem.md +1 -1
  168. package/zh/configure/app/output/copy.md +1 -1
  169. package/zh/configure/app/output/css-module-local-ident-name.md +1 -1
  170. package/zh/configure/app/output/data-uri-limit.md +1 -1
  171. package/zh/configure/app/output/disable-css-extract.md +1 -1
  172. package/zh/configure/app/output/disable-css-module-extension.md +1 -1
  173. package/zh/configure/app/output/disable-filename-hash.md +1 -1
  174. package/zh/configure/app/output/disable-inline-runtime-chunk.md +1 -1
  175. package/zh/configure/app/output/disable-minimize.md +1 -1
  176. package/zh/configure/app/output/disable-source-map.md +1 -1
  177. package/zh/configure/app/output/disable-ts-checker.md +1 -1
  178. package/zh/configure/app/output/dist-path.md +1 -1
  179. package/zh/configure/app/output/enable-asset-fallback.md +1 -1
  180. package/zh/configure/app/output/enable-asset-manifest.md +1 -1
  181. package/zh/configure/app/output/enable-css-module-tsdeclaration.md +1 -1
  182. package/zh/configure/app/output/enable-inline-scripts.md +1 -1
  183. package/zh/configure/app/output/enable-inline-styles.md +1 -1
  184. package/zh/configure/app/output/enable-latest-decorators.md +1 -1
  185. package/zh/configure/app/output/externals.md +1 -1
  186. package/zh/configure/app/output/filename.md +1 -1
  187. package/zh/configure/app/output/legal-comments.md +1 -1
  188. package/zh/configure/app/output/override-browserslist.md +1 -1
  189. package/zh/configure/app/output/polyfill.md +1 -1
  190. package/zh/configure/app/output/ssg.md +118 -114
  191. package/zh/configure/app/output/svg-default-export.md +1 -1
  192. package/zh/configure/app/performance/_category_.json +4 -0
  193. package/zh/configure/app/performance/build-cache.md +1 -1
  194. package/zh/configure/app/performance/bundle-analyze.md +1 -1
  195. package/zh/configure/app/performance/chunk-split.md +1 -1
  196. package/zh/configure/app/performance/print-file-size.md +1 -1
  197. package/zh/configure/app/performance/profile.md +1 -1
  198. package/zh/configure/app/performance/remove-console.md +1 -1
  199. package/zh/configure/app/performance/remove-moment-locale.md +1 -1
  200. package/zh/configure/app/plugins.md +1 -1
  201. package/zh/configure/app/runtime/state.md +13 -0
  202. package/zh/configure/app/security/_category_.json +4 -0
  203. package/zh/configure/app/security/sri.md +1 -1
  204. package/zh/configure/app/server/routes.md +2 -4
  205. package/zh/configure/app/server/ssr.md +0 -2
  206. package/zh/configure/app/source/alias.md +1 -1
  207. package/zh/configure/app/source/compile-js-data-uri.md +1 -1
  208. package/zh/configure/app/source/define.md +1 -1
  209. package/zh/configure/app/source/exclude.md +1 -1
  210. package/zh/configure/app/source/global-vars.md +1 -1
  211. package/zh/configure/app/source/include.md +1 -1
  212. package/zh/configure/app/source/module-scopes.md +1 -1
  213. package/zh/configure/app/source/pre-entry.md +1 -1
  214. package/zh/configure/app/source/resolve-extension-prefix.md +1 -1
  215. package/zh/configure/app/source/resolve-main-fields.md +1 -1
  216. package/zh/configure/app/tools/autoprefixer.md +1 -1
  217. package/zh/configure/app/tools/babel.md +1 -1
  218. package/zh/configure/app/tools/css-extract.md +1 -1
  219. package/zh/configure/app/tools/css-loader.md +1 -1
  220. package/zh/configure/app/tools/dev-server.md +1 -1
  221. package/zh/configure/app/tools/esbuild.md +16 -39
  222. package/zh/configure/app/tools/html-plugin.md +1 -1
  223. package/zh/configure/app/tools/inspector.md +1 -1
  224. package/zh/configure/app/tools/less.md +1 -1
  225. package/zh/configure/app/tools/minify-css.md +1 -1
  226. package/zh/configure/app/tools/postcss.md +1 -1
  227. package/zh/configure/app/tools/pug.md +1 -1
  228. package/zh/configure/app/tools/sass.md +1 -1
  229. package/zh/configure/app/tools/style-loader.md +1 -1
  230. package/zh/configure/app/tools/styled-components.md +1 -1
  231. package/zh/configure/app/tools/swc.md +42 -0
  232. package/zh/configure/app/tools/terser.md +1 -1
  233. package/zh/configure/app/tools/ts-checker.md +1 -1
  234. package/zh/configure/app/tools/ts-loader.md +1 -1
  235. package/zh/configure/app/tools/webpack-chain.md +1 -1
  236. package/zh/configure/app/tools/webpack.md +1 -1
  237. package/zh/guides/advanced-features/bff/bff-proxy.md +1 -1
  238. package/zh/guides/advanced-features/compatibility.md +2 -38
  239. package/zh/guides/advanced-features/custom-app.md +23 -19
  240. package/zh/guides/advanced-features/ssg.md +73 -62
  241. package/zh/guides/advanced-features/ssr.md +142 -36
  242. package/zh/guides/advanced-features/testing.md +33 -1
  243. package/zh/guides/advanced-features/web-server.md +2 -2
  244. package/zh/guides/basic-features/builder.md +46 -0
  245. package/zh/guides/basic-features/css/_category_.json +1 -1
  246. package/zh/guides/basic-features/css/less-sass.md +1 -14
  247. package/zh/guides/basic-features/css/tailwindcss.md +2 -6
  248. package/zh/guides/basic-features/data-fetch.md +1 -1
  249. package/zh/guides/basic-features/env-vars.md +34 -0
  250. package/zh/guides/basic-features/html.md +182 -0
  251. package/zh/guides/basic-features/mock.md +3 -9
  252. package/zh/guides/basic-features/proxy.md +2 -27
  253. package/zh/guides/basic-features/routes.md +32 -35
  254. package/zh/guides/concept/entries.md +8 -9
  255. package/zh/guides/get-started/quick-start.md +6 -78
  256. package/zh/guides/get-started/upgrade.md +8 -8
  257. package/zh/guides/topic-detail/framework-plugin/extend.md +3 -4
  258. package/zh/{apis/app/runtime/plugin/hook-api.md → guides/topic-detail/framework-plugin/hook-list.md} +42 -135
  259. package/zh/{apis/app/runtime/plugin → guides/topic-detail/framework-plugin}/hook.md +2 -3
  260. package/zh/guides/topic-detail/framework-plugin/implement.md +21 -10
  261. package/zh/guides/topic-detail/framework-plugin/introduction.md +49 -0
  262. package/{en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin → zh/guides/topic-detail/framework-plugin}/plugin-api.md +3 -4
  263. package/zh/guides/topic-detail/framework-plugin/relationship.md +2 -3
  264. package/zh/guides/topic-detail/model/quick-start.md +5 -1
  265. package/zh/guides/topic-detail/model/test-model.md +2 -2
  266. package/zh/guides/topic-detail/monorepo/intro.md +1 -1
  267. package/zh/guides/troubleshooting/dependencies.md +0 -69
  268. package/zh/tutorials/first-app/_category_.json +1 -1
  269. package/zh/tutorials/first-app/c01-start.md +94 -0
  270. package/zh/tutorials/first-app/c02-component.md +56 -0
  271. package/zh/tutorials/first-app/c03-css.md +305 -0
  272. package/zh/tutorials/first-app/c04-routes.md +169 -0
  273. package/zh/tutorials/first-app/c05-loader.md +82 -0
  274. package/zh/tutorials/first-app/c06-model.md +256 -0
  275. package/zh/tutorials/first-app/c07-container.md +268 -0
  276. package/zh/tutorials/first-app/c08-entries.md +134 -0
  277. package/zh/tutorials/foundations/introduction.md +2 -2
  278. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/default-alias.md +0 -25
  279. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/_category_.json +0 -4
  280. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/abstract.md +0 -26
  281. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/hook-api.md +0 -896
  282. package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/hook.md +0 -170
  283. package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-modern-mode.md +0 -34
  284. package/zh/apis/app/runtime/default-alias.md +0 -23
  285. package/zh/apis/app/runtime/plugin/_category_.json +0 -4
  286. package/zh/apis/app/runtime/plugin/abstract.md +0 -26
  287. package/zh/apis/app/runtime/plugin/plugin-api.md +0 -117
  288. package/zh/apis/generator/overview.md +0 -32
  289. package/zh/configure/app/output/enable-modern-mode.md +0 -34
  290. package/zh/guides/basic-features/image.md +0 -43
  291. package/zh/guides/topic-detail/compile-speed.md +0 -182
  292. package/zh/guides/topic-detail/framework-plugin/abstract.md +0 -27
  293. package/zh/guides/topic-detail/monorepo/deploy.md +0 -43
  294. package/zh/guides/troubleshooting/compile.md +0 -379
  295. package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +0 -25
  296. package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +0 -118
  297. package/zh/tutorials/first-app/c01-getting-started/1.3-dev-command.md +0 -29
  298. package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +0 -44
  299. package/zh/tutorials/first-app/c01-getting-started/1.5-start-command.md +0 -18
  300. package/zh/tutorials/first-app/c01-getting-started/1.6-create-repo.md +0 -31
  301. package/zh/tutorials/first-app/c01-getting-started/_category_.json +0 -3
  302. package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +0 -79
  303. package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +0 -36
  304. package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +0 -21
  305. package/zh/tutorials/first-app/c02-generator-and-studio/_category_.json +0 -3
  306. package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +0 -55
  307. package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +0 -66
  308. package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +0 -11
  309. package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +0 -63
  310. package/zh/tutorials/first-app/c03-ide/_category_.json +0 -3
  311. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +0 -67
  312. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +0 -111
  313. package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.3-compatibility.md +0 -67
  314. package/zh/tutorials/first-app/c04-es6-plus-and-ts/_category_.json +0 -3
  315. package/zh/tutorials/first-app/c05-component/5.1-use-ui-library.md +0 -68
  316. package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +0 -92
  317. package/zh/tutorials/first-app/c05-component/_category_.json +0 -3
  318. package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +0 -110
  319. package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +0 -148
  320. package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +0 -84
  321. package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +0 -83
  322. package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +0 -77
  323. package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +0 -113
  324. package/zh/tutorials/first-app/c06-css-and-component/_category_.json +0 -3
  325. package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +0 -64
  326. package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +0 -100
  327. package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +0 -74
  328. package/zh/tutorials/first-app/c07-app-entry/_category_.json +0 -3
  329. package/zh/tutorials/first-app/c08-client-side-routing/8.1-code-based-routing.md +0 -153
  330. package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +0 -310
  331. package/zh/tutorials/first-app/c08-client-side-routing/_category_.json +0 -3
  332. package/zh/tutorials/first-app/c09-bff/9.1-serverless.md +0 -30
  333. package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +0 -93
  334. package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +0 -205
  335. package/zh/tutorials/first-app/c09-bff/_category_.json +0 -3
  336. package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +0 -23
  337. package/zh/tutorials/first-app/c10-model/10.2-add-model.md +0 -185
  338. package/zh/tutorials/first-app/c10-model/10.3-use-model.md +0 -54
  339. package/zh/tutorials/first-app/c10-model/10.4-testing.md +0 -69
  340. package/zh/tutorials/first-app/c10-model/_category_.json +0 -3
  341. package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +0 -274
  342. package/zh/tutorials/first-app/c11-container/11.2-add-container.md +0 -106
  343. package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +0 -61
  344. package/zh/tutorials/first-app/c11-container/11.4-testing.md +0 -56
  345. package/zh/tutorials/first-app/c11-container/_category_.json +0 -3
@@ -1,310 +0,0 @@
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
- 假设这个 `landing-page` 入口是一个简单的有导航栏的落地页,包含两个子页面:一个首页和一个文档页,我们用客户端路由的方式来区别这两个子页面。
97
-
98
- 我们先分别实现这个入口两个子页面的内容,`src/landing-page/pages/index.tsx` 是首页,内容为:
99
-
100
- ```js
101
- import { Helmet } from '@modern-js/runtime/head';
102
-
103
- const Index = () => (
104
- <>
105
- <Helmet>
106
- <title>Home</title>
107
- </Helmet>
108
- <p>
109
- Welcome to <a href="/contacts">Contact List</a>!
110
- </p>
111
- </>
112
- );
113
-
114
- export default Index;
115
- ```
116
-
117
- `src/landing-page/pages/docs.tsx` 是文档页,内容为:
118
-
119
- ```js
120
- import { Helmet } from '@modern-js/runtime/head';
121
-
122
- const Docs = () => (
123
- <>
124
- <Helmet>
125
- <title>Docs</title>
126
- </Helmet>
127
- <p>I am docs</p>
128
- </>
129
- );
130
-
131
- export default Docs;
132
- ```
133
-
134
- 最后,`src/landing-page/pages/_app.tsx` 是下划线开头的,代表这是【 约定式路由 】中一个特殊的功能文件,为整个入口提供根组件,可以用于实现全局布局、公共 UI 等。
135
-
136
- 在这里,我们只实现一个简单的导航和结构:
137
-
138
- ```js
139
- import { ComponentType } from 'react';
140
- import { NavLink } from '@modern-js/runtime/router';
141
-
142
- const App = ({ Component, ...pageProps }: { Component: ComponentType }) => (
143
- <div>
144
- <h2>Nav:</h2>
145
- <ul>
146
- <li>
147
- <NavLink
148
- to="/"
149
- exact={true}
150
- activeStyle={{
151
- color: '#f60',
152
- }}>
153
- Home
154
- </NavLink>
155
- </li>
156
- <li>
157
- <NavLink
158
- to="/docs"
159
- activeStyle={{
160
- color: '#f60',
161
- }}>
162
- Docs
163
- </NavLink>
164
- </li>
165
- </ul>
166
- <h2>Content:</h2>
167
- <Component {...pageProps} />
168
- </div>
169
- );
170
-
171
- export default App;
172
- ```
173
-
174
- 执行 `pnpm run dev`,访问 `http://localhost:8080/landing-page/`,可以看到结果:
175
-
176
- ![result](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result.png)
177
-
178
- 点击 Nav 里的链接,URL 变为 `http://localhost:8080/landing-page/docs`,内容会变为:
179
-
180
- ![result1](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result1.png)
181
-
182
- 我们同样可以开启/关闭 SSR 选项([配置教程](/docs/configure/app/server/ssr)),并查看 HTML 源码。结果和【 自控式路由 】的 contacts 入口一样。
183
-
184
- :::info 注
185
- Modern.js Lint 规则集要求 React 组件的文件名或目录名都用 Pascal 命名风格,跟组件本身的名字保持一致,首字母大写。
186
-
187
- `pages/` 里面的文件虽然也是 React 组件,但它们是基于约定用于指定路由的特殊组件文件,对应的是 URL 中的路径,所以这里是一种例外情况,文件名/目录名跟 [URL 命名风格](https://geemus.gitbooks.io/http-api-design/content/en/requests/downcase-paths-and-attributes.html)保持一致更好,最好用 dash 命名风格(全小写,- 连字符分隔)。
188
- :::
189
-
190
- 接下来我们再实现一个简单的评论详情页,因为评论会有很多条,所以评论详情页的 URL 包含动态部分,例如:`http://localhost:8080/landing-page/docs/comments/:commentTitle/`
191
-
192
- 对于像 `:commentTitle` 这样的动态部分,Modern.js 提供了一种特殊的文件命名方式来实现。
193
-
194
- 执行以下命令,新建以下文件:
195
-
196
- <Tabs>
197
- <TabItem value="macOS" label="macOS" default>
198
-
199
- ```bash
200
- mkdir -p src/landing-page/pages/comments/\[commentTitle\]
201
- touch src/landing-page/pages/comments/\[commentTitle\]/index.tsx
202
- ```
203
-
204
- </TabItem>
205
- <TabItem value="Windows" label="Windows">
206
-
207
- ```powershell
208
- mkdir -p src/landing-page/pages/comments/[commentTitle]
209
- ni src/landing-page/pages/comments/[commentTitle\/index.tsx
210
- ```
211
-
212
- </TabItem>
213
- </Tabs>
214
-
215
- `landing-page` 入口中的文件结构变成:
216
-
217
- ```md
218
- .
219
- └── pages/
220
- ├── comments/
221
- │ └── [commentTitle]/
222
- │ └── index.tsx
223
- ├── _app.tsx
224
- ├── docs.tsx
225
- └── index.tsx
226
- ```
227
-
228
- `[commentTitle]` 将会被 Modern.js 转换成动态路由。
229
-
230
- 我们首先安装文件中需要的依赖:
231
-
232
- ```bash
233
- pnpm add lodash
234
- pnpm add -D @types/lodash
235
- ```
236
-
237
- `pages/comments/[commentTitle]/index.tsx` 的内容为:
238
-
239
- ```js
240
- import { Helmet } from '@modern-js/runtime/head';
241
- import { Link } from '@modern-js/runtime/router';
242
- import _ from 'lodash';
243
-
244
- const Index = ({ match: { params } }: any) => {
245
- const title = _.startCase(params.commentTitle);
246
- return (
247
- <>
248
- <Helmet>
249
- <title>Comment: {title}</title>
250
- </Helmet>
251
- <p>
252
- <Link to="/docs/">{'< Back'}</Link>
253
- </p>
254
- <h1>Subject: {title}</h1>
255
- <p>Post: I am a comment</p>
256
- </>
257
- );
258
- };
259
-
260
- export default Index;
261
- ```
262
-
263
- 修改 `docs.tsx`,添加跳转到评论页的链接:
264
-
265
- ```js
266
- import { Helmet } from '@modern-js/runtime/head';
267
- import { Link } from '@modern-js/runtime/router';
268
-
269
- const Docs = () => (
270
- <>
271
- <Helmet>
272
- <title>Docs</title>
273
- </Helmet>
274
- <p>I am docs</p>
275
- <p>
276
- <Link to="/comments/i-am-a-comment-title">[Random comment]</Link>
277
- </p>
278
- </>
279
- );
280
-
281
- export default Docs;
282
- ```
283
-
284
- :::info 注
285
- `pages/` 和 `App.tsx` 一样,应该专注于路由的组织,具体的 UI 实现和业务逻辑,一旦复杂到要拆分成多个文件的程度,应该放到 `pages/` 外面,在同一个应用入口目录中,用 **feature 目录**、**role 目录**的方式来组织。
286
-
287
- 例如使用 `src/landing-page/docs/components/Article/index.tsx` 来组织功能特性。
288
-
289
- `landing-page/docs/` 和 `landing-page/pages/docs/` 不同,前者是 **feature 目录**,将修改频率不同或由不同人负责开发的业务逻辑,封装在同一个黑盒里,这种目录下的问题与具体路由解耦。
290
-
291
- `pages/` 目录里的组件文件,负责把这些 feature 组件组织到一起,通过特定的路由结构提供给用户。
292
-
293
- 因此 `pages/` 目录里基本上不应该有组件之外的文件,也不应该有过于复杂和具体的实现。
294
- :::
295
-
296
- 执行 `pnpm run dev`,访问 `http://localhost:8080/landing-page/docs/`,可以看到效果如下:
297
-
298
- ![result2](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result2.png)
299
-
300
- 点击评论链接,跳转到 `http://localhost:8080/landing-page/comments/i-am-a-comment-title`,效果如下:
301
-
302
- ![result3](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/result3.png)
303
-
304
- URL 中的动态部分,在代码中被转换成了标题内容,修改最后部分 URL 后重新访问,标题内容同样发生改变。
305
-
306
- 本小节中,我们学习了基本的【 约定式路由 】用法,除了 `_app.tsx` 外,我们还可以使用 [`_layout.tsx`](/docs/apis/app/hooks/src/pages#部分-layout) 实现这个访问路径下的公共 UI,可以用 [`404.tsx`](/docs/apis/app/hooks/src/pages#404-路由) 自定义 404 页面等。
307
-
308
- ---
309
-
310
- > 本小节的代码可以在[这里查看](https://github.com/modern-js-dev/modern-js-examples/tree/main/tutorials/c08/hello-modern-2)。
@@ -1,3 +0,0 @@
1
- {
2
- "label": "8: 添加客户端路由"
3
- }
@@ -1,30 +0,0 @@
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
- :::
@@ -1,93 +0,0 @@
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)。
@@ -1,205 +0,0 @@
1
- ---
2
- title: 从 BFF 获取数据
3
- ---
4
-
5
- 上一小节中,我们创建了【 函数写法 】的 BFF,这一小节中,我们将用该模式为联系人列表实现一个数据接口。
6
-
7
- 我们首先把不需要的样板文件清理掉,把 `index.ts` 重命名为 `contacts.ts`,执行以下命令:
8
-
9
- import Tabs from '@theme/Tabs';
10
- import TabItem from '@theme/TabItem';
11
-
12
- <Tabs>
13
- <TabItem value="macOS" label="macOS" default>
14
-
15
- ```bash
16
- rm -r api/info api/_app.ts
17
- mv api/index.ts api/contacts.ts
18
- ```
19
-
20
- </TabItem>
21
- <TabItem value="Windows" label="Windows">
22
-
23
- ```powershell
24
- rm -r api/info
25
- rm api/_app.ts
26
- mv api/index.ts api/contacts.ts
27
- ```
28
-
29
- </TabItem>
30
- </Tabs>
31
-
32
-
33
- 此时 API 路由将变为 `/api/contacts`。
34
-
35
- 我们使用 [faker](https://github.com/Marak/Faker.js) 来 mock 需要的数据,首先安装依赖:
36
-
37
- ```bash
38
- pnpm add faker
39
- ```
40
-
41
- 将 `api/contacts.ts` 内容改为:
42
-
43
- ```js
44
- import { name, internet } from 'faker';
45
-
46
- export const get = async () => {
47
- const mockData = new Array(20).fill(0).map(() => {
48
- const firstName = name.firstName();
49
- return {
50
- name: firstName,
51
- avatar: `https://avatars.dicebear.com/api/identicon/${firstName}.svg`,
52
- email: internet.email(),
53
- };
54
- });
55
-
56
- return { code: 200, data: mockData };
57
- };
58
- ```
59
-
60
- :::info 注
61
- 数据同样可以从远端接口获取,此处仅为了演示。
62
- :::
63
-
64
- 执行 `pnpm run dev`,访问 `http://localhost:8080/api/contacts`:
65
-
66
- ![browser-result](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/api-result.png)
67
-
68
- 接下来我们把 `src/contacts/App.tsx` 里硬编码的 `mockData` 改成从 BFF 加载。
69
-
70
- 我们将业务逻辑迁移到组件中,`App.tsx` 只保留简单的路由部分,执行:
71
-
72
- <Tabs>
73
- <TabItem value="macOS" label="macOS" default>
74
-
75
- ```bash
76
- mkdir -p src/contacts/components/AllContacts/
77
- mkdir -p src/contacts/components/ArchivedContacts/
78
- touch src/contacts/components/AllContacts/index.tsx
79
- touch src/contacts/components/ArchivedContacts/index.tsx
80
- ```
81
-
82
- </TabItem>
83
- <TabItem value="Windows" label="Windows">
84
-
85
- ```powershell
86
- mkdir -p src/contacts/components/AllContacts/
87
- mkdir -p src/contacts/components/ArchivedContacts/
88
- ni src/contacts/components/AllContacts/index.tsx
89
- ni src/contacts/components/ArchivedContacts/index.tsx
90
- ```
91
-
92
- </TabItem>
93
- </Tabs>
94
-
95
- `ArchivedContacts/index.tsx` 的内容:
96
-
97
- ```js
98
- import { List } from 'antd';
99
- import Item from '../Item';
100
-
101
- const getAvatar = (users: Array<{ name: string; email: string }>) =>
102
- users.map(user => ({
103
- ...user,
104
- avatar: `https://avatars.dicebear.com/v2/identicon/${user.name}.svg`,
105
- }));
106
-
107
- const mockArchivedData = getAvatar([
108
- { name: 'Thomas', email: 'w.kccip@bllmfbgv.dm' },
109
- { name: 'Chow', email: 'f.lfqljnlk@ywoefljhc.af' },
110
- ]);
111
-
112
- const ArchivedContacts = () => (
113
- <List
114
- dataSource={mockArchivedData}
115
- renderItem={info => <Item key={info.name} info={info} />}
116
- />
117
- );
118
-
119
- export default ArchivedContacts;
120
- ```
121
-
122
- `AllContacts/index.tsx` 的内容:
123
-
124
- ```tsx
125
- import { useState, useEffect } from 'react';
126
- import { List } from 'antd';
127
- import { get as contacts } from '@api/contacts';
128
- import Item from '../Item';
129
-
130
- const AllContacts = () => {
131
- const [list, setList] = useState(
132
- [] as Array<{ name: string; email: string; avatar: string }>,
133
- );
134
- const loadMockData = async () => {
135
- const { data } = await contacts();
136
- setList(data);
137
- };
138
- useEffect(() => {
139
- if (!list.length) {
140
- loadMockData();
141
- }
142
- });
143
- return (
144
- (list.length && (
145
- <List
146
- dataSource={list}
147
- renderItem={info => <Item key={info.name} info={info} />}
148
- />
149
- )) || (
150
- <div className="p-4 items-center border-gray-200 border-b border-t custom-text-gray">
151
- Pending...
152
- </div>
153
- )
154
- );
155
- };
156
-
157
- export default AllContacts;
158
- ```
159
-
160
- 在 Modern.js 中,可以通过调用函数(前后端一体化)的方式,直接调用 BFF 接口,调用时无需关心域名、路径等。
161
-
162
- :::info 注
163
- 在使用 `pnpm run new` 创建 BFF 时,Modern.js 已经默认在 `tsconig.json` 中注入了别名。这也是之前提到的,生成器在项目创建之后并不会被抛弃,仍旧可以在开发过程中不断为项目提供新的内容。
164
- :::
165
-
166
- 接下来修改 `src/contacts/App.tsx`,把 `List` 组件的调用代码替换成上面的 `AllContacts` 和 `ArchivedContacts`:
167
-
168
- ```tsx
169
- <Route path="/" exact={true}>
170
- <Helmet>
171
- <title>All</title>
172
- </Helmet>
173
- <AllContacts />
174
- </Route>
175
- <Route path="/archives" exact={true}>
176
- <Helmet>
177
- <title>Archives</title>
178
- </Helmet>
179
- <ArchivedContacts />
180
- </Route>
181
- ```
182
-
183
- 删除 `App.tsx` 里的 mock 数据和 `List` 组件,把 `Item` 组件替换成 `ContactList`:
184
-
185
- ```tsx
186
- import { useState } from 'react';
187
- import { Radio, RadioChangeEvent } from 'antd';
188
- import { Route, Switch, useHistory } from '@modern-js/runtime/router';
189
- import { Helmet } from '@modern-js/runtime/head';
190
- import 'tailwindcss/base.css';
191
- import 'tailwindcss/components.css';
192
- import 'tailwindcss/utilities.css';
193
- import './styles/utils.css';
194
- import AllContacts from './components/AllContacts';
195
- import ArchivedContacts from './components/ArchivedContacts';
196
- ```
197
-
198
- 执行 `pnpm run dev`,再打开页面`http://localhost:8000/contacts`,可以看到页面加载后,会先初始化联系人数据(显示 pending),之后每次切换到 All 列表,也会重新请求联系人数据:
199
-
200
- ![browser-result](https://lf3-static.bytednsdoc.com/obj/eden-cn/aphqeh7uhohpquloj/modern-js/docs/08/browser-result.png)
201
-
202
- ---
203
-
204
- > 本小节的代码可以在[这里查看](https://github.com/modern-js-dev/modern-js-examples/tree/main/tutorials/c09/hello-modern-3)。
205
-
@@ -1,3 +0,0 @@
1
- {
2
- "label": "9: 添加 BFF"
3
- }
@@ -1,23 +0,0 @@
1
- ---
2
- title: 应用架构
3
- ---
4
-
5
- 上一章节中,我们把硬编码的 `mockData` 改成从 BFF 加载,从 `App.tsx` 里拆分出了 `components/AllContacts.tsx` 和 `components/ArchivedContacts.tsx`,在 `AllContacts` 组件里用 BFF 函数,获取到联系人数据之后,保存在 `AllContacts` 的组件内部状态里,而 `ArchivedContacts` 组件暂时继续使用 mock 数据。
6
-
7
- 本章节中,为了进一步实现项目功能,我们需要让 `AllContacts` 和 `ArchivedContacts` 都从 BFF 获取数据,还要实现【 Archive 】按钮,点击按钮能把联系人归档。
8
-
9
- 业务逻辑变复杂之后,相关代码不可避免会变多,如果都写在 AllContacts 组件或其他组件里,都会让这个组件的可读性和可维护性变差,让做不同事情的代码混在一起。
10
-
11
- 原本可以跟 UI 完全解耦的业务逻辑(比如网络请求、纯数据的操作、状态的管理等)跟 UI 逻辑(比如联系人列表如何展现)混在一起,当需要修改 UI 的时候,不得不跟 UI 无关的业务逻辑代码打交道,反过来也一样,不符合【 [单一职责原则(SRP)](https://zh.wikipedia.org/wiki/%E5%8D%95%E4%B8%80%E5%8A%9F%E8%83%BD%E5%8E%9F%E5%88%99)】,也做不到【 [关注点分离(SoC)](https://zh.wikipedia.org/wiki/%E5%85%B3%E6%B3%A8%E7%82%B9%E5%88%86%E7%A6%BB)】。
12
-
13
- 从这里开始,我们发现如果这是个真实的项目,继续这样写下去会产生越来越多面条式代码,仅凭 React 组件这一种抽象方式,不足以让代码足够结构化,随着项目不断积累业务逻辑、复杂性和变更,技术债也会积累,最终可能变成没人愿意碰的祖传代码。
14
-
15
- 像这样的项目,需要更健全的**客户端应用架构**。
16
-
17
- Modern.js 提供开箱即用的**应用架构**,支持几种扮演不同**角色(role)**、属于不同**分层(layer)**的代码模块类型,可以把业务逻辑解耦到不同类型的代码模块里,做到高[内聚](https://zh.wikipedia.org/wiki/%E5%85%A7%E8%81%9A%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8))低[耦合](https://zh.wikipedia.org/wiki/%E8%80%A6%E5%90%88%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8))。
18
-
19
- 之前介绍的 `App.tsx` 和 `pages/` 都是其中一种代码模块,通过在最顶层对客户端路由的管理,把其他代码模块最终组织到一起,形成应用。
20
-
21
- 当前项目里 `components/` 目录中的 React 组件,是一种可以称作【 视图组件 】的代码模块,负责 UI、交互上的界面展现。
22
-
23
- 本章节我们来把 `AllContacts` 组件中可以跟 UI 解耦的业务逻辑,移到一种叫【 Model(业务模型)】的代码模块里。