@modern-js/main-doc 2.0.0-beta.2 → 2.0.0-beta.3
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.
- package/.turbo/turbo-build.log +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/commands/new.md +0 -2
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/core/bootstrap.md +17 -3
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/create-app.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/model/use-store.md +0 -22
- package/en/docusaurus-plugin-content-docs/current/components/reduck-migration.md +1 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/asset-prefix.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/hmr.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/https.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/port.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/progress-bar.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/dev/start-url.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/experiments/lazy-compilation.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/app-icon.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/crossorigin.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/disable-html-folder.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/favicon-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/favicon.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/inject-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/inject.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/meta-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/meta.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/mount-id.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-parameters-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/template-parameters.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/template.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/title-by-entries.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/html/title.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/asset-prefix.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/assets-retry.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/charset.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/clean-dist-path.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/convert-to-rem.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/copy.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/css-module-local-ident-name.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/data-uri-limit.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-extract.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-css-module-extension.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-filename-hash.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-inline-runtime-chunk.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-minimize.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-source-map.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/disable-ts-checker.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/dist-path.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-asset-fallback.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-asset-manifest.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-css-module-tsdeclaration.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-inline-scripts.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-inline-styles.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/enable-latest-decorators.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/externals.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/filename.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/legal-comments.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/override-browserslist.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/polyfill.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/output/svg-default-export.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/build-cache.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/bundle-analyze.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/chunk-split.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/print-file-size.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/profile.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/remove-console.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/performance/remove-moment-locale.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/plugins.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/security/sri.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/alias.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/compile-js-data-uri.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/define.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/exclude.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/global-vars.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/include.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/module-scopes.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/pre-entry.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/resolve-extension-prefix.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/source/resolve-main-fields.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/autoprefixer.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/babel.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/css-extract.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/css-loader.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/dev-server.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/html-plugin.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/inspector.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/less.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/minify-css.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/postcss.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/pug.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/sass.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/style-loader.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/styled-components.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/swc.md +42 -0
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/terser.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/ts-checker.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/ts-loader.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/webpack-chain.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/configure/app/tools/webpack.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/guides/basic-features/builder.md +46 -0
- package/en/docusaurus-plugin-content-docs/current.json +18 -18
- package/package.json +3 -3
- package/scripts/config.ts +2 -2
- package/zh/apis/app/commands/new.md +0 -2
- package/zh/apis/app/runtime/app/_category_.json +1 -1
- package/zh/apis/app/runtime/bff/_category_.json +1 -1
- package/zh/apis/app/runtime/core/_category_.json +1 -1
- package/zh/apis/app/runtime/core/bootstrap.md +17 -3
- package/zh/apis/app/runtime/model/_category_.json +1 -1
- package/zh/apis/app/runtime/model/create-app.md +1 -1
- package/zh/apis/app/runtime/model/use-store.md +1 -23
- package/zh/apis/app/runtime/router/_category_.json +1 -1
- package/zh/apis/app/runtime/ssr/_category_.json +1 -1
- package/zh/apis/app/runtime/testing/_category_.json +1 -1
- package/zh/apis/app/runtime/utility/_category_.json +1 -1
- package/zh/apis/app/runtime/web-server/_category_.json +1 -1
- package/zh/components/reduck-migration.md +1 -0
- package/zh/configure/app/dev/asset-prefix.md +1 -1
- package/zh/configure/app/dev/hmr.md +1 -1
- package/zh/configure/app/dev/https.md +1 -1
- package/zh/configure/app/dev/port.md +1 -1
- package/zh/configure/app/dev/progress-bar.md +1 -1
- package/zh/configure/app/dev/start-url.md +1 -1
- package/zh/configure/app/experiments/_category_.json +4 -0
- package/zh/configure/app/experiments/lazy-compilation.md +1 -1
- package/zh/configure/app/html/_category_.json +4 -0
- package/zh/configure/app/html/app-icon.md +1 -1
- package/zh/configure/app/html/crossorigin.md +1 -1
- package/zh/configure/app/html/disable-html-folder.md +1 -1
- package/zh/configure/app/html/favicon-by-entries.md +1 -1
- package/zh/configure/app/html/favicon.md +1 -1
- package/zh/configure/app/html/inject-by-entries.md +1 -1
- package/zh/configure/app/html/inject.md +1 -1
- package/zh/configure/app/html/meta-by-entries.md +1 -1
- package/zh/configure/app/html/meta.md +1 -1
- package/zh/configure/app/html/mount-id.md +1 -1
- package/zh/configure/app/html/template-by-entries.md +1 -1
- package/zh/configure/app/html/template-parameters-by-entries.md +1 -1
- package/zh/configure/app/html/template-parameters.md +1 -1
- package/zh/configure/app/html/template.md +1 -1
- package/zh/configure/app/html/title-by-entries.md +1 -1
- package/zh/configure/app/html/title.md +1 -1
- package/zh/configure/app/output/asset-prefix.md +1 -1
- package/zh/configure/app/output/assets-retry.md +1 -1
- package/zh/configure/app/output/charset.md +1 -1
- package/zh/configure/app/output/clean-dist-path.md +1 -1
- package/zh/configure/app/output/convert-to-rem.md +1 -1
- package/zh/configure/app/output/copy.md +1 -1
- package/zh/configure/app/output/css-module-local-ident-name.md +1 -1
- package/zh/configure/app/output/data-uri-limit.md +1 -1
- package/zh/configure/app/output/disable-css-extract.md +1 -1
- package/zh/configure/app/output/disable-css-module-extension.md +1 -1
- package/zh/configure/app/output/disable-filename-hash.md +1 -1
- package/zh/configure/app/output/disable-inline-runtime-chunk.md +1 -1
- package/zh/configure/app/output/disable-minimize.md +1 -1
- package/zh/configure/app/output/disable-source-map.md +1 -1
- package/zh/configure/app/output/disable-ts-checker.md +1 -1
- package/zh/configure/app/output/dist-path.md +1 -1
- package/zh/configure/app/output/enable-asset-fallback.md +1 -1
- package/zh/configure/app/output/enable-asset-manifest.md +1 -1
- package/zh/configure/app/output/enable-css-module-tsdeclaration.md +1 -1
- package/zh/configure/app/output/enable-inline-scripts.md +1 -1
- package/zh/configure/app/output/enable-inline-styles.md +1 -1
- package/zh/configure/app/output/enable-latest-decorators.md +1 -1
- package/zh/configure/app/output/externals.md +1 -1
- package/zh/configure/app/output/filename.md +1 -1
- package/zh/configure/app/output/legal-comments.md +1 -1
- package/zh/configure/app/output/override-browserslist.md +1 -1
- package/zh/configure/app/output/polyfill.md +1 -1
- package/zh/configure/app/output/ssg.md +118 -114
- package/zh/configure/app/output/svg-default-export.md +1 -1
- package/zh/configure/app/performance/_category_.json +4 -0
- package/zh/configure/app/performance/build-cache.md +1 -1
- package/zh/configure/app/performance/bundle-analyze.md +1 -1
- package/zh/configure/app/performance/chunk-split.md +1 -1
- package/zh/configure/app/performance/print-file-size.md +1 -1
- package/zh/configure/app/performance/profile.md +1 -1
- package/zh/configure/app/performance/remove-console.md +1 -1
- package/zh/configure/app/performance/remove-moment-locale.md +1 -1
- package/zh/configure/app/plugins.md +1 -1
- package/zh/configure/app/runtime/state.md +13 -0
- package/zh/configure/app/security/_category_.json +4 -0
- package/zh/configure/app/security/sri.md +1 -1
- package/zh/configure/app/server/ssr.md +0 -2
- package/zh/configure/app/source/alias.md +1 -1
- package/zh/configure/app/source/compile-js-data-uri.md +1 -1
- package/zh/configure/app/source/define.md +1 -1
- package/zh/configure/app/source/exclude.md +1 -1
- package/zh/configure/app/source/global-vars.md +1 -1
- package/zh/configure/app/source/include.md +1 -1
- package/zh/configure/app/source/module-scopes.md +1 -1
- package/zh/configure/app/source/pre-entry.md +1 -1
- package/zh/configure/app/source/resolve-extension-prefix.md +1 -1
- package/zh/configure/app/source/resolve-main-fields.md +1 -1
- package/zh/configure/app/tools/autoprefixer.md +1 -1
- package/zh/configure/app/tools/babel.md +1 -1
- package/zh/configure/app/tools/css-extract.md +1 -1
- package/zh/configure/app/tools/css-loader.md +1 -1
- package/zh/configure/app/tools/dev-server.md +1 -1
- package/zh/configure/app/tools/html-plugin.md +1 -1
- package/zh/configure/app/tools/inspector.md +1 -1
- package/zh/configure/app/tools/less.md +1 -1
- package/zh/configure/app/tools/minify-css.md +1 -1
- package/zh/configure/app/tools/postcss.md +1 -1
- package/zh/configure/app/tools/pug.md +1 -1
- package/zh/configure/app/tools/sass.md +1 -1
- package/zh/configure/app/tools/style-loader.md +1 -1
- package/zh/configure/app/tools/styled-components.md +1 -1
- package/zh/configure/app/tools/swc.md +42 -0
- package/zh/configure/app/tools/terser.md +1 -1
- package/zh/configure/app/tools/ts-checker.md +1 -1
- package/zh/configure/app/tools/ts-loader.md +1 -1
- package/zh/configure/app/tools/webpack-chain.md +1 -1
- package/zh/configure/app/tools/webpack.md +1 -1
- package/zh/guides/advanced-features/custom-app.md +8 -2
- package/zh/guides/advanced-features/ssg.md +74 -63
- package/zh/guides/advanced-features/ssr.md +74 -11
- package/zh/guides/basic-features/builder.md +46 -0
- package/zh/guides/basic-features/css/_category_.json +1 -1
- package/zh/guides/basic-features/css/less-sass.md +1 -14
- package/zh/guides/basic-features/data-fetch.md +1 -1
- package/zh/guides/basic-features/env-vars.md +34 -0
- package/zh/guides/basic-features/routes.md +32 -35
- package/zh/guides/concept/entries.md +4 -4
- package/zh/guides/topic-detail/framework-plugin/extend.md +3 -4
- package/zh/{apis/app/runtime/plugin/hook-api.md → guides/topic-detail/framework-plugin/hook-list.md} +42 -135
- package/zh/{apis/app/runtime/plugin → guides/topic-detail/framework-plugin}/hook.md +2 -3
- package/zh/guides/topic-detail/framework-plugin/implement.md +21 -10
- package/zh/guides/topic-detail/framework-plugin/introduction.md +49 -0
- package/{en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin → zh/guides/topic-detail/framework-plugin}/plugin-api.md +3 -4
- package/zh/guides/topic-detail/framework-plugin/relationship.md +2 -3
- package/zh/guides/topic-detail/model/quick-start.md +4 -0
- package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +2 -2
- package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +5 -2
- package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +4 -6
- package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +2 -4
- package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +1 -1
- package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +44 -50
- package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +1 -1
- package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +4 -4
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +8 -21
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +37 -13
- package/zh/tutorials/first-app/c05-component/5.1-use-ui-library.md +3 -13
- package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +1 -21
- package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +9 -9
- package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +9 -14
- package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +7 -7
- package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +1 -1
- package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +2 -2
- package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +8 -17
- package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +23 -18
- package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +30 -30
- package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +4 -9
- package/zh/tutorials/first-app/c08-client-side-routing/8.1-code-based-routing.md +66 -63
- package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +35 -33
- package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +28 -102
- package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +4 -6
- package/zh/tutorials/first-app/c10-model/10.2-add-model.md +3 -3
- package/zh/tutorials/first-app/c10-model/10.3-use-model.md +21 -20
- package/zh/tutorials/first-app/c10-model/10.4-testing.md +2 -2
- package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +34 -68
- package/zh/tutorials/first-app/c11-container/11.2-add-container.md +40 -37
- package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +6 -4
- package/zh/tutorials/first-app/c11-container/11.4-testing.md +2 -2
- package/zh/tutorials/foundations/introduction.md +1 -1
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/default-alias.md +0 -25
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/_category_.json +0 -4
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/abstract.md +0 -26
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/hook-api.md +0 -896
- package/en/docusaurus-plugin-content-docs/current/apis/app/runtime/plugin/hook.md +0 -170
- package/zh/apis/app/runtime/default-alias.md +0 -23
- package/zh/apis/app/runtime/plugin/_category_.json +0 -4
- package/zh/apis/app/runtime/plugin/abstract.md +0 -26
- package/zh/apis/app/runtime/plugin/plugin-api.md +0 -117
- package/zh/guides/basic-features/image.md +0 -43
- package/zh/guides/topic-detail/compile-speed.md +0 -182
- package/zh/guides/topic-detail/framework-plugin/abstract.md +0 -27
- package/zh/guides/troubleshooting/compile.md +0 -379
- package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +0 -310
|
@@ -8,37 +8,42 @@ title: 入口的用途
|
|
|
8
8
|
|
|
9
9
|
```md
|
|
10
10
|
.
|
|
11
|
-
├── .
|
|
12
|
-
├── src/
|
|
13
|
-
│ ├── components/
|
|
14
|
-
│ │ ├── Avatar/
|
|
15
|
-
│ │ │ ├── index.stories.tsx
|
|
16
|
-
│ │ │ └── index.tsx
|
|
17
|
-
│ │ └── Item/
|
|
18
|
-
│ │ ├── index.test.tsx
|
|
19
|
-
│ │ └── index.tsx
|
|
20
|
-
│ ├── styles/
|
|
21
|
-
│ │ └── utils.css
|
|
22
|
-
│ ├── .eslintrc.json
|
|
23
|
-
│ ├── App.css
|
|
24
|
-
│ ├── App.tsx
|
|
25
|
-
│ └── modern-app-env.d.ts
|
|
26
|
-
├── .editorconfig
|
|
11
|
+
├── .eslintrc.js
|
|
27
12
|
├── .gitignore
|
|
13
|
+
├── .husky
|
|
28
14
|
├── .npmrc
|
|
29
15
|
├── .nvmrc
|
|
16
|
+
├── .prettierrc
|
|
17
|
+
├── .vscode
|
|
30
18
|
├── README.md
|
|
19
|
+
├── modern.config.ts
|
|
31
20
|
├── package.json
|
|
32
21
|
├── pnpm-lock.yaml
|
|
22
|
+
├── src
|
|
23
|
+
│ ├── .eslintrc.js
|
|
24
|
+
│ ├── modern-app-env.d.ts
|
|
25
|
+
│ └── routes
|
|
26
|
+
│ ├── components
|
|
27
|
+
│ │ ├── Avatar
|
|
28
|
+
│ │ │ ├── index.stories.tsx
|
|
29
|
+
│ │ │ └── index.tsx
|
|
30
|
+
│ │ └── Item
|
|
31
|
+
│ │ ├── index.test.tsx
|
|
32
|
+
│ │ └── index.tsx
|
|
33
|
+
│ ├── index.css
|
|
34
|
+
│ ├── layout.tsx
|
|
35
|
+
│ ├── page.tsx
|
|
36
|
+
│ └── styles
|
|
37
|
+
│ └── utils.css
|
|
33
38
|
└── tsconfig.json
|
|
34
39
|
```
|
|
35
40
|
|
|
36
41
|
hello-modern 项目是一个应用工程,`src/` 目录里是应用工程源代码的主要部分,我们称之为【 Universal App 代码(大一统应用代码)】—— 既可以在客户端运行又可以在服务器端运行,有多种运行模式和部署模式,既能实现多页(MPA)也能实现单页(SPA)。
|
|
37
42
|
|
|
38
|
-
我们把 `src/
|
|
43
|
+
我们把 `src/routes` 称作【 应用入口(App Entry)】,一个应用工程可以有一到多个应用入口。
|
|
39
44
|
|
|
40
45
|
:::info 注
|
|
41
|
-
应用入口不止 `
|
|
46
|
+
应用入口不止 `src/routes` 一种,之后章节中会再次介绍。
|
|
42
47
|
:::
|
|
43
48
|
|
|
44
49
|
:::info 注
|
|
@@ -23,38 +23,46 @@ Modern.js 支持自动创建新入口,前面的章节中提到过,`pnpm run
|
|
|
23
23
|
|
|
24
24
|
```md
|
|
25
25
|
.
|
|
26
|
-
├── .
|
|
27
|
-
├── src/
|
|
28
|
-
│ ├── hello-modern/
|
|
29
|
-
│ │ ├── components/
|
|
30
|
-
│ │ │ ├── Avatar/
|
|
31
|
-
│ │ │ │ ├── index.stories.tsx
|
|
32
|
-
│ │ │ │ └── index.tsx
|
|
33
|
-
│ │ │ └── Item/
|
|
34
|
-
│ │ │ ├── index.test.tsx
|
|
35
|
-
│ │ │ └── index.tsx
|
|
36
|
-
│ │ ├── styles/
|
|
37
|
-
│ │ │ └── utils.css
|
|
38
|
-
│ │ ├── App.css
|
|
39
|
-
│ │ └── App.tsx
|
|
40
|
-
│ ├── landing-page/
|
|
41
|
-
│ │ ├── App.css
|
|
42
|
-
│ │ └── App.tsx
|
|
43
|
-
│ ├── .eslintrc.json
|
|
44
|
-
│ └── modern-app-env.d.ts
|
|
45
|
-
├── .editorconfig
|
|
26
|
+
├── .eslintrc.js
|
|
46
27
|
├── .gitignore
|
|
28
|
+
├── .husky
|
|
47
29
|
├── .npmrc
|
|
48
30
|
├── .nvmrc
|
|
31
|
+
├── .prettierrc
|
|
32
|
+
├── .vscode
|
|
49
33
|
├── README.md
|
|
34
|
+
├── modern.config.ts
|
|
50
35
|
├── package.json
|
|
51
36
|
├── pnpm-lock.yaml
|
|
37
|
+
├── src
|
|
38
|
+
│ ├── .eslintrc.js
|
|
39
|
+
│ ├── hello-modern
|
|
40
|
+
│ │ ├── index.test.ts
|
|
41
|
+
│ │ └── routes
|
|
42
|
+
│ │ ├── components
|
|
43
|
+
│ │ │ ├── Avatar
|
|
44
|
+
│ │ │ │ ├── index.stories.tsx
|
|
45
|
+
│ │ │ │ └── index.tsx
|
|
46
|
+
│ │ │ └── Item
|
|
47
|
+
│ │ │ ├── index.test.tsx
|
|
48
|
+
│ │ │ └── index.tsx
|
|
49
|
+
│ │ ├── index.css
|
|
50
|
+
│ │ ├── layout.tsx
|
|
51
|
+
│ │ ├── page.tsx
|
|
52
|
+
│ │ └── styles
|
|
53
|
+
│ │ └── utils.css
|
|
54
|
+
│ ├── landing-page
|
|
55
|
+
│ │ └── routes
|
|
56
|
+
│ │ ├── index.css
|
|
57
|
+
│ │ ├── layout.tsx
|
|
58
|
+
│ │ └── page.tsx
|
|
59
|
+
│ └── modern-app-env.d.ts
|
|
52
60
|
└── tsconfig.json
|
|
53
61
|
```
|
|
54
62
|
|
|
55
63
|
可以看到联系人列表应用的文件,都被自动重构到 `src/hello-modern/` 里。
|
|
56
64
|
|
|
57
|
-
同时新建了一个 `src/landing-page/`,里面同样有 `
|
|
65
|
+
同时新建了一个 `src/landing-page/`,里面同样有 `routes/*`(`pnpm run new` 命令只做了这些事,所以你也可以很容易的手动创建新入口或修改入口)
|
|
58
66
|
|
|
59
67
|
执行 `pnpm run dev`,显示:
|
|
60
68
|
|
|
@@ -74,15 +82,7 @@ Modern.js 框架的设计原则之一是【[约定优于配置(Convention over
|
|
|
74
82
|
|
|
75
83
|
其他入口的 URL,是在根路径后追加入口名,比如 `http://localhost:8080/landing-page`。
|
|
76
84
|
|
|
77
|
-
|
|
78
|
-
`src/` 下如果有 `App.[jt]sx`,就认为这个应用工程是单入口的,`src/` 下的其他文件和目录,都会被视为入口内部的文件。
|
|
79
|
-
|
|
80
|
-
`src/` 下如果没有 `App.[jt]sx`,那么 `src/` **下一级**目录里,如果有 `App.[jt]sx`,这个目录就会被视为一个应用入口。
|
|
81
|
-
|
|
82
|
-
`App.jsx` 被看作约定中**标识**,也有其他形式的**标识**,之后的章节中会继续介绍。
|
|
83
|
-
:::
|
|
84
|
-
|
|
85
|
-
接下来,我们把 `src/hello-modern/App.tsx` 重命名为 `src/contacts/App.tsx`:
|
|
85
|
+
接下来,我们把 `src/hello-modern/` 重命名为 `src/contacts/`:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
88
|
mv src/hello-modern src/contacts
|
|
@@ -8,9 +8,8 @@ title: 管理应用入口
|
|
|
8
8
|
|
|
9
9
|
我们可以在 `package.json` 中的 `modernConfig`,或是在符合[业界主流惯例](https://github.com/davidtheclark/cosmiconfig)的 Modern.js 配置文件里,自己写代码来控制项目的配置。
|
|
10
10
|
|
|
11
|
-
之前的章节中,我们都是直接修改 `package.json` 中的 `modernConfig` 字段来实现修改配置。
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
现在,让我们在项目目录 `modern.config.ts` 里面添加内容:
|
|
14
13
|
|
|
15
14
|
```typescript title="modern.config.ts"
|
|
16
15
|
export default defineConfig({
|
|
@@ -29,19 +28,15 @@ export default defineConfig({
|
|
|
29
28
|
|
|
30
29
|
如果注释掉 `ssrByEntries` 和它的值,landing-page 的 SSR 功能就恢复开启了。
|
|
31
30
|
|
|
32
|
-
:::info 注
|
|
33
|
-
当相同配置字段出现于两个文件中时, `package.json` 中 `modernConfig` 字段里的配置会优先于 `modern.config.js` 中的配置。
|
|
34
|
-
:::
|
|
35
|
-
|
|
36
31
|
当需要配置包含复杂逻辑的选项时,比如,开发者想在项目中使用 `*.myext` 文件,这是一种非主流的文件类型,Modern.js 没有默认集成对它的支持。
|
|
37
32
|
|
|
38
|
-
所以,开发者可以在 `modern.config.
|
|
33
|
+
所以,开发者可以在 `modern.config.ts` 里增加对它的支持(通过webpack配置),如下所示:
|
|
39
34
|
|
|
40
35
|
:::info 注
|
|
41
36
|
更多 webpack 配置相关可以查看 [Webpack 配置文档](/docs/configure/app/tools/webpack)。
|
|
42
37
|
:::
|
|
43
38
|
|
|
44
|
-
```
|
|
39
|
+
```ts
|
|
45
40
|
// 注:以下为伪代码,loader等名字皆为虚构,仅做演示使用
|
|
46
41
|
export default defineConfig({
|
|
47
42
|
tools: {
|
|
@@ -59,7 +54,7 @@ export default defineConfig({
|
|
|
59
54
|
|
|
60
55
|
这个需求要修改 webpack 配置,用 Modern.js 配置的`tools.webpack`选项来实现显然是更方便的。
|
|
61
56
|
|
|
62
|
-
还有一些时候,需要一些更复杂的逻辑来做设置,比如需要 JS 变量、表达式、导入模块等,这种时候也适合用 `modern.config.
|
|
57
|
+
还有一些时候,需要一些更复杂的逻辑来做设置,比如需要 JS 变量、表达式、导入模块等,这种时候也适合用 `modern.config.ts` 来手动配置,比如:
|
|
63
58
|
|
|
64
59
|
```js
|
|
65
60
|
export default defineConfig({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
2
|
+
title: 使用约定式路由
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
上一章节中,我们学习了如何创建应用入口。
|
|
@@ -21,55 +21,53 @@ export default defineConfig({
|
|
|
21
21
|
|
|
22
22
|
之前我们已经为联系人列表增加了 Archive 按钮,接下来我们添加一个客户端路由 `/archives`,访问这个路由时,只显示已存档的联系人,而原有的 `/` 继续显示所有联系人。
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
新建 `src/contacts/routes/archives/page.tsx`, 添加如下代码:
|
|
25
25
|
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
```ts
|
|
27
|
+
import { List } from 'antd';
|
|
28
|
+
import { Helmet } from '@modern-js/runtime/head';
|
|
29
|
+
import Item from '../components/Item';
|
|
30
|
+
|
|
31
|
+
const getAvatar = (users: Array<{ name: string; email: string }>) =>
|
|
32
|
+
users.map(user => ({
|
|
33
|
+
...user,
|
|
34
|
+
avatar: `https://avatars.dicebear.com/v2/identicon/${user.name}.svg`,
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
const getMockArchivedData = () =>
|
|
38
|
+
getAvatar([
|
|
39
|
+
{ name: 'Thomas', email: 'w.kccip@bllmfbgv.dm' },
|
|
40
|
+
{ name: 'Chow', email: 'f.lfqljnlk@ywoefljhc.af' },
|
|
41
|
+
]);
|
|
42
|
+
function Index() {
|
|
43
|
+
return (
|
|
44
|
+
<div className="container lg mx-auto">
|
|
45
|
+
<Helmet>
|
|
46
|
+
<title>Archives</title>
|
|
47
|
+
</Helmet>
|
|
48
|
+
<List
|
|
49
|
+
dataSource={getMockArchivedData()}
|
|
50
|
+
renderItem={info => <Item key={info.name} info={info} />}
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default Index;
|
|
38
57
|
```
|
|
39
58
|
|
|
40
|
-
|
|
59
|
+
这里使用了 [React Helmet](https://github.com/nfl/react-helmet) 的 `Helmet` 组件,在 `src/contacts/routes/page.tsx` 中也添加 Helmet 组件:
|
|
41
60
|
|
|
42
|
-
```
|
|
43
|
-
import { Route, Switch } from '@modern-js/runtime/router';
|
|
61
|
+
```tsx
|
|
44
62
|
import { Helmet } from '@modern-js/runtime/head';
|
|
45
|
-
```
|
|
46
63
|
|
|
47
|
-
在 `App` 组件中使用 `Route` 写两个路由,分别用不同的 mock 数据渲染列表:
|
|
48
|
-
|
|
49
|
-
```js
|
|
50
64
|
function App() {
|
|
51
65
|
return (
|
|
52
66
|
<div className="container lg mx-auto">
|
|
53
|
-
<
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
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>
|
|
67
|
+
<Helmet>
|
|
68
|
+
<title>All</title>
|
|
69
|
+
</Helmet>
|
|
70
|
+
...
|
|
73
71
|
</div>
|
|
74
72
|
);
|
|
75
73
|
}
|
|
@@ -77,12 +75,8 @@ function App() {
|
|
|
77
75
|
|
|
78
76
|
:::info 注
|
|
79
77
|
Modern.js 默认集成了 react-helmet,无需安装依赖,可以直接使用,也可以结合 SSR 使用,满足 SEO 需求。
|
|
80
|
-
|
|
81
|
-
Modern.js 也默认集成了 react-router,无需安装依赖和自己配置 `BrowserRouter` 等样板代码,可以直接用 Route、Switch 等组件实现路由逻辑。
|
|
82
78
|
:::
|
|
83
79
|
|
|
84
|
-
React Router v4+ 有两种用法,一种是 `component-based` 的,一种是基于全局配置的。这两种都由开发者自己用代码来控制客户端路由逻辑,所以我们把这种模式称作【**自控式路由**】。
|
|
85
|
-
|
|
86
80
|
执行 `pnpm run dev`,访问 `http://localhost:8080/contacts`,可以看到完整的联系人,页面的标题是 All:
|
|
87
81
|
|
|
88
82
|

|
|
@@ -95,7 +89,7 @@ React Router v4+ 有两种用法,一种是 `component-based` 的,一种是
|
|
|
95
89
|
|
|
96
90
|
**接下来我们增加一个简单的导航栏,让用户能在两个列表之间切换**。
|
|
97
91
|
|
|
98
|
-
打开 src/contacts/
|
|
92
|
+
打开 `src/contacts/layout.tsx`,在顶部导入 Radio 组件:
|
|
99
93
|
|
|
100
94
|
```tsx
|
|
101
95
|
import { List, Radio } from 'antd';
|
|
@@ -103,39 +97,48 @@ import { List, Radio } from 'antd';
|
|
|
103
97
|
|
|
104
98
|
然后将 UI 最顶部进行修改,增加一组单选框
|
|
105
99
|
|
|
106
|
-
```tsx {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<div
|
|
110
|
-
<
|
|
111
|
-
<Radio value=
|
|
112
|
-
|
|
113
|
-
|
|
100
|
+
```tsx {5-8}
|
|
101
|
+
export default function Layout() {
|
|
102
|
+
return (
|
|
103
|
+
<div>
|
|
104
|
+
<div className="h-16 p-2 flex items-center justify-center">
|
|
105
|
+
<Radio.Group onChange={handleSetList} value={currentList}>
|
|
106
|
+
<Radio value="/">All</Radio>
|
|
107
|
+
<Radio value="/archives">Archives</Radio>
|
|
108
|
+
</Radio.Group>
|
|
109
|
+
</div>
|
|
110
|
+
<Outlet />
|
|
114
111
|
</div>
|
|
115
|
-
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
116
115
|
```
|
|
117
116
|
|
|
118
117
|
然后我们来实现 `currentList` 和 `handleSetList`。
|
|
119
118
|
|
|
120
|
-
|
|
119
|
+
引入三个 React Hook:`useState` 和 `useNavigate` 和 `useParams`,以及 Ant Design 的事件类型定义:
|
|
121
120
|
|
|
122
121
|
```js
|
|
123
122
|
import { useState } from 'react';
|
|
124
|
-
import {
|
|
125
|
-
import {
|
|
123
|
+
import { Radio, RadioChangeEvent } from 'antd';
|
|
124
|
+
import { Outlet, useNavigate, useParams } from '@modern-js/runtime/router';
|
|
126
125
|
```
|
|
127
126
|
|
|
128
|
-
最后在
|
|
127
|
+
最后在 Layout 组件里增加局部状态和相关逻辑:
|
|
129
128
|
|
|
130
129
|
```js {2-8}
|
|
131
|
-
function
|
|
132
|
-
const
|
|
133
|
-
const
|
|
130
|
+
export default function Layout() {
|
|
131
|
+
const navigate = useNavigate();
|
|
132
|
+
const params = useParams();
|
|
133
|
+
const [currentList, setList] = useState(params.pathname || '/');
|
|
134
134
|
const handleSetList = (e: RadioChangeEvent) => {
|
|
135
135
|
const { value } = e.target;
|
|
136
136
|
setList(value);
|
|
137
|
-
|
|
137
|
+
navigate(value);
|
|
138
138
|
};
|
|
139
|
+
return (
|
|
140
|
+
...
|
|
141
|
+
}
|
|
139
142
|
```
|
|
140
143
|
|
|
141
144
|
到这里就已经完成了页面导航栏实现,执行 `pnpm run dev` 查看效果:
|
|
@@ -18,8 +18,6 @@ title: 启用 BFF
|
|
|
18
18
|
# 请选择运行时框
|
|
19
19
|
❯ Express
|
|
20
20
|
Koa
|
|
21
|
-
Egg
|
|
22
|
-
Nest
|
|
23
21
|
```
|
|
24
22
|
|
|
25
23
|
:::info 注
|
|
@@ -30,43 +28,47 @@ title: 启用 BFF
|
|
|
30
28
|
|
|
31
29
|
```md
|
|
32
30
|
.
|
|
33
|
-
├── .
|
|
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
|
|
31
|
+
├── .eslintrc.js
|
|
64
32
|
├── .gitignore
|
|
33
|
+
├── .husky
|
|
65
34
|
├── .npmrc
|
|
66
35
|
├── .nvmrc
|
|
36
|
+
├── .prettierrc
|
|
37
|
+
├── .vscode
|
|
67
38
|
├── README.md
|
|
39
|
+
├── api
|
|
40
|
+
│ ├── _app.ts
|
|
41
|
+
│ ├── index.ts
|
|
42
|
+
│ └── info
|
|
43
|
+
│ └── [type].ts
|
|
44
|
+
├── modern.config.ts
|
|
68
45
|
├── package.json
|
|
69
46
|
├── pnpm-lock.yaml
|
|
47
|
+
├── src
|
|
48
|
+
│ ├── .eslintrc.js
|
|
49
|
+
│ ├── contacts
|
|
50
|
+
│ │ ├── index.test.ts
|
|
51
|
+
│ │ └── routes
|
|
52
|
+
│ │ ├── archives
|
|
53
|
+
│ │ │ └── page.tsx
|
|
54
|
+
│ │ ├── components
|
|
55
|
+
│ │ │ ├── Avatar
|
|
56
|
+
│ │ │ │ ├── index.stories.tsx
|
|
57
|
+
│ │ │ │ └── index.tsx
|
|
58
|
+
│ │ │ └── Item
|
|
59
|
+
│ │ │ ├── index.test.tsx
|
|
60
|
+
│ │ │ └── index.tsx
|
|
61
|
+
│ │ ├── index.css
|
|
62
|
+
│ │ ├── layout.tsx
|
|
63
|
+
│ │ ├── page.tsx
|
|
64
|
+
│ │ └── styles
|
|
65
|
+
│ │ └── utils.css
|
|
66
|
+
│ ├── landing-page
|
|
67
|
+
│ │ └── routes
|
|
68
|
+
│ │ ├── index.css
|
|
69
|
+
│ │ ├── layout.tsx
|
|
70
|
+
│ │ └── page.tsx
|
|
71
|
+
│ └── modern-app-env.d.ts
|
|
70
72
|
└── tsconfig.json
|
|
71
73
|
```
|
|
72
74
|
|
|
@@ -35,7 +35,7 @@ mv api/index.ts api/contacts.ts
|
|
|
35
35
|
我们使用 [faker](https://github.com/Marak/Faker.js) 来 mock 需要的数据,首先安装依赖:
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
pnpm add faker
|
|
38
|
+
pnpm add faker@5.5.3
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
将 `api/contacts.ts` 内容改为:
|
|
@@ -65,69 +65,22 @@ export const get = async () => {
|
|
|
65
65
|
|
|
66
66
|

|
|
67
67
|
|
|
68
|
-
接下来我们把 `src/contacts/
|
|
68
|
+
接下来我们把 `src/routes/contacts/page.tsx` 里硬编码的 `getMockData` 改成从 BFF 加载:
|
|
69
69
|
|
|
70
|
-
|
|
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
|
|
70
|
+
```tsx
|
|
71
|
+
import { Helmet } from '@modern-js/runtime/head';
|
|
98
72
|
import { List } from 'antd';
|
|
99
|
-
import
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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` 的内容:
|
|
73
|
+
import 'ladda/dist/ladda.min.css';
|
|
74
|
+
import 'tailwindcss/base.css';
|
|
75
|
+
import 'tailwindcss/components.css';
|
|
76
|
+
import 'tailwindcss/utilities.css';
|
|
77
|
+
import './styles/utils.css';
|
|
123
78
|
|
|
124
|
-
```tsx
|
|
125
79
|
import { useState, useEffect } from 'react';
|
|
126
|
-
import { List } from 'antd';
|
|
127
80
|
import { get as contacts } from '@api/contacts';
|
|
128
|
-
import Item from '
|
|
81
|
+
import Item from './components/Item';
|
|
129
82
|
|
|
130
|
-
|
|
83
|
+
function Index() {
|
|
131
84
|
const [list, setList] = useState(
|
|
132
85
|
[] as Array<{ name: string; email: string; avatar: string }>,
|
|
133
86
|
);
|
|
@@ -141,20 +94,25 @@ const AllContacts = () => {
|
|
|
141
94
|
}
|
|
142
95
|
});
|
|
143
96
|
return (
|
|
144
|
-
|
|
145
|
-
<
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
97
|
+
<div className="container lg mx-auto">
|
|
98
|
+
<Helmet>
|
|
99
|
+
<title>All</title>
|
|
100
|
+
</Helmet>
|
|
101
|
+
{(list.length && (
|
|
102
|
+
<List
|
|
103
|
+
dataSource={list}
|
|
104
|
+
renderItem={info => <Item key={info.name} info={info} />}
|
|
105
|
+
/>
|
|
106
|
+
)) || (
|
|
107
|
+
<div className="p-4 items-center border-gray-200 border-b border-t custom-text-gray">
|
|
108
|
+
Pending...
|
|
109
|
+
</div>
|
|
110
|
+
)}
|
|
111
|
+
</div>
|
|
154
112
|
);
|
|
155
|
-
}
|
|
113
|
+
}
|
|
156
114
|
|
|
157
|
-
export default
|
|
115
|
+
export default Index;
|
|
158
116
|
```
|
|
159
117
|
|
|
160
118
|
在 Modern.js 中,可以通过调用函数(前后端一体化)的方式,直接调用 BFF 接口,调用时无需关心域名、路径等。
|
|
@@ -163,38 +121,6 @@ export default AllContacts;
|
|
|
163
121
|
在使用 `pnpm run new` 创建 BFF 时,Modern.js 已经默认在 `tsconig.json` 中注入了别名。这也是之前提到的,生成器在项目创建之后并不会被抛弃,仍旧可以在开发过程中不断为项目提供新的内容。
|
|
164
122
|
:::
|
|
165
123
|
|
|
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
124
|
执行 `pnpm run dev`,再打开页面`http://localhost:8000/contacts`,可以看到页面加载后,会先初始化联系人数据(显示 pending),之后每次切换到 All 列表,也会重新请求联系人数据:
|
|
199
125
|
|
|
200
126
|

|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
title: 应用架构
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
上一章节中,我们把硬编码的 `mockData` 改成从 BFF
|
|
5
|
+
上一章节中,我们把硬编码的 `mockData` 改成从 BFF 加载,在 `pages.tsx` 组件里用 BFF 函数,获取到联系人数据之后,保存在 `Index` 的组件内部状态里,而 `archives/index` 组件暂时继续使用 mock 数据。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
本章节中,为了进一步实现项目功能,我们需要让两个组件都从 BFF 获取数据,还要实现【 Archive 】按钮,点击按钮能把联系人归档。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
业务逻辑变复杂之后,相关代码不可避免会变多,如果都写在组件里,都会让这个组件的可读性和可维护性变差,让做不同事情的代码混在一起。
|
|
10
10
|
|
|
11
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
12
|
|
|
@@ -16,8 +16,6 @@ title: 应用架构
|
|
|
16
16
|
|
|
17
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
18
|
|
|
19
|
-
之前介绍的 `App.tsx` 和 `pages/` 都是其中一种代码模块,通过在最顶层对客户端路由的管理,把其他代码模块最终组织到一起,形成应用。
|
|
20
|
-
|
|
21
19
|
当前项目里 `components/` 目录中的 React 组件,是一种可以称作【 视图组件 】的代码模块,负责 UI、交互上的界面展现。
|
|
22
20
|
|
|
23
|
-
本章节我们来把 `
|
|
21
|
+
本章节我们来把 `page.tsx` 中的 Index 组件中可以跟 UI 解耦的业务逻辑,移到一种叫【 Model(业务模型)】的代码模块里。
|
|
@@ -121,11 +121,11 @@ const actions = {
|
|
|
121
121
|
为了做到高内聚低耦合,一个 Model 的 state、action、side effect 不应该分散在不同文件里。接下来我们把上面的代码连起来,放在同一个 Model 文件里,执行以下命令:
|
|
122
122
|
|
|
123
123
|
```bash
|
|
124
|
-
mkdir -p src/contacts/models/
|
|
125
|
-
touch src/contacts/models/contacts.ts
|
|
124
|
+
mkdir -p src/contacts/routes/models/
|
|
125
|
+
touch src/contacts/routes/models/contacts.ts
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
-
`src/contacts/models/contacts.ts` 的内容:
|
|
128
|
+
`src/contacts/routes/models/contacts.ts` 的内容:
|
|
129
129
|
|
|
130
130
|
```tsx
|
|
131
131
|
import { model } from '@modern-js/runtime/model';
|