@modern-js/main-doc 2.69.5 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/en/{_meta.json → _nav.json} +5 -1
- package/docs/en/apis/app/commands.mdx +2 -3
- package/docs/en/apis/app/hooks/src/entry.mdx +1 -5
- package/docs/en/apis/app/hooks/src/entry.server.mdx +4 -5
- package/docs/en/apis/app/hooks/src/routes.mdx +2 -2
- package/docs/en/apis/app/runtime/_meta.json +0 -18
- package/docs/en/apis/app/runtime/bff/use-hono-context.mdx +2 -2
- package/docs/en/apis/app/runtime/router/router.mdx +1 -1
- package/docs/en/apis/app/runtime/utility/css-in-js.mdx +3 -2
- package/docs/en/community/blog/v2-release-note.mdx +0 -2
- package/docs/en/community/contributing-guide.mdx +10 -12
- package/docs/en/components/bff-upload.mdx +16 -12
- package/docs/en/components/build-output.mdx +45 -0
- package/docs/en/components/debug-app.mdx +1 -1
- package/docs/en/components/enable-bff-caution.mdx +2 -2
- package/docs/en/components/enable-bff.mdx +38 -8
- package/docs/en/components/enable-ssg.mdx +48 -0
- package/docs/en/components/entry-scan-logic.mdx +7 -0
- package/docs/en/components/init-app.mdx +40 -17
- package/docs/en/components/international/install-command.mdx +9 -0
- package/docs/en/components/international/introduce.mdx +2 -0
- package/docs/en/components/module-federation.mdx +4 -4
- package/docs/en/components/new-entry-tooltip.mdx +0 -0
- package/docs/en/components/nodeVersion.mdx +2 -6
- package/docs/en/components/prerequisites.mdx +1 -1
- package/docs/en/components/ua-polyfill.mdx +16 -12
- package/docs/en/components/upgrade-browserslist.mdx +0 -0
- package/docs/en/configure/_meta.json +7 -8
- package/docs/en/configure/app/bff/cross-project.mdx +24 -0
- package/docs/en/configure/app/dev/lazy-compilation.mdx +45 -0
- package/docs/en/configure/app/dev/server.mdx +103 -0
- package/docs/en/configure/app/dev/setup-middlewares.mdx +4 -22
- package/docs/en/configure/app/html/app-icon.mdx +1 -23
- package/docs/en/configure/app/output/inline-scripts.mdx +1 -1
- package/docs/en/configure/app/output/override-browserslist.mdx +6 -4
- package/docs/en/configure/app/output/source-map.mdx +6 -3
- package/docs/en/configure/app/output/ssg.mdx +12 -43
- package/docs/en/configure/app/output/ssgByEntries.mdx +93 -0
- package/docs/en/configure/app/performance/build-cache.mdx +0 -4
- package/docs/en/configure/app/resolve/alias-strategy.mdx +14 -0
- package/docs/en/configure/app/resolve/alias.mdx +13 -0
- package/docs/en/configure/app/resolve/condition-names.mdx +18 -0
- package/docs/en/configure/app/resolve/dedupe.mdx +13 -0
- package/docs/en/configure/app/resolve/extensions.mdx +18 -0
- package/docs/en/configure/app/runtime/0-intro.mdx +2 -51
- package/docs/en/configure/app/security/check-syntax.mdx +1 -1
- package/docs/en/configure/app/server/port.mdx +1 -21
- package/docs/en/configure/app/server/rsc.mdx +30 -0
- package/docs/en/configure/app/server/ssr.mdx +20 -9
- package/docs/en/configure/app/source/decorators.mdx +4 -2
- package/docs/en/configure/app/source/entries.mdx +0 -2
- package/docs/en/configure/app/source/main-entry-name.mdx +4 -4
- package/docs/en/configure/app/source/transform-import.mdx +1 -59
- package/docs/en/configure/app/tools/bundler-chain.mdx +5 -5
- package/docs/en/configure/app/tools/css-extract.mdx +1 -1
- package/docs/en/configure/app/tools/dev-server.mdx +14 -248
- package/docs/en/configure/app/tools/html-plugin.mdx +3 -3
- package/docs/en/configure/app/tools/lightningcss-loader.mdx +0 -1
- package/docs/en/configure/app/tools/swc.mdx +1 -43
- package/docs/en/configure/app/usage.mdx +7 -17
- package/docs/en/guides/_meta.json +1 -2
- package/docs/en/guides/advanced-features/_meta.json +6 -0
- package/docs/en/guides/advanced-features/bff/cross-project.mdx +1 -7
- package/docs/en/guides/advanced-features/bff/extend-server.mdx +18 -3
- package/docs/en/guides/advanced-features/bff/frameworks.mdx +1 -1
- package/docs/en/guides/advanced-features/bff/function.mdx +2 -6
- package/docs/en/guides/advanced-features/bff/sdk.mdx +3 -3
- package/docs/en/guides/advanced-features/build-performance.mdx +23 -26
- package/docs/en/guides/advanced-features/compatibility.mdx +53 -9
- package/docs/en/guides/advanced-features/international/_meta.json +11 -0
- package/docs/en/guides/advanced-features/international/advanced.mdx +193 -0
- package/docs/en/guides/advanced-features/international/api.mdx +400 -0
- package/docs/en/guides/advanced-features/international/basic.mdx +417 -0
- package/docs/en/guides/advanced-features/international/best-practices.mdx +135 -0
- package/docs/en/guides/advanced-features/international/configuration.mdx +437 -0
- package/docs/en/guides/advanced-features/international/locale-detection.mdx +276 -0
- package/docs/en/guides/advanced-features/international/quick-start.mdx +154 -0
- package/docs/en/guides/advanced-features/international/resource-loading.mdx +417 -0
- package/docs/en/guides/advanced-features/international/routing.mdx +212 -0
- package/docs/en/guides/advanced-features/international.mdx +37 -0
- package/docs/en/guides/advanced-features/low-level.mdx +21 -16
- package/docs/en/guides/advanced-features/page-performance/code-split.mdx +4 -4
- package/docs/en/guides/advanced-features/page-performance/inline-assets.mdx +4 -4
- package/docs/en/guides/advanced-features/page-performance/optimize-bundle.mdx +7 -21
- package/docs/en/guides/advanced-features/page-performance/react-compiler.mdx +1 -8
- package/docs/en/guides/advanced-features/rspack-start.mdx +2 -22
- package/docs/en/guides/advanced-features/server-monitor/logger.mdx +0 -4
- package/docs/en/guides/advanced-features/server-monitor/monitors.mdx +62 -34
- package/docs/en/guides/advanced-features/web-server.mdx +82 -299
- package/docs/en/guides/basic-features/_meta.json +6 -1
- package/docs/en/guides/basic-features/css/css-in-js.mdx +46 -11
- package/docs/en/guides/basic-features/css/css-modules.mdx +5 -17
- package/docs/en/guides/basic-features/css/css.mdx +3 -3
- package/docs/en/guides/basic-features/css/tailwindcss.mdx +5 -89
- package/docs/en/guides/basic-features/data/data-cache.mdx +5 -1
- package/docs/en/guides/basic-features/data/data-fetch.mdx +4 -4
- package/docs/en/guides/basic-features/data/data-write.mdx +2 -2
- package/docs/en/guides/basic-features/debug/mock.mdx +4 -1
- package/docs/en/guides/basic-features/debug/proxy.mdx +0 -8
- package/docs/en/guides/basic-features/debug/rsdoctor.mdx +5 -5
- package/docs/en/guides/basic-features/deploy.mdx +25 -18
- package/docs/en/guides/basic-features/env-vars.mdx +1 -1
- package/docs/en/guides/basic-features/html.mdx +1 -1
- package/docs/en/guides/basic-features/output-files.mdx +3 -3
- package/docs/en/guides/basic-features/render/_meta.json +1 -1
- package/docs/en/guides/basic-features/render/before-render.mdx +16 -23
- package/docs/en/guides/basic-features/render/overview.mdx +51 -0
- package/docs/en/guides/basic-features/render/rsc.mdx +394 -0
- package/docs/en/guides/basic-features/render/ssg.mdx +26 -62
- package/docs/en/guides/basic-features/render/ssr-cache.mdx +6 -6
- package/docs/en/guides/basic-features/render/ssr.mdx +31 -31
- package/docs/en/guides/basic-features/render/streaming-ssr.mdx +29 -9
- package/docs/en/guides/basic-features/routes/_meta.json +1 -0
- package/docs/en/guides/basic-features/routes/config-routes.mdx +427 -0
- package/docs/en/guides/basic-features/{routes.mdx → routes/routes.mdx} +7 -110
- package/docs/en/guides/basic-features/static-assets/json-files.mdx +21 -3
- package/docs/en/guides/basic-features/static-assets.mdx +2 -2
- package/docs/en/guides/concept/builder.mdx +24 -9
- package/docs/en/guides/concept/entries.mdx +139 -147
- package/docs/en/guides/get-started/glossary.mdx +0 -18
- package/docs/en/guides/get-started/introduction.mdx +1 -4
- package/docs/en/guides/get-started/quick-start.mdx +8 -73
- package/docs/en/guides/get-started/tech-stack.mdx +7 -25
- package/docs/en/guides/get-started/upgrade.mdx +30 -23
- package/docs/en/guides/topic-detail/_meta.json +0 -12
- package/docs/en/guides/topic-detail/module-federation/_meta.json +1 -1
- package/docs/en/guides/topic-detail/module-federation/application.mdx +16 -15
- package/docs/en/guides/topic-detail/module-federation/i18n.mdx +670 -0
- package/docs/en/guides/topic-detail/module-federation/introduce.mdx +5 -4
- package/docs/en/guides/topic-detail/module-federation/ssr.mdx +50 -2
- package/docs/en/guides/topic-detail/module-federation/usage.mdx +10 -30
- package/docs/en/guides/troubleshooting/builder.mdx +3 -82
- package/docs/en/guides/troubleshooting/cli.mdx +6 -30
- package/docs/en/guides/troubleshooting/dependencies.mdx +22 -22
- package/docs/en/plugin/cli-plugins/api.mdx +4 -5
- package/docs/en/plugin/cli-plugins/migration.mdx +33 -48
- package/docs/en/plugin/introduction.mdx +39 -27
- package/docs/en/plugin/official/_meta.json +0 -5
- package/docs/en/plugin/official/cli-plugins/_meta.json +1 -1
- package/docs/en/plugin/official/cli-plugins/plugin-styled-components.mdx +5 -0
- package/docs/en/plugin/official/cli-plugins.mdx +0 -2
- package/docs/en/plugin/plugin-system.mdx +68 -61
- package/docs/en/plugin/runtime-plugins/api.mdx +62 -59
- package/docs/en/plugin/runtime-plugins/migration.mdx +29 -20
- package/docs/en/tutorials/_meta.json +0 -10
- package/docs/en/tutorials/examples/csr-auth.mdx +1 -1
- package/docs/en/tutorials/foundations/introduction.mdx +9 -25
- package/docs/zh/{_meta.json → _nav.json} +10 -6
- package/docs/zh/apis/app/commands.mdx +2 -3
- package/docs/zh/apis/app/hooks/src/entry.mdx +1 -5
- package/docs/zh/apis/app/hooks/src/entry.server.mdx +4 -5
- package/docs/zh/apis/app/hooks/src/routes.mdx +2 -2
- package/docs/zh/apis/app/runtime/_meta.json +0 -18
- package/docs/zh/apis/app/runtime/bff/use-hono-context.mdx +2 -2
- package/docs/zh/apis/app/runtime/utility/css-in-js.mdx +3 -2
- package/docs/zh/community/blog/v2-release-note.mdx +0 -2
- package/docs/zh/community/contributing-guide.mdx +10 -12
- package/docs/zh/components/auto-upgrade.mdx +0 -0
- package/docs/zh/components/bff-upload.mdx +8 -5
- package/docs/zh/components/build-output.mdx +45 -0
- package/docs/zh/components/debug-app.mdx +1 -1
- package/docs/zh/components/enable-bff-caution.mdx +1 -1
- package/docs/zh/components/enable-bff.mdx +37 -8
- package/docs/zh/components/enable-ssg.mdx +47 -0
- package/docs/zh/components/entry-scan-logic.mdx +7 -0
- package/docs/zh/components/init-app.mdx +40 -18
- package/docs/zh/components/international/install-command.mdx +8 -0
- package/docs/zh/components/international/introduce.mdx +2 -0
- package/docs/zh/components/international/platform-support.mdx +0 -0
- package/docs/zh/components/module-federation.mdx +4 -4
- package/docs/zh/components/new-entry-tooltip.mdx +0 -0
- package/docs/zh/components/nodeVersion.mdx +3 -7
- package/docs/zh/components/prerequisites.mdx +1 -1
- package/docs/zh/components/self-route-example.mdx +3 -3
- package/docs/zh/components/ua-polyfill.mdx +11 -6
- package/docs/zh/components/upgrade-browserslist.mdx +0 -0
- package/docs/zh/configure/_meta.json +7 -8
- package/docs/zh/configure/app/bff/cross-project.mdx +24 -0
- package/docs/zh/configure/app/dev/lazy-compilation.mdx +44 -0
- package/docs/zh/configure/app/dev/server.mdx +104 -0
- package/docs/zh/configure/app/dev/setup-middlewares.mdx +4 -23
- package/docs/zh/configure/app/html/app-icon.mdx +1 -23
- package/docs/zh/configure/app/output/inline-scripts.mdx +1 -1
- package/docs/zh/configure/app/output/override-browserslist.mdx +3 -3
- package/docs/zh/configure/app/output/source-map.mdx +10 -3
- package/docs/zh/configure/app/output/ssg.mdx +13 -45
- package/docs/zh/configure/app/output/ssgByEntries.mdx +94 -0
- package/docs/zh/configure/app/performance/build-cache.mdx +0 -4
- package/docs/zh/configure/app/resolve/alias-strategy.mdx +14 -0
- package/docs/zh/configure/app/resolve/alias.mdx +13 -0
- package/docs/zh/configure/app/resolve/condition-names.mdx +18 -0
- package/docs/zh/configure/app/resolve/dedupe.mdx +14 -0
- package/docs/zh/configure/app/resolve/extensions.mdx +18 -0
- package/docs/zh/configure/app/runtime/0-intro.mdx +2 -53
- package/docs/zh/configure/app/security/check-syntax.mdx +1 -1
- package/docs/zh/configure/app/server/port.mdx +2 -21
- package/docs/zh/configure/app/server/rsc.mdx +30 -0
- package/docs/zh/configure/app/server/ssr.mdx +21 -11
- package/docs/zh/configure/app/source/decorators.mdx +4 -4
- package/docs/zh/configure/app/source/entries.mdx +0 -2
- package/docs/zh/configure/app/source/main-entry-name.mdx +4 -4
- package/docs/zh/configure/app/source/transform-import.mdx +1 -59
- package/docs/zh/configure/app/tools/bundler-chain.mdx +6 -6
- package/docs/zh/configure/app/tools/css-extract.mdx +1 -1
- package/docs/zh/configure/app/tools/dev-server.mdx +14 -248
- package/docs/zh/configure/app/tools/html-plugin.mdx +3 -2
- package/docs/zh/configure/app/tools/lightningcss-loader.mdx +0 -1
- package/docs/zh/configure/app/tools/swc.mdx +1 -43
- package/docs/zh/configure/app/usage.mdx +8 -18
- package/docs/zh/guides/_meta.json +5 -1
- package/docs/zh/guides/advanced-features/_meta.json +6 -1
- package/docs/zh/guides/advanced-features/bff/cross-project.mdx +8 -16
- package/docs/zh/guides/advanced-features/bff/extend-server.mdx +25 -8
- package/docs/zh/guides/advanced-features/bff/frameworks.mdx +1 -1
- package/docs/zh/guides/advanced-features/bff/function.mdx +7 -12
- package/docs/zh/guides/advanced-features/bff/sdk.mdx +4 -4
- package/docs/zh/guides/advanced-features/build-performance.mdx +23 -30
- package/docs/zh/guides/advanced-features/compatibility.mdx +44 -0
- package/docs/zh/guides/advanced-features/international/_meta.json +11 -0
- package/docs/zh/guides/advanced-features/international/advanced.mdx +193 -0
- package/docs/zh/guides/advanced-features/international/api.mdx +400 -0
- package/docs/zh/guides/advanced-features/international/basic.mdx +416 -0
- package/docs/zh/guides/advanced-features/international/best-practices.mdx +135 -0
- package/docs/zh/guides/advanced-features/international/configuration.mdx +441 -0
- package/docs/zh/guides/advanced-features/international/locale-detection.mdx +304 -0
- package/docs/zh/guides/advanced-features/international/quick-start.mdx +149 -0
- package/docs/zh/guides/advanced-features/international/resource-loading.mdx +417 -0
- package/docs/zh/guides/advanced-features/international/routing.mdx +212 -0
- package/docs/zh/guides/advanced-features/international.mdx +36 -0
- package/docs/zh/guides/advanced-features/low-level.mdx +21 -16
- package/docs/zh/guides/advanced-features/page-performance/code-split.mdx +3 -3
- package/docs/zh/guides/advanced-features/page-performance/inline-assets.mdx +4 -4
- package/docs/zh/guides/advanced-features/page-performance/optimize-bundle.mdx +7 -21
- package/docs/zh/guides/advanced-features/page-performance/react-compiler.mdx +1 -8
- package/docs/zh/guides/advanced-features/server-monitor/logger.mdx +0 -4
- package/docs/zh/guides/advanced-features/server-monitor/monitors.mdx +63 -35
- package/docs/zh/guides/advanced-features/web-server.mdx +79 -300
- package/docs/zh/guides/basic-features/_meta.json +6 -1
- package/docs/zh/guides/basic-features/css/css-in-js.mdx +40 -5
- package/docs/zh/guides/basic-features/css/css-modules.mdx +6 -17
- package/docs/zh/guides/basic-features/css/css.mdx +2 -2
- package/docs/zh/guides/basic-features/css/tailwindcss.mdx +6 -90
- package/docs/zh/guides/basic-features/data/data-cache.mdx +8 -5
- package/docs/zh/guides/basic-features/data/data-fetch.mdx +6 -5
- package/docs/zh/guides/basic-features/data/data-write.mdx +4 -4
- package/docs/zh/guides/basic-features/debug/mock.mdx +4 -1
- package/docs/zh/guides/basic-features/debug/proxy.mdx +0 -8
- package/docs/zh/guides/basic-features/debug/rsdoctor.mdx +6 -6
- package/docs/zh/guides/basic-features/deploy.mdx +24 -20
- package/docs/zh/guides/basic-features/env-vars.mdx +1 -1
- package/docs/zh/guides/basic-features/html.mdx +2 -2
- package/docs/zh/guides/basic-features/output-files.mdx +3 -3
- package/docs/zh/guides/basic-features/render/_meta.json +1 -1
- package/docs/zh/guides/basic-features/render/before-render.mdx +17 -24
- package/docs/zh/guides/basic-features/render/overview.mdx +52 -0
- package/docs/zh/guides/basic-features/render/rsc.mdx +413 -0
- package/docs/zh/guides/basic-features/render/ssg.mdx +27 -69
- package/docs/zh/guides/basic-features/render/ssr-cache.mdx +5 -5
- package/docs/zh/guides/basic-features/render/ssr.mdx +34 -31
- package/docs/zh/guides/basic-features/render/streaming-ssr.mdx +34 -14
- package/docs/zh/guides/basic-features/routes/_meta.json +1 -0
- package/docs/zh/guides/basic-features/routes/config-routes.mdx +426 -0
- package/docs/zh/guides/basic-features/{routes.mdx → routes/routes.mdx} +8 -114
- package/docs/zh/guides/basic-features/static-assets/json-files.mdx +21 -3
- package/docs/zh/guides/basic-features/static-assets.mdx +2 -2
- package/docs/zh/guides/basic-features/testing/cypress.mdx +5 -5
- package/docs/zh/guides/basic-features/testing/jest.mdx +12 -12
- package/docs/zh/guides/concept/builder.mdx +24 -9
- package/docs/zh/guides/concept/entries.mdx +95 -92
- package/docs/zh/guides/get-started/glossary.mdx +0 -18
- package/docs/zh/guides/get-started/introduction.mdx +1 -5
- package/docs/zh/guides/get-started/quick-start.mdx +5 -72
- package/docs/zh/guides/get-started/tech-stack.mdx +8 -26
- package/docs/zh/guides/get-started/upgrade.mdx +30 -23
- package/docs/zh/guides/topic-detail/_meta.json +0 -12
- package/docs/zh/guides/topic-detail/module-federation/_meta.json +1 -1
- package/docs/zh/guides/topic-detail/module-federation/application.mdx +18 -16
- package/docs/zh/guides/topic-detail/module-federation/i18n.mdx +623 -0
- package/docs/zh/guides/topic-detail/module-federation/introduce.mdx +4 -4
- package/docs/zh/guides/topic-detail/module-federation/ssr.mdx +51 -5
- package/docs/zh/guides/topic-detail/module-federation/usage.mdx +11 -32
- package/docs/zh/guides/troubleshooting/builder.mdx +3 -84
- package/docs/zh/guides/troubleshooting/cli.mdx +6 -30
- package/docs/zh/guides/troubleshooting/dependencies.mdx +23 -23
- package/docs/zh/guides/upgrade/_meta.json +1 -0
- package/docs/zh/guides/upgrade/config.mdx +809 -0
- package/docs/zh/guides/upgrade/entry.mdx +463 -0
- package/docs/zh/guides/upgrade/other.md +90 -0
- package/docs/zh/guides/upgrade/overview.mdx +36 -0
- package/docs/zh/guides/upgrade/tailwindcss.mdx +130 -0
- package/docs/zh/guides/upgrade/web-server.md +93 -0
- package/docs/zh/plugin/cli-plugins/api.mdx +4 -5
- package/docs/zh/plugin/cli-plugins/migration.mdx +30 -45
- package/docs/zh/plugin/introduction.mdx +36 -24
- package/docs/zh/plugin/official/_meta.json +0 -5
- package/docs/zh/plugin/official/cli-plugins/_meta.json +1 -1
- package/docs/zh/plugin/official/cli-plugins/plugin-styled-components.mdx +5 -0
- package/docs/zh/plugin/official/cli-plugins.mdx +0 -2
- package/docs/zh/plugin/plugin-system.mdx +45 -42
- package/docs/zh/plugin/runtime-plugins/api.mdx +58 -56
- package/docs/zh/plugin/runtime-plugins/migration.mdx +26 -17
- package/docs/zh/tutorials/_meta.json +0 -10
- package/docs/zh/tutorials/examples/csr-auth.mdx +1 -1
- package/docs/zh/tutorials/foundations/introduction.mdx +8 -25
- package/i18n.json +0 -16
- package/package.json +12 -12
- package/rspress.config.ts +5 -8
- package/src/components/ContentCard/index.module.scss +11 -7
- package/src/components/ContentCard/index.tsx +1 -1
- package/src/components/FeatureLayout/index.module.css +1 -1
- package/src/components/Footer/index.tsx +2 -14
- package/src/components/Footer/styles.module.scss +5 -5
- package/src/components/ListCard/index.tsx +1 -1
- package/src/components/RandomMemberList/index.tsx +1 -1
- package/src/components/RsbuildLink/index.tsx +1 -1
- package/src/components/Sandpack/index.tsx +1 -1
- package/src/custom.scss +15 -0
- package/src/i18n/enUS.ts +2 -4
- package/src/i18n/index.ts +1 -1
- package/src/i18n/zhCN.ts +2 -4
- package/src/index.ts +2 -1
- package/src/pages/index.module.scss +59 -41
- package/src/pages/index.tsx +9 -24
- package/docs/en/apis/app/hooks/server/index_.mdx +0 -10
- package/docs/en/apis/app/hooks/src/index_.mdx +0 -38
- package/docs/en/apis/app/hooks/src/stories.mdx +0 -16
- package/docs/en/apis/app/runtime/app/define-config.mdx +0 -67
- package/docs/en/apis/app/runtime/core/bootstrap.mdx +0 -74
- package/docs/en/apis/app/runtime/core/create-app.mdx +0 -49
- package/docs/en/apis/app/runtime/core/use-loader.mdx +0 -89
- package/docs/en/apis/app/runtime/core/use-module-apps.mdx +0 -140
- package/docs/en/apis/app/runtime/core/use-runtime-context.mdx +0 -116
- package/docs/en/apis/app/runtime/model/Provider.mdx +0 -36
- package/docs/en/apis/app/runtime/model/auto-actions.mdx +0 -122
- package/docs/en/apis/app/runtime/model/connect.mdx +0 -146
- package/docs/en/apis/app/runtime/model/create-app.mdx +0 -75
- package/docs/en/apis/app/runtime/model/create-store.mdx +0 -61
- package/docs/en/apis/app/runtime/model/handle-effect.mdx +0 -107
- package/docs/en/apis/app/runtime/model/model_.mdx +0 -198
- package/docs/en/apis/app/runtime/model/use-local-model.mdx +0 -29
- package/docs/en/apis/app/runtime/model/use-model.mdx +0 -89
- package/docs/en/apis/app/runtime/model/use-static-model.mdx +0 -51
- package/docs/en/apis/app/runtime/model/use-store.mdx +0 -26
- package/docs/en/apis/app/runtime/ssr/pre-render.mdx +0 -96
- package/docs/en/apis/app/runtime/web-server/hook.mdx +0 -134
- package/docs/en/apis/app/runtime/web-server/middleware.mdx +0 -113
- package/docs/en/apis/app/runtime/web-server/unstable_middleware.mdx +0 -167
- package/docs/en/components/bff-proxy-path-rewrite.mdx +0 -16
- package/docs/en/components/bff-proxy-principle.mdx +0 -1
- package/docs/en/components/builder.mdx +0 -3
- package/docs/en/components/create-bff-api-app.mdx +0 -25
- package/docs/en/components/custom-router-micro-frontend.mdx +0 -40
- package/docs/en/components/enable-micro-frontend.mdx +0 -30
- package/docs/en/components/enableSwc.mdx +0 -17
- package/docs/en/components/global-proxy-config.mdx +0 -85
- package/docs/en/components/global-proxy.mdx +0 -29
- package/docs/en/components/package-manager.mdx +0 -11
- package/docs/en/components/reduck-notify.mdx +0 -27
- package/docs/en/components/reduck-tip.mdx +0 -8
- package/docs/en/configure/app/auto-load-plugin.mdx +0 -66
- package/docs/en/configure/app/deploy/microFrontend.mdx +0 -53
- package/docs/en/configure/app/dev/port.mdx +0 -25
- package/docs/en/configure/app/dev/proxy.mdx +0 -9
- package/docs/en/configure/app/experiments/lazy-compilation.mdx +0 -106
- package/docs/en/configure/app/html/disable-html-folder.mdx +0 -46
- package/docs/en/configure/app/html/favicon-by-entries.mdx +0 -36
- package/docs/en/configure/app/html/inject-by-entries.mdx +0 -36
- package/docs/en/configure/app/html/meta-by-entries.mdx +0 -48
- package/docs/en/configure/app/html/tags-by-entries.mdx +0 -44
- package/docs/en/configure/app/html/template-by-entries.mdx +0 -33
- package/docs/en/configure/app/html/template-parameters-by-entries.mdx +0 -35
- package/docs/en/configure/app/html/title-by-entries.mdx +0 -37
- package/docs/en/configure/app/output/css-module-local-ident-name.mdx +0 -21
- package/docs/en/configure/app/output/disable-css-extract.mdx +0 -16
- package/docs/en/configure/app/output/disable-filename-hash.mdx +0 -16
- package/docs/en/configure/app/output/disable-minimize.mdx +0 -14
- package/docs/en/configure/app/output/disable-node-polyfill.mdx +0 -22
- package/docs/en/configure/app/output/disable-source-map.mdx +0 -31
- package/docs/en/configure/app/output/enable-asset-fallback.mdx +0 -36
- package/docs/en/configure/app/output/enable-inline-scripts.mdx +0 -22
- package/docs/en/configure/app/output/enable-inline-styles.mdx +0 -22
- package/docs/en/configure/app/output/enable-latest-decorators.mdx +0 -14
- package/docs/en/configure/app/performance/transform-lodash.mdx +0 -52
- package/docs/en/configure/app/runtime/master-app.mdx +0 -36
- package/docs/en/configure/app/runtime/state.mdx +0 -52
- package/docs/en/configure/app/source/disable-entry-dirs.mdx +0 -38
- package/docs/en/configure/app/source/enable-custom-entry.mdx +0 -68
- package/docs/en/configure/app/source/module-scopes.mdx +0 -72
- package/docs/en/configure/app/source/resolve-extension-prefix.mdx +0 -55
- package/docs/en/configure/app/source/resolve-main-fields.mdx +0 -46
- package/docs/en/configure/app/tools/esbuild.mdx +0 -44
- package/docs/en/configure/app/tools/pug.mdx +0 -54
- package/docs/en/configure/app/tools/styled-components.mdx +0 -55
- package/docs/en/configure/app/tools/tailwindcss.mdx +0 -98
- package/docs/en/configure/app/tools/terser.mdx +0 -58
- package/docs/en/configure/app/tools/ts-loader.mdx +0 -76
- package/docs/en/configure/app/tools/webpack-chain.mdx +0 -249
- package/docs/en/configure/app/tools/webpack.mdx +0 -305
- package/docs/en/guides/deprecated.md +0 -17
- package/docs/en/guides/topic-detail/micro-frontend/c01-introduction.mdx +0 -27
- package/docs/en/guides/topic-detail/micro-frontend/c02-development.mdx +0 -290
- package/docs/en/guides/topic-detail/micro-frontend/c03-main-app.mdx +0 -298
- package/docs/en/guides/topic-detail/micro-frontend/c04-communicate.mdx +0 -58
- package/docs/en/guides/topic-detail/micro-frontend/c05-mixed-stack.mdx +0 -26
- package/docs/en/guides/topic-detail/model/_meta.json +0 -14
- package/docs/en/guides/topic-detail/model/auto-actions.mdx +0 -85
- package/docs/en/guides/topic-detail/model/computed-state.mdx +0 -148
- package/docs/en/guides/topic-detail/model/define-model.mdx +0 -62
- package/docs/en/guides/topic-detail/model/faq.mdx +0 -35
- package/docs/en/guides/topic-detail/model/manage-effects.mdx +0 -247
- package/docs/en/guides/topic-detail/model/model-communicate.mdx +0 -217
- package/docs/en/guides/topic-detail/model/performance.mdx +0 -167
- package/docs/en/guides/topic-detail/model/quick-start.mdx +0 -117
- package/docs/en/guides/topic-detail/model/redux-integration.mdx +0 -20
- package/docs/en/guides/topic-detail/model/typescript-best-practice.mdx +0 -68
- package/docs/en/guides/topic-detail/model/use-model.mdx +0 -243
- package/docs/en/guides/topic-detail/model/use-out-of-modernjs.mdx +0 -46
- package/docs/en/plugin/official/cli-plugins/plugin-swc.mdx +0 -363
- package/docs/en/plugin/official/cli-plugins/plugin-tailwind.mdx +0 -5
- package/docs/en/plugin/official/rsbuild-plugins/_meta.json +0 -1
- package/docs/en/plugin/official/rsbuild-plugins/plugin-esbuild.mdx +0 -205
- package/docs/en/plugin/official/rsbuild-plugins.mdx +0 -3
- package/docs/en/tutorials/first-app/c01-start.mdx +0 -99
- package/docs/en/tutorials/first-app/c02-component.mdx +0 -60
- package/docs/en/tutorials/first-app/c03-css.mdx +0 -324
- package/docs/en/tutorials/first-app/c04-routes.mdx +0 -172
- package/docs/en/tutorials/first-app/c05-loader.mdx +0 -87
- package/docs/en/tutorials/first-app/c06-model.mdx +0 -278
- package/docs/en/tutorials/first-app/c07-container.mdx +0 -281
- package/docs/en/tutorials/first-app/c08-entries.mdx +0 -135
- package/docs/zh/apis/app/hooks/server/index_.mdx +0 -10
- package/docs/zh/apis/app/hooks/src/index_.mdx +0 -39
- package/docs/zh/apis/app/hooks/src/stories.mdx +0 -16
- package/docs/zh/apis/app/runtime/app/define-config.mdx +0 -67
- package/docs/zh/apis/app/runtime/core/bootstrap.mdx +0 -74
- package/docs/zh/apis/app/runtime/core/create-app.mdx +0 -35
- package/docs/zh/apis/app/runtime/core/use-loader.mdx +0 -89
- package/docs/zh/apis/app/runtime/core/use-module-apps.mdx +0 -179
- package/docs/zh/apis/app/runtime/core/use-runtime-context.mdx +0 -116
- package/docs/zh/apis/app/runtime/model/Provider.mdx +0 -36
- package/docs/zh/apis/app/runtime/model/auto-actions.mdx +0 -122
- package/docs/zh/apis/app/runtime/model/connect.mdx +0 -143
- package/docs/zh/apis/app/runtime/model/create-app.mdx +0 -75
- package/docs/zh/apis/app/runtime/model/create-store.mdx +0 -61
- package/docs/zh/apis/app/runtime/model/handle-effect.mdx +0 -108
- package/docs/zh/apis/app/runtime/model/model_.mdx +0 -201
- package/docs/zh/apis/app/runtime/model/use-local-model.mdx +0 -29
- package/docs/zh/apis/app/runtime/model/use-model.mdx +0 -89
- package/docs/zh/apis/app/runtime/model/use-static-model.mdx +0 -49
- package/docs/zh/apis/app/runtime/model/use-store.mdx +0 -26
- package/docs/zh/apis/app/runtime/ssr/pre-render.mdx +0 -96
- package/docs/zh/apis/app/runtime/web-server/hook.mdx +0 -136
- package/docs/zh/apis/app/runtime/web-server/middleware.mdx +0 -114
- package/docs/zh/apis/app/runtime/web-server/unstable_middleware.mdx +0 -165
- package/docs/zh/components/bff-proxy-path-rewrite.mdx +0 -16
- package/docs/zh/components/bff-proxy-principle.mdx +0 -1
- package/docs/zh/components/builder.mdx +0 -3
- package/docs/zh/components/create-bff-api-app.mdx +0 -25
- package/docs/zh/components/custom-router-micro-frontend.mdx +0 -40
- package/docs/zh/components/enable-micro-frontend.mdx +0 -30
- package/docs/zh/components/enableSwc.mdx +0 -17
- package/docs/zh/components/global-proxy-config.mdx +0 -85
- package/docs/zh/components/global-proxy.mdx +0 -29
- package/docs/zh/components/package-manager.mdx +0 -11
- package/docs/zh/components/reduck-notify.mdx +0 -27
- package/docs/zh/components/reduck-tip.mdx +0 -8
- package/docs/zh/configure/app/auto-load-plugin.mdx +0 -66
- package/docs/zh/configure/app/deploy/microFrontend.mdx +0 -55
- package/docs/zh/configure/app/dev/port.mdx +0 -25
- package/docs/zh/configure/app/dev/proxy.mdx +0 -9
- package/docs/zh/configure/app/experiments/lazy-compilation.mdx +0 -105
- package/docs/zh/configure/app/html/disable-html-folder.mdx +0 -45
- package/docs/zh/configure/app/html/favicon-by-entries.mdx +0 -37
- package/docs/zh/configure/app/html/inject-by-entries.mdx +0 -37
- package/docs/zh/configure/app/html/meta-by-entries.mdx +0 -48
- package/docs/zh/configure/app/html/tags-by-entries.mdx +0 -44
- package/docs/zh/configure/app/html/template-by-entries.mdx +0 -33
- package/docs/zh/configure/app/html/template-parameters-by-entries.mdx +0 -36
- package/docs/zh/configure/app/html/title-by-entries.mdx +0 -37
- package/docs/zh/configure/app/output/css-module-local-ident-name.mdx +0 -21
- package/docs/zh/configure/app/output/disable-css-extract.mdx +0 -16
- package/docs/zh/configure/app/output/disable-filename-hash.mdx +0 -16
- package/docs/zh/configure/app/output/disable-minimize.mdx +0 -14
- package/docs/zh/configure/app/output/disable-node-polyfill.mdx +0 -22
- package/docs/zh/configure/app/output/disable-source-map.mdx +0 -31
- package/docs/zh/configure/app/output/enable-asset-fallback.mdx +0 -36
- package/docs/zh/configure/app/output/enable-inline-scripts.mdx +0 -22
- package/docs/zh/configure/app/output/enable-inline-styles.mdx +0 -22
- package/docs/zh/configure/app/output/enable-latest-decorators.mdx +0 -14
- package/docs/zh/configure/app/performance/transform-lodash.mdx +0 -52
- package/docs/zh/configure/app/runtime/master-app.mdx +0 -38
- package/docs/zh/configure/app/runtime/state.mdx +0 -52
- package/docs/zh/configure/app/source/disable-entry-dirs.mdx +0 -38
- package/docs/zh/configure/app/source/enable-custom-entry.mdx +0 -67
- package/docs/zh/configure/app/source/module-scopes.mdx +0 -72
- package/docs/zh/configure/app/source/resolve-extension-prefix.mdx +0 -57
- package/docs/zh/configure/app/source/resolve-main-fields.mdx +0 -46
- package/docs/zh/configure/app/tools/esbuild.mdx +0 -44
- package/docs/zh/configure/app/tools/pug.mdx +0 -54
- package/docs/zh/configure/app/tools/styled-components.mdx +0 -54
- package/docs/zh/configure/app/tools/tailwindcss.mdx +0 -98
- package/docs/zh/configure/app/tools/terser.mdx +0 -58
- package/docs/zh/configure/app/tools/ts-loader.mdx +0 -76
- package/docs/zh/configure/app/tools/webpack-chain.mdx +0 -253
- package/docs/zh/configure/app/tools/webpack.mdx +0 -305
- package/docs/zh/guides/advanced-features/rspack-start.mdx +0 -154
- package/docs/zh/guides/deprecated.md +0 -19
- package/docs/zh/guides/topic-detail/micro-frontend/c01-introduction.mdx +0 -26
- package/docs/zh/guides/topic-detail/micro-frontend/c02-development.mdx +0 -332
- package/docs/zh/guides/topic-detail/micro-frontend/c03-main-app.mdx +0 -296
- package/docs/zh/guides/topic-detail/micro-frontend/c04-communicate.mdx +0 -58
- package/docs/zh/guides/topic-detail/micro-frontend/c05-mixed-stack.mdx +0 -27
- package/docs/zh/guides/topic-detail/model/_meta.json +0 -14
- package/docs/zh/guides/topic-detail/model/auto-actions.mdx +0 -88
- package/docs/zh/guides/topic-detail/model/computed-state.mdx +0 -147
- package/docs/zh/guides/topic-detail/model/define-model.mdx +0 -63
- package/docs/zh/guides/topic-detail/model/faq.mdx +0 -36
- package/docs/zh/guides/topic-detail/model/manage-effects.mdx +0 -256
- package/docs/zh/guides/topic-detail/model/model-communicate.mdx +0 -217
- package/docs/zh/guides/topic-detail/model/performance.mdx +0 -167
- package/docs/zh/guides/topic-detail/model/quick-start.mdx +0 -117
- package/docs/zh/guides/topic-detail/model/redux-integration.mdx +0 -20
- package/docs/zh/guides/topic-detail/model/typescript-best-practice.mdx +0 -67
- package/docs/zh/guides/topic-detail/model/use-model.mdx +0 -248
- package/docs/zh/guides/topic-detail/model/use-out-of-modernjs.mdx +0 -46
- package/docs/zh/plugin/official/cli-plugins/plugin-swc.mdx +0 -351
- package/docs/zh/plugin/official/cli-plugins/plugin-tailwind.mdx +0 -5
- package/docs/zh/plugin/official/rsbuild-plugins/_meta.json +0 -1
- package/docs/zh/plugin/official/rsbuild-plugins/plugin-esbuild.mdx +0 -201
- package/docs/zh/plugin/official/rsbuild-plugins.mdx +0 -3
- package/docs/zh/tutorials/first-app/c01-start.mdx +0 -99
- package/docs/zh/tutorials/first-app/c02-component.mdx +0 -60
- package/docs/zh/tutorials/first-app/c03-css.mdx +0 -323
- package/docs/zh/tutorials/first-app/c04-routes.mdx +0 -172
- package/docs/zh/tutorials/first-app/c05-loader.mdx +0 -89
- package/docs/zh/tutorials/first-app/c06-model.mdx +0 -274
- package/docs/zh/tutorials/first-app/c07-container.mdx +0 -281
- package/docs/zh/tutorials/first-app/c08-entries.mdx +0 -135
- /package/docs/en/components/{reduck-migration.mdx → auto-upgrade.mdx} +0 -0
- /package/docs/{zh/components/reduck-migration.mdx → en/components/international/platform-support.mdx} +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Routing Integration
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Routing Integration
|
|
6
|
+
|
|
7
|
+
The plugin is deeply integrated with Modern.js routing system, supporting language path prefixes and automatic path redirection.
|
|
8
|
+
|
|
9
|
+
## Enable Path Redirection
|
|
10
|
+
|
|
11
|
+
When `localePathRedirect` is set to `true`, the plugin will automatically add language prefixes to URLs and handle path redirection when switching languages.
|
|
12
|
+
|
|
13
|
+
**Configuration**:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
i18nPlugin({
|
|
17
|
+
localeDetection: {
|
|
18
|
+
localePathRedirect: true,
|
|
19
|
+
languages: ['zh', 'en'],
|
|
20
|
+
fallbackLanguage: 'en',
|
|
21
|
+
// Optional: ignore automatic redirection for certain routes
|
|
22
|
+
ignoreRedirectRoutes: ['/api', '/admin'],
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Ignore Redirection Routes
|
|
28
|
+
|
|
29
|
+
Some routes (such as API routes, static resources, etc.) don't need language prefixes. You can use the `ignoreRedirectRoutes` configuration to ignore automatic redirection for these routes:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
i18nPlugin({
|
|
33
|
+
localeDetection: {
|
|
34
|
+
localePathRedirect: true,
|
|
35
|
+
languages: ['zh', 'en'],
|
|
36
|
+
fallbackLanguage: 'en',
|
|
37
|
+
// String array: supports exact match and prefix match
|
|
38
|
+
ignoreRedirectRoutes: ['/api', '/admin', '/static'],
|
|
39
|
+
// Or use function for more flexible judgment
|
|
40
|
+
ignoreRedirectRoutes: pathname => {
|
|
41
|
+
return pathname.startsWith('/api') || pathname.startsWith('/admin');
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
For more details, please refer to the `ignoreRedirectRoutes` configuration in the [Locale Detection documentation](./locale-detection#ignoreredirectroutes).
|
|
48
|
+
|
|
49
|
+
## Route Configuration
|
|
50
|
+
|
|
51
|
+
After enabling path redirection, you need to add `:lang` dynamic parameter to the route configuration.
|
|
52
|
+
|
|
53
|
+
### Convention-based Routing
|
|
54
|
+
|
|
55
|
+
When using convention-based routing, you need to create a `[lang]` directory under the `routes/` directory to represent the language parameter:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
routes/
|
|
59
|
+
├── [lang]/
|
|
60
|
+
│ ├── layout.tsx # Layout component
|
|
61
|
+
│ ├── page.tsx # Home page
|
|
62
|
+
│ ├── about/
|
|
63
|
+
│ │ └── page.tsx # About page
|
|
64
|
+
│ └── contact/
|
|
65
|
+
│ └── page.tsx # Contact page
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**routes/[lang]/layout.tsx**:
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { Outlet } from '@modern-js/runtime/router';
|
|
72
|
+
|
|
73
|
+
export default function Layout() {
|
|
74
|
+
return <Outlet />;
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**routes/[lang]/page.tsx**:
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
export default function Home() {
|
|
82
|
+
return <div>Home</div>;
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**routes/[lang]/about/page.tsx**:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
export default function About() {
|
|
90
|
+
return <div>About</div>;
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**routes/[lang]/contact/page.tsx**:
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
export default function Contact() {
|
|
98
|
+
return <div>Contact</div>;
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Generated Route Structure**:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
/:lang → Home page
|
|
106
|
+
/:lang/about → About page
|
|
107
|
+
/:lang/contact → Contact page
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
When accessing `/` or `/about`, it will automatically redirect to `/en` or `/en/about` (using the default language).
|
|
111
|
+
|
|
112
|
+
### Custom Routing
|
|
113
|
+
|
|
114
|
+
If using custom routing (`modern.routes.ts`), you need to add `:lang` dynamic parameter in the route configuration:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import {
|
|
118
|
+
BrowserRouter,
|
|
119
|
+
Route,
|
|
120
|
+
Routes,
|
|
121
|
+
Outlet,
|
|
122
|
+
} from '@modern-js/runtime/router';
|
|
123
|
+
|
|
124
|
+
function App() {
|
|
125
|
+
return (
|
|
126
|
+
<BrowserRouter>
|
|
127
|
+
<Routes>
|
|
128
|
+
{/* Add :lang parameter */}
|
|
129
|
+
<Route path=":lang" element={<Outlet />}>
|
|
130
|
+
<Route index element={<Home />} />
|
|
131
|
+
<Route path="about" element={<About />} />
|
|
132
|
+
<Route path="contact" element={<Contact />} />
|
|
133
|
+
</Route>
|
|
134
|
+
</Routes>
|
|
135
|
+
</BrowserRouter>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
:::info
|
|
141
|
+
Convention-based routing will automatically generate corresponding routes based on the file structure. It's recommended to use convention-based routing. Only use custom routing when special route control is needed.
|
|
142
|
+
|
|
143
|
+
:::
|
|
144
|
+
|
|
145
|
+
## I18nLink Component
|
|
146
|
+
|
|
147
|
+
The `I18nLink` component is provided by `@modern-js/plugin-i18n` and automatically adds the current language prefix to paths.
|
|
148
|
+
|
|
149
|
+
### Basic Usage
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import { I18nLink } from '@modern-js/plugin-i18n/runtime';
|
|
153
|
+
|
|
154
|
+
function Navigation() {
|
|
155
|
+
return (
|
|
156
|
+
<nav>
|
|
157
|
+
<I18nLink to="/">Home</I18nLink>
|
|
158
|
+
<I18nLink to="/about">About</I18nLink>
|
|
159
|
+
<I18nLink to="/contact">Contact</I18nLink>
|
|
160
|
+
</nav>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**When current language is `en`**:
|
|
166
|
+
|
|
167
|
+
- `<I18nLink to="/">` → Actual link: `/en`
|
|
168
|
+
- `<I18nLink to="/about">` → Actual link: `/en/about`
|
|
169
|
+
|
|
170
|
+
**When current language is `zh`**:
|
|
171
|
+
|
|
172
|
+
- `<I18nLink to="/">` → Actual link: `/zh`
|
|
173
|
+
- `<I18nLink to="/about">` → Actual link: `/zh/about`
|
|
174
|
+
|
|
175
|
+
### Automatic Language Prefix
|
|
176
|
+
|
|
177
|
+
`I18nLink` automatically handles language prefixes, no need to add them manually:
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
// ✅ Correct: No need to manually add language prefix
|
|
181
|
+
<I18nLink to="/about">About</I18nLink>
|
|
182
|
+
|
|
183
|
+
// ❌ Wrong: Don't manually add language prefix
|
|
184
|
+
<I18nLink to="/en/about">About</I18nLink>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Props
|
|
188
|
+
|
|
189
|
+
`I18nLink` accepts all `Link` component props and additionally supports:
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
interface I18nLinkProps {
|
|
193
|
+
/** Target path (no need to include language prefix) */
|
|
194
|
+
to: string;
|
|
195
|
+
/** Child elements */
|
|
196
|
+
children: React.ReactNode;
|
|
197
|
+
/** Other Link component props */
|
|
198
|
+
[key: string]: any;
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Example**:
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
<I18nLink to="/about" replace>
|
|
206
|
+
About
|
|
207
|
+
</I18nLink>
|
|
208
|
+
|
|
209
|
+
<I18nLink to="/contact" state={{ from: 'home' }}>
|
|
210
|
+
Contact
|
|
211
|
+
</I18nLink>
|
|
212
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Internationalization
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Internationalization
|
|
6
|
+
|
|
7
|
+
import I18nPluginIntroduce from '@site-docs/components/international/introduce';
|
|
8
|
+
|
|
9
|
+
<I18nPluginIntroduce />
|
|
10
|
+
|
|
11
|
+
## Core Features
|
|
12
|
+
|
|
13
|
+
- 🌍 **Multi-language Support**: Easily manage translation resources for multiple languages
|
|
14
|
+
- 🔍 **Smart Language Detection**: Supports automatic language detection from URL paths, cookies, request headers, and more
|
|
15
|
+
- 📦 **Flexible Resource Loading**: Supports three resource loading methods: HTTP, file system, and custom SDK
|
|
16
|
+
- 🛣️ **Route Integration**: Deeply integrated with Modern.js routing system, supports language path prefixes
|
|
17
|
+
- ⚡ **SSR Support**: Full support for server-side rendering (SSR) scenarios
|
|
18
|
+
- 🎯 **TypeScript Support**: Complete TypeScript type definitions
|
|
19
|
+
|
|
20
|
+
## Use Cases
|
|
21
|
+
|
|
22
|
+
- Web applications that need to support multiple languages
|
|
23
|
+
- Multi-language routing that is SEO-friendly
|
|
24
|
+
- Multi-language applications that require server-side rendering
|
|
25
|
+
- Applications that need to dynamically load translation resources from external services
|
|
26
|
+
|
|
27
|
+
## Documentation Navigation
|
|
28
|
+
|
|
29
|
+
- [Basic Concepts](./international/basic) - Core concepts and terminology
|
|
30
|
+
- [Quick Start](./international/quick-start) - Detailed installation and configuration guide
|
|
31
|
+
- [Configuration](./international/configuration) - CLI and runtime configuration details
|
|
32
|
+
- [Locale Detection](./international/locale-detection) - Multiple language detection methods and priorities
|
|
33
|
+
- [Resource Loading](./international/resource-loading) - HTTP, FS, and SDK backend usage
|
|
34
|
+
- [Routing Integration](./international/routing) - Path redirection and I18nLink component
|
|
35
|
+
- [API Reference](./international/api) - Complete API documentation and type definitions
|
|
36
|
+
- [Advanced Usage](./international/advanced) - SSR, multi-entry, custom instances, and more
|
|
37
|
+
- [Best Practices](./international/best-practices) - Resource organization, error handling, type safety
|
|
@@ -6,16 +6,18 @@ sidebar_position: 10
|
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
8
|
|
|
9
|
-
Modern.js internally integrates tools such as [
|
|
9
|
+
Modern.js internally integrates tools such as [TypeScript](https://www.typescriptlang.org/), [Rspack](https://rspack.rs/), [PostCSS](https://postcss.org/), [SWC](https://swc.rs/) by default.
|
|
10
10
|
|
|
11
11
|
Usually, the default configuration can meet most development needs. When there are special needs, it can be achieved through the underlying configuration.
|
|
12
12
|
|
|
13
|
-
Take configuring
|
|
13
|
+
Take configuring Rspack as an example, just add [tools.rspack](/configure/app/tools/rspack) to the modern.config.ts:
|
|
14
14
|
|
|
15
15
|
```ts title="modern.config.ts"
|
|
16
16
|
export default defineConfig({
|
|
17
17
|
tools: {
|
|
18
|
-
|
|
18
|
+
rspack: config => {
|
|
19
|
+
// Modify Rspack configuration
|
|
20
|
+
},
|
|
19
21
|
},
|
|
20
22
|
});
|
|
21
23
|
```
|
|
@@ -30,16 +32,19 @@ When the value is `Function`, the first parameter is the default configuration v
|
|
|
30
32
|
|
|
31
33
|
Currently provided is as follows:
|
|
32
34
|
|
|
33
|
-
| Tools
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
35
|
+
| Tools | Config |
|
|
36
|
+
| ------------------ | -------------------------------------------------------------------- |
|
|
37
|
+
| Rspack | [tools.rspack](/configure/app/tools/rspack) |
|
|
38
|
+
| Bundler Chain | [tools.bundlerChain](/configure/app/tools/bundler-chain) |
|
|
39
|
+
| SWC | [tools.swc](/configure/app/tools/swc) |
|
|
40
|
+
| TypeScript Checker | [tools.tsChecker](/configure/app/tools/ts-checker) |
|
|
41
|
+
| PostCSS | [tools.postcss](/configure/app/tools/postcss) |
|
|
42
|
+
| Less | [tools.less](/configure/app/tools/less) |
|
|
43
|
+
| Sass | [tools.sass](/configure/app/tools/sass) |
|
|
44
|
+
| CSS Extract | [tools.cssExtract](/configure/app/tools/css-extract) |
|
|
45
|
+
| CSS Loader | [tools.cssLoader](/configure/app/tools/css-loader) |
|
|
46
|
+
| Style Loader | [tools.styleLoader](/configure/app/tools/style-loader) |
|
|
47
|
+
| Lightning CSS | [tools.lightningcssLoader](/configure/app/tools/lightningcss-loader) |
|
|
48
|
+
| Minify CSS | [tools.minifyCss](/configure/app/tools/minify-css) |
|
|
49
|
+
| Autoprefixer | [tools.autoprefixer](/configure/app/tools/autoprefixer) |
|
|
50
|
+
| HTML Plugin | [tools.htmlPlugin](/configure/app/tools/html-plugin) |
|
|
@@ -7,7 +7,7 @@ sidebar_position: 3
|
|
|
7
7
|
Code splitting is a common way to optimize frontend resource loading. This article will introduce the three types of code splitting supported by Modern.js:
|
|
8
8
|
|
|
9
9
|
:::info
|
|
10
|
-
When using Modern.js [Conventional routing](/guides/basic-features/routes#conventional-routing). By default, code splitting is done according to the routing component, so you don't need to do it yourself.
|
|
10
|
+
When using Modern.js [Conventional routing](/guides/basic-features/routes/routes#conventional-routing). By default, code splitting is done according to the routing component, so you don't need to do it yourself.
|
|
11
11
|
:::
|
|
12
12
|
|
|
13
13
|
- dynamic `import`
|
|
@@ -16,7 +16,7 @@ When using Modern.js [Conventional routing](/guides/basic-features/routes#conven
|
|
|
16
16
|
|
|
17
17
|
## Dynamic import
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
When using dynamic `import()`, the JS modules passed to this API will be bundled as a separate JS file. For example:
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
22
|
import('./math').then(math => {
|
|
@@ -26,10 +26,10 @@ import('./math').then(math => {
|
|
|
26
26
|
|
|
27
27
|
## React.lazy
|
|
28
28
|
|
|
29
|
-
The
|
|
29
|
+
The official way provided by React to split component code.
|
|
30
30
|
|
|
31
31
|
:::caution
|
|
32
|
-
`React.lazy` is typically used
|
|
32
|
+
`React.lazy` is typically used together with `<Suspense>`, hence it is only available in CSR or React 18+ Streaming SSR.
|
|
33
33
|
|
|
34
34
|
For projects that use Traditional SSR(renderToString), `React.lazy` is not supported. Please use the Loadable API instead.
|
|
35
35
|
:::
|
|
@@ -102,12 +102,12 @@ Excluding assets from inlining will increase the number of assets that the Web A
|
|
|
102
102
|
|
|
103
103
|
In addition to inlining static assets into JS files, Modern.js also supports inlining JS files into HTML files.
|
|
104
104
|
|
|
105
|
-
Just enable the [output.
|
|
105
|
+
Just enable the [output.inlineScripts](/configure/app/output/inline-scripts) config, and the generated JS files will not be written into the output directory, but will be directly inlined to the corresponding in the HTML file.
|
|
106
106
|
|
|
107
107
|
```ts
|
|
108
108
|
export default {
|
|
109
109
|
output: {
|
|
110
|
-
|
|
110
|
+
inlineScripts: true,
|
|
111
111
|
},
|
|
112
112
|
};
|
|
113
113
|
```
|
|
@@ -120,12 +120,12 @@ Inline JS files may cause the single HTML file to be too large, and it will brea
|
|
|
120
120
|
|
|
121
121
|
You can also inline CSS files into HTML files.
|
|
122
122
|
|
|
123
|
-
Just enable the [output.
|
|
123
|
+
Just enable the [output.inlineStyles](/configure/app/output/inline-styles) config, the generated CSS file will not be written into the output directory, but will be directly inlined to the corresponding in the HTML file.
|
|
124
124
|
|
|
125
125
|
```ts
|
|
126
126
|
export default {
|
|
127
127
|
output: {
|
|
128
|
-
|
|
128
|
+
inlineStyles: true,
|
|
129
129
|
},
|
|
130
130
|
};
|
|
131
131
|
```
|
|
@@ -46,20 +46,20 @@ See the [performance.bundleAnalyze](/configure/app/performance/bundle-analyze.ht
|
|
|
46
46
|
|
|
47
47
|
Modern.js will compile the code according to the project's Browserslist config, and inject some Polyfills. If the project does not need to be compatible with legacy browsers, you can adjust the Browserslist and drop some legacy browsers, thereby reducing the compilation overhead on syntax and polyfill.
|
|
48
48
|
|
|
49
|
-
Modern.js's default
|
|
49
|
+
Modern.js's default [`output.overrideBrowserslist`](/configure/app/output/override-browserslist.html) config is:
|
|
50
50
|
|
|
51
51
|
```js
|
|
52
|
-
['
|
|
52
|
+
['chrome >= 87', 'edge >= 88', 'firefox >= 78', 'safari >= 14'];
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
For example, if you only need to be compatible with browsers above Chrome
|
|
55
|
+
For example, if you only need to be compatible with browsers above Chrome 100, you can change it to:
|
|
56
56
|
|
|
57
57
|
```js
|
|
58
|
-
['Chrome >=
|
|
58
|
+
['Chrome >= 100'];
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
:::tip
|
|
62
|
-
Please read the [Browserslist](
|
|
62
|
+
Please read the [Browserslist configuration](/guides/advanced-features/compatibility.html) chapter to know more about the usage of Browserslist.
|
|
63
63
|
:::
|
|
64
64
|
|
|
65
65
|
## Usage polyfill
|
|
@@ -96,23 +96,9 @@ See details in [plugin-image-compress](https://github.com/rspack-contrib/rsbuild
|
|
|
96
96
|
|
|
97
97
|
## Split Chunk
|
|
98
98
|
|
|
99
|
-
A great
|
|
99
|
+
A great chunk splitting strategy is very important to improve the loading performance of the application. It can make full use of the browser's caching mechanism to reduce the number of requests and improve the loading speed of the application.
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
When the project installs `antd`, `@arco-design/web-react`, or `@douyinfe/semi-ui` packages, it will automatically add the corresponding group. The implementation reference is as follows:
|
|
104
|
-
|
|
105
|
-
```ts
|
|
106
|
-
if (isPackageInstalled('antd', rootPath)) {
|
|
107
|
-
groups.antd = ['antd'];
|
|
108
|
-
}
|
|
109
|
-
if (isPackageInstalled('@arco-design/web-react', rootPath)) {
|
|
110
|
-
groups.arco = [/@?arco-design/];
|
|
111
|
-
}
|
|
112
|
-
if (isPackageInstalled('@douyinfe/semi-ui', rootPath)) {
|
|
113
|
-
groups.semi = [/@(ies|douyinfe)[\\/]semi-.*/];
|
|
114
|
-
}
|
|
115
|
-
```
|
|
101
|
+
A variety of [chunk splitting strategies](https://rsbuild.rs/guide/optimization/split-chunk) are built into Modern.js, which can meet the needs of most applications. You can also customize the chunk splitting config according to your own business scenarios.
|
|
116
102
|
|
|
117
103
|
For example, split the `axios` library under node_modules into `axios.js`:
|
|
118
104
|
|
|
@@ -18,9 +18,6 @@ The steps to use the React Compiler in Modern.js are as follows:
|
|
|
18
18
|
import { appTools, defineConfig } from '@modern-js/app-tools';
|
|
19
19
|
|
|
20
20
|
export default defineConfig({
|
|
21
|
-
runtime: {
|
|
22
|
-
router: true,
|
|
23
|
-
},
|
|
24
21
|
tools: {
|
|
25
22
|
babel(_, { addPlugins }) {
|
|
26
23
|
addPlugins([
|
|
@@ -33,11 +30,7 @@ export default defineConfig({
|
|
|
33
30
|
]);
|
|
34
31
|
},
|
|
35
32
|
},
|
|
36
|
-
plugins: [
|
|
37
|
-
appTools({
|
|
38
|
-
bundler: 'rspack',
|
|
39
|
-
}),
|
|
40
|
-
],
|
|
33
|
+
plugins: [appTools()],
|
|
41
34
|
});
|
|
42
35
|
```
|
|
43
36
|
|
|
@@ -22,33 +22,13 @@ import InitRspackApp from '@site-docs-en/components/init-rspack-app';
|
|
|
22
22
|
|
|
23
23
|
After the project is created, you can experience the project by running `pnpm run dev`. For more project information, please refer to [Quick Start](/guides/get-started/quick-start.html).
|
|
24
24
|
|
|
25
|
-
## Enable Rspack build
|
|
26
|
-
|
|
27
|
-
Since Modern.js MAJOR_VERSION.59.0, you can enable Rspack build by add the following configuration in `modern.config.ts`:
|
|
28
|
-
|
|
29
|
-
```diff title=modern.config.ts
|
|
30
|
-
import { appTools, defineConfig } from '@modern-js/app-tools';
|
|
31
|
-
|
|
32
|
-
export default defineConfig({
|
|
33
|
-
plugins: [
|
|
34
|
-
appTools({
|
|
35
|
-
+ bundler: 'rspack',
|
|
36
|
-
}),
|
|
37
|
-
],
|
|
38
|
-
});
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
:::tip
|
|
42
|
-
If your current version is lower than MAJOR_VERSION.59.0, you can upgrade by executing `npx modern upgrade`.
|
|
43
|
-
:::
|
|
44
|
-
|
|
45
25
|
import RspackPrecautions from '@site-docs-en/components/rspackPrecautions.mdx';
|
|
46
26
|
|
|
47
27
|
<RspackPrecautions />
|
|
48
28
|
|
|
49
29
|
## Migrating configuration
|
|
50
30
|
|
|
51
|
-
In Modern.js, the [tools.
|
|
31
|
+
In Modern.js, the [tools.rspack](/configure/app/tools/rspack) and [tools.bundlerChain](/configure/app/tools/bundler-chain) configurations take effect in Rspack mode. If you were previously using webpack mode, after turning on the Rspack build, you can modify it to [tools.rspack](/configure/app/tools/rspack) and [tools.bundlerChain](/configure/app/tools/bundler-chain).
|
|
52
32
|
|
|
53
33
|
```diff
|
|
54
34
|
export default {
|
|
@@ -81,7 +61,7 @@ If you have custom configuration requirements for `builtin:swc-loader`, you can
|
|
|
81
61
|
```ts
|
|
82
62
|
import { defineConfig } from '@modern-js/app-tools';
|
|
83
63
|
|
|
84
|
-
export default defineConfig
|
|
64
|
+
export default defineConfig({
|
|
85
65
|
tools: {
|
|
86
66
|
swc: {
|
|
87
67
|
jsc: {
|
|
@@ -17,11 +17,7 @@ Modern.js also retains SSR logs from legacy versions using `useLoader`:
|
|
|
17
17
|
| Stage | Message | Level |
|
|
18
18
|
| ------------- | ------------------------------- | ----- |
|
|
19
19
|
| PRERENDER | App Prerender | error |
|
|
20
|
-
| USE_LOADER | App run useLoader | error |
|
|
21
20
|
|
|
22
|
-
:::tip
|
|
23
|
-
The `useLoader` API is now deprecated. We recommend migrating to convention-based routing and using Data Loaders for data fetching. Applications already using Data Loaders can enable [`ssr.disablePrerender`](/configure/app/server/ssr.html#object-type) to disable prerendering and improve SSR performance.
|
|
24
|
-
:::
|
|
25
21
|
|
|
26
22
|
## Built-in Monitor
|
|
27
23
|
|
|
@@ -56,11 +56,11 @@ export interface Monitors {
|
|
|
56
56
|
warn(message: string, ...args: any[]): void;
|
|
57
57
|
debug(message: string, ...args: any[]): void;
|
|
58
58
|
info(message: string, ...args: any[]): void;
|
|
59
|
-
trace(message: string
|
|
59
|
+
trace(message: string, ...args: any[]): void;
|
|
60
60
|
|
|
61
61
|
// Metrics Event
|
|
62
62
|
timing(name: string, dur: number, ...args: any[]): void;
|
|
63
|
-
counter(name: string, ...args: any[]): void
|
|
63
|
+
counter(name: string, ...args: any[]): void;
|
|
64
64
|
}
|
|
65
65
|
```
|
|
66
66
|
|
|
@@ -71,31 +71,47 @@ Modern.js comes with a built-in default Monitor, where different events trigger
|
|
|
71
71
|
- [Log Event](/guides/advanced-features/server-monitor/logger)
|
|
72
72
|
- [Metrics Event](/guides/advanced-features/server-monitor/metrics)
|
|
73
73
|
|
|
74
|
-
|
|
75
74
|
## Register Monitors
|
|
76
75
|
|
|
77
|
-
Developers can register their own Monitors using the `push` API, but this can only be done in [server middleware](/
|
|
76
|
+
Developers can register their own Monitors using the `push` API, but this can only be done in [server middleware](/guides/advanced-features/web-server#unstable-middleware) or server plugins. Registration is not available in Data Loaders, components, or init functions.
|
|
78
77
|
|
|
79
78
|
:::note
|
|
80
79
|
Server plugins are currently not available, and documentation will be added in the future.
|
|
81
80
|
:::
|
|
82
81
|
|
|
83
|
-
```ts title="server/
|
|
84
|
-
import
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
82
|
+
```ts title="server/modern.server.ts"
|
|
83
|
+
import {
|
|
84
|
+
defineServerConfig,
|
|
85
|
+
type MiddlewareHandler,
|
|
86
|
+
} from '@modern-js/server-runtime';
|
|
87
|
+
import type { MonitorEvent } from '@modern-js/types';
|
|
88
|
+
|
|
89
|
+
const injectMonitorMiddleware: MiddlewareHandler = async (c, next) => {
|
|
90
|
+
const monitors = c.get('monitors');
|
|
91
|
+
const myMonitor = (event: MonitorEvent) => {
|
|
92
|
+
if (event.type === 'log') {
|
|
93
|
+
// Handle log events
|
|
94
|
+
console.log(`[${event.payload.level}] ${event.payload.message}`);
|
|
95
|
+
} else if (event.type === 'timing') {
|
|
96
|
+
// Handle timing events
|
|
97
|
+
console.log(`Timing: ${event.payload.name} = ${event.payload.dur}ms`);
|
|
98
|
+
} else if (event.type === 'counter') {
|
|
99
|
+
// Handle counter events
|
|
100
|
+
console.log(`Counter: ${event.payload.name}`);
|
|
93
101
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
102
|
+
};
|
|
103
|
+
monitors.push(myMonitor);
|
|
104
|
+
await next();
|
|
105
|
+
};
|
|
97
106
|
|
|
98
|
-
export
|
|
107
|
+
export default defineServerConfig({
|
|
108
|
+
middlewares: [
|
|
109
|
+
{
|
|
110
|
+
name: 'inject-monitor',
|
|
111
|
+
handler: injectMonitorMiddleware,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
});
|
|
99
115
|
```
|
|
100
116
|
|
|
101
117
|
## Use Monitors
|
|
@@ -126,32 +142,44 @@ const loader = async ({ context }: LoaderFunctionArgs) => {
|
|
|
126
142
|
When invoking Monitors in components, you need to determine whether the current runtime environment is Node.js:
|
|
127
143
|
|
|
128
144
|
```tsx title="routes/page.tsx"
|
|
129
|
-
import {
|
|
145
|
+
import { use } from 'react';
|
|
146
|
+
import { RuntimeContext, getMonitors } from '@modern-js/runtime';
|
|
130
147
|
const Page = () => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
148
|
+
const context = use(RuntimeContext);
|
|
149
|
+
if (process.env.MODERN_TARGET === 'node') {
|
|
150
|
+
const monitors = getMonitors();
|
|
151
|
+
monitors.info('Page rendered');
|
|
152
|
+
}
|
|
153
|
+
return <div>Hello World</div>;
|
|
154
|
+
};
|
|
138
155
|
export default Page;
|
|
139
156
|
```
|
|
140
157
|
|
|
141
158
|
In middleware, we can also invoke Monitors, but the approach differs from runtime code as it requires accessing them through `context`:
|
|
142
159
|
|
|
143
|
-
```ts title="server/
|
|
144
|
-
import {
|
|
160
|
+
```ts title="server/modern.server.ts"
|
|
161
|
+
import {
|
|
162
|
+
defineServerConfig,
|
|
163
|
+
type MiddlewareHandler,
|
|
164
|
+
} from '@modern-js/server-runtime';
|
|
145
165
|
|
|
146
|
-
const
|
|
166
|
+
export const handler: MiddlewareHandler = async (c, next) => {
|
|
167
|
+
const monitors = c.get('monitors');
|
|
147
168
|
const start = Date.now();
|
|
169
|
+
|
|
148
170
|
await next();
|
|
171
|
+
|
|
149
172
|
const end = Date.now();
|
|
150
|
-
|
|
151
|
-
monitors.
|
|
173
|
+
// Report timing
|
|
174
|
+
monitors.timing('request_timing', end - start);
|
|
152
175
|
};
|
|
153
176
|
|
|
154
|
-
export
|
|
177
|
+
export default defineServerConfig({
|
|
178
|
+
middlewares: [
|
|
179
|
+
{
|
|
180
|
+
name: 'request-timing',
|
|
181
|
+
handler,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
});
|
|
155
185
|
```
|
|
156
|
-
|
|
157
|
-
|