@modern-js/main-doc 0.0.0-next-20221116121040
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +12 -0
- package/CHANGELOG.md +15 -0
- package/LICENSE +144 -0
- package/en/configure/app/dev/asset-prefix.md +13 -0
- package/en/configure/app/dev/hmr.md +13 -0
- package/en/configure/app/dev/https.md +13 -0
- package/en/configure/app/dev/port.md +13 -0
- package/en/configure/app/dev/progress-bar.md +13 -0
- package/en/configure/app/dev/start-url.md +13 -0
- package/en/configure/app/html/app-icon.md +13 -0
- package/en/configure/app/html/crossorigin.md +13 -0
- package/en/configure/app/html/disable-html-folder.md +13 -0
- package/en/configure/app/html/favicon-by-entries.md +13 -0
- package/en/configure/app/html/favicon.md +13 -0
- package/en/configure/app/html/inject-by-entries.md +13 -0
- package/en/configure/app/html/inject.md +13 -0
- package/en/configure/app/html/meta-by-entries.md +13 -0
- package/en/configure/app/html/meta.md +13 -0
- package/en/configure/app/html/mount-id.md +13 -0
- package/en/configure/app/html/template-by-entries.md +13 -0
- package/en/configure/app/html/template-parameters-by-entries.md +13 -0
- package/en/configure/app/html/template-parameters.md +13 -0
- package/en/configure/app/html/template.md +13 -0
- package/en/configure/app/html/title-by-entries.md +13 -0
- package/en/configure/app/html/title.md +13 -0
- package/en/configure/app/output/asset-prefix.md +13 -0
- package/en/configure/app/output/assets-retry.md +13 -0
- package/en/configure/app/output/charset.md +13 -0
- package/en/configure/app/output/clean-dist-path.md +13 -0
- package/en/configure/app/output/convert-to-rem.md +13 -0
- package/en/configure/app/output/copy.md +13 -0
- package/en/configure/app/output/css-module-local-ident-name.md +13 -0
- package/en/configure/app/output/data-uri-limit.md +13 -0
- package/en/configure/app/output/disable-css-module-extension.md +13 -0
- package/en/configure/app/output/disable-filename-hash.md +13 -0
- package/en/configure/app/output/disable-inline-runtime-chunk.md +13 -0
- package/en/configure/app/output/disable-minimize.md +13 -0
- package/en/configure/app/output/disable-source-map.md +13 -0
- package/en/configure/app/output/dist-path.md +13 -0
- package/en/configure/app/output/enable-asset-fallback.md +13 -0
- package/en/configure/app/output/enable-asset-manifest.md +13 -0
- package/en/configure/app/output/enable-css-module-tsdeclaration.md +13 -0
- package/en/configure/app/output/enable-inline-scripts.md +13 -0
- package/en/configure/app/output/enable-inline-styles.md +13 -0
- package/en/configure/app/output/enable-latest-decorators.md +13 -0
- package/en/configure/app/output/externals.md +13 -0
- package/en/configure/app/output/filename.md +13 -0
- package/en/configure/app/output/legal-comments.md +13 -0
- package/en/configure/app/output/override-browserslist.md +13 -0
- package/en/configure/app/output/polyfill.md +13 -0
- package/en/configure/app/output/svg-default-export.md +13 -0
- package/en/configure/app/performance/build-cache.md +13 -0
- package/en/configure/app/performance/bundle-analyze.md +13 -0
- package/en/configure/app/performance/chunk-split.md +13 -0
- package/en/configure/app/performance/print-file-size.md +13 -0
- package/en/configure/app/performance/profile.md +13 -0
- package/en/configure/app/performance/remove-console.md +13 -0
- package/en/configure/app/performance/remove-moment-locale.md +13 -0
- package/en/configure/app/security/sri.md +13 -0
- package/en/configure/app/source/alias.md +13 -0
- package/en/configure/app/source/compile-js-data-uri.md +13 -0
- package/en/configure/app/source/define.md +13 -0
- package/en/configure/app/source/global-vars.md +13 -0
- package/en/configure/app/source/include.md +13 -0
- package/en/configure/app/source/module-scopes.md +13 -0
- package/en/configure/app/source/pre-entry.md +13 -0
- package/en/configure/app/source/resolve-extension-prefix.md +13 -0
- package/en/configure/app/source/resolve-main-fields.md +13 -0
- package/en/configure/app/tools/autoprefixer.md +13 -0
- package/en/configure/app/tools/babel.md +13 -0
- package/en/configure/app/tools/css-extract.md +13 -0
- package/en/configure/app/tools/css-loader.md +13 -0
- package/en/configure/app/tools/dev-server.md +13 -0
- package/en/configure/app/tools/html-plugin.md +13 -0
- package/en/configure/app/tools/inspector.md +13 -0
- package/en/configure/app/tools/less.md +13 -0
- package/en/configure/app/tools/minify-css.md +13 -0
- package/en/configure/app/tools/postcss.md +13 -0
- package/en/configure/app/tools/pug.md +13 -0
- package/en/configure/app/tools/sass.md +13 -0
- package/en/configure/app/tools/style-loader.md +13 -0
- package/en/configure/app/tools/styled-components.md +13 -0
- package/en/configure/app/tools/terser.md +13 -0
- package/en/configure/app/tools/ts-checker.md +13 -0
- package/en/configure/app/tools/ts-loader.md +13 -0
- package/en/configure/app/tools/webpack-chain.md +13 -0
- package/en/configure/app/tools/webpack.md +13 -0
- package/en/tutorials/foundations/_category_.json +5 -0
- package/en/tutorials/foundations/basic.md +8 -0
- package/en/tutorials/foundations/introduction.md +43 -0
- package/package.json +30 -0
- package/scripts/gen-config.ts +60 -0
- package/scripts/sync.ts +36 -0
- package/tsconfig.json +7 -0
- package/zh/apis/app/commands/_category_.json +8 -0
- package/zh/apis/app/commands/build.md +44 -0
- package/zh/apis/app/commands/dev.md +31 -0
- package/zh/apis/app/commands/index.md +12 -0
- package/zh/apis/app/commands/inspect.md +39 -0
- package/zh/apis/app/commands/lint.md +22 -0
- package/zh/apis/app/commands/new.md +59 -0
- package/zh/apis/app/commands/start.md +32 -0
- package/zh/apis/app/commands/test.md +36 -0
- package/zh/apis/app/commands/upgrade.md +23 -0
- package/zh/apis/app/hooks/_category_.json +8 -0
- package/zh/apis/app/hooks/api/_category_.json +4 -0
- package/zh/apis/app/hooks/api/framework/_category_.json +4 -0
- package/zh/apis/app/hooks/api/framework/app.md +100 -0
- package/zh/apis/app/hooks/api/framework/lambda.md +79 -0
- package/zh/apis/app/hooks/api/functions/_category_.json +4 -0
- package/zh/apis/app/hooks/api/functions/api.md +50 -0
- package/zh/apis/app/hooks/api/functions/app.md +10 -0
- package/zh/apis/app/hooks/api/functions/common.md +10 -0
- package/zh/apis/app/hooks/api/test.md +12 -0
- package/zh/apis/app/hooks/config/_category_.json +4 -0
- package/zh/apis/app/hooks/config/html.md +10 -0
- package/zh/apis/app/hooks/config/icon.md +17 -0
- package/zh/apis/app/hooks/config/mock.md +12 -0
- package/zh/apis/app/hooks/config/public.md +30 -0
- package/zh/apis/app/hooks/config/storybook.md +14 -0
- package/zh/apis/app/hooks/config/upload.md +48 -0
- package/zh/apis/app/hooks/index.md +12 -0
- package/zh/apis/app/hooks/modern-config.md +10 -0
- package/zh/apis/app/hooks/server/_category_.json +4 -0
- package/zh/apis/app/hooks/server/index.md +14 -0
- package/zh/apis/app/hooks/server/test.md +12 -0
- package/zh/apis/app/hooks/shared.md +8 -0
- package/zh/apis/app/hooks/src/_category_.json +4 -0
- package/zh/apis/app/hooks/src/app.md +41 -0
- package/zh/apis/app/hooks/src/error.md +10 -0
- package/zh/apis/app/hooks/src/eslint.md +9 -0
- package/zh/apis/app/hooks/src/index.md +35 -0
- package/zh/apis/app/hooks/src/pages.md +183 -0
- package/zh/apis/app/hooks/src/stories.md +14 -0
- package/zh/apis/app/hooks/src/test.md +12 -0
- package/zh/apis/app/overview.md +11 -0
- package/zh/apis/app/runtime/_category_.json +9 -0
- package/zh/apis/app/runtime/app/_category_.json +4 -0
- package/zh/apis/app/runtime/app/bootstrap.md +83 -0
- package/zh/apis/app/runtime/app/create-app.md +47 -0
- package/zh/apis/app/runtime/app/define-config.md +57 -0
- package/zh/apis/app/runtime/app/head.md +43 -0
- package/zh/apis/app/runtime/app/no-ssr.md +41 -0
- package/zh/apis/app/runtime/app/pre-render.md +77 -0
- package/zh/apis/app/runtime/app/use-module-app.md +60 -0
- package/zh/apis/app/runtime/app/use-module-apps.md +64 -0
- package/zh/apis/app/runtime/app/use-runtime-context.md +39 -0
- package/zh/apis/app/runtime/bff-server/_category_.json +4 -0
- package/zh/apis/app/runtime/bff-server/after-lambda-registed.md +35 -0
- package/zh/apis/app/runtime/bff-server/hook.md +120 -0
- package/zh/apis/app/runtime/bff-server/use-context.md +70 -0
- package/zh/apis/app/runtime/container/_category_.json +4 -0
- package/zh/apis/app/runtime/container/router.md +492 -0
- package/zh/apis/app/runtime/container/use-loader.md +64 -0
- package/zh/apis/app/runtime/default-alias.md +26 -0
- package/zh/apis/app/runtime/env.md +68 -0
- package/zh/apis/app/runtime/index.md +12 -0
- package/zh/apis/app/runtime/model/Provider.md +36 -0
- package/zh/apis/app/runtime/model/_category_.json +4 -0
- package/zh/apis/app/runtime/model/auto-actions.md +121 -0
- package/zh/apis/app/runtime/model/connect.md +134 -0
- package/zh/apis/app/runtime/model/create-app.md +74 -0
- package/zh/apis/app/runtime/model/create-store.md +60 -0
- package/zh/apis/app/runtime/model/handle-effect.md +106 -0
- package/zh/apis/app/runtime/model/model_.md +199 -0
- package/zh/apis/app/runtime/model/use-local-model.md +28 -0
- package/zh/apis/app/runtime/model/use-model.md +87 -0
- package/zh/apis/app/runtime/model/use-static-model.md +47 -0
- package/zh/apis/app/runtime/model/use-store.md +48 -0
- package/zh/apis/app/runtime/plugin/_category_.json +4 -0
- package/zh/apis/app/runtime/plugin/abstract.md +26 -0
- package/zh/apis/app/runtime/plugin/hook-api.md +896 -0
- package/zh/apis/app/runtime/plugin/hook.md +170 -0
- package/zh/apis/app/runtime/plugin/plugin-api.md +117 -0
- package/zh/apis/app/runtime/testing/_category_.json +4 -0
- package/zh/apis/app/runtime/testing/act.md +34 -0
- package/zh/apis/app/runtime/testing/cleanup.md +37 -0
- package/zh/apis/app/runtime/testing/render.md +52 -0
- package/zh/apis/app/runtime/testing/renderApp.md +31 -0
- package/zh/apis/app/runtime/utility/_category_.json +4 -0
- package/zh/apis/app/runtime/utility/css-in-js.md +60 -0
- package/zh/apis/app/runtime/utility/loadable/_category_.json +4 -0
- package/zh/apis/app/runtime/utility/loadable/lazy.md +29 -0
- package/zh/apis/app/runtime/utility/loadable/loadable-component.md +61 -0
- package/zh/apis/app/runtime/utility/loadable/loadable-library.md +67 -0
- package/zh/apis/app/runtime/utility/loadable/loadable_.md +110 -0
- package/zh/apis/app/runtime/web-server/_category_.json +4 -0
- package/zh/apis/app/runtime/web-server/hook.md +121 -0
- package/zh/apis/generator/overview.md +32 -0
- package/zh/apis/generator/plugin/_category_.json +4 -0
- package/zh/apis/generator/plugin/file/_category_.json +4 -0
- package/zh/apis/generator/plugin/file/addFile.md +52 -0
- package/zh/apis/generator/plugin/file/addHelper.md +26 -0
- package/zh/apis/generator/plugin/file/addManyFile.md +55 -0
- package/zh/apis/generator/plugin/file/addPartial.md +26 -0
- package/zh/apis/generator/plugin/file/introduce.md +37 -0
- package/zh/apis/generator/plugin/file/rmDir.md +24 -0
- package/zh/apis/generator/plugin/file/rmFile.md +24 -0
- package/zh/apis/generator/plugin/file/updateJSONFile.md +52 -0
- package/zh/apis/generator/plugin/file/updateModernConfig.md +26 -0
- package/zh/apis/generator/plugin/file/updateTextRawFile.md +33 -0
- package/zh/apis/generator/plugin/git/_category_.json +4 -0
- package/zh/apis/generator/plugin/git/gitAddAndCommit.md +20 -0
- package/zh/apis/generator/plugin/git/initGitRepo.md +16 -0
- package/zh/apis/generator/plugin/git/isInGitRepo.md +16 -0
- package/zh/apis/generator/plugin/hook/_category_.json +4 -0
- package/zh/apis/generator/plugin/hook/afterForged.md +35 -0
- package/zh/apis/generator/plugin/hook/onForged.md +35 -0
- package/zh/apis/generator/plugin/info/_category_.json +4 -0
- package/zh/apis/generator/plugin/info/isFileExit.md +22 -0
- package/zh/apis/generator/plugin/info/locale.md +17 -0
- package/zh/apis/generator/plugin/info/readDir.md +22 -0
- package/zh/apis/generator/plugin/input/_category_.json +4 -0
- package/zh/apis/generator/plugin/input/addInputAfter.md +48 -0
- package/zh/apis/generator/plugin/input/addInputBefore.md +48 -0
- package/zh/apis/generator/plugin/input/addOptionAfter.md +45 -0
- package/zh/apis/generator/plugin/input/addOptionBefore.md +45 -0
- package/zh/apis/generator/plugin/input/setInput.md +42 -0
- package/zh/apis/generator/plugin/input/setInputValue.md +28 -0
- package/zh/apis/generator/plugin/input/type.md +101 -0
- package/zh/apis/generator/plugin/introduce.md +93 -0
- package/zh/apis/generator/plugin/new/_category_.json +4 -0
- package/zh/apis/generator/plugin/new/createElement.md +33 -0
- package/zh/apis/generator/plugin/new/createSubProject.md +35 -0
- package/zh/apis/generator/plugin/new/enableFunc.md +46 -0
- package/zh/apis/generator/plugin/new/introduce.md +15 -0
- package/zh/apis/generator/plugin/npm/_category_.json +4 -0
- package/zh/apis/generator/plugin/npm/install.md +16 -0
- package/zh/apis/monorepo/commands/_category_.json +8 -0
- package/zh/apis/monorepo/commands/bump.md +42 -0
- package/zh/apis/monorepo/commands/change.md +58 -0
- package/zh/apis/monorepo/commands/clear.md +27 -0
- package/zh/apis/monorepo/commands/deploy.md +39 -0
- package/zh/apis/monorepo/commands/gen-release-note.md +35 -0
- package/zh/apis/monorepo/commands/index.md +12 -0
- package/zh/apis/monorepo/commands/lint.md +21 -0
- package/zh/apis/monorepo/commands/new.md +41 -0
- package/zh/apis/monorepo/commands/pre.md +68 -0
- package/zh/apis/monorepo/commands/release.md +20 -0
- package/zh/apis/monorepo/commands/upgrade.md +23 -0
- package/zh/apis/monorepo/hooks/_category_.json +8 -0
- package/zh/apis/monorepo/hooks/apps.md +12 -0
- package/zh/apis/monorepo/hooks/code-workspace.md +10 -0
- package/zh/apis/monorepo/hooks/examples.md +14 -0
- package/zh/apis/monorepo/hooks/features.md +14 -0
- package/zh/apis/monorepo/hooks/index.md +12 -0
- package/zh/apis/monorepo/hooks/packages.md +14 -0
- package/zh/apis/monorepo/hooks/pnpm-workspace.md +10 -0
- package/zh/apis/monorepo/hooks/pnpmfile.md +10 -0
- package/zh/apis/monorepo/overview.md +11 -0
- package/zh/community/index.md +3 -0
- package/zh/components/command-tip.md +57 -0
- package/zh/components/deploy.md +60 -0
- package/zh/components/dev-ide.md +1 -0
- package/zh/components/entry-name.md +15 -0
- package/zh/components/env-prepare.md +1 -0
- package/zh/components/launch-bff-choices.md +6 -0
- package/zh/components/reduck-tip.md +5 -0
- package/zh/configure/app/bff/_category_.json +4 -0
- package/zh/configure/app/bff/fetcher.md +32 -0
- package/zh/configure/app/bff/prefix.md +38 -0
- package/zh/configure/app/bff/proxy.md +76 -0
- package/zh/configure/app/dev/_category_.json +4 -0
- package/zh/configure/app/dev/asset-prefix.md +13 -0
- package/zh/configure/app/dev/hmr.md +13 -0
- package/zh/configure/app/dev/https.md +13 -0
- package/zh/configure/app/dev/port.md +13 -0
- package/zh/configure/app/dev/progress-bar.md +13 -0
- package/zh/configure/app/dev/proxy.md +79 -0
- package/zh/configure/app/dev/start-url.md +13 -0
- package/zh/configure/app/dev/with-master-app.md +35 -0
- package/zh/configure/app/html/app-icon.md +13 -0
- package/zh/configure/app/html/crossorigin.md +13 -0
- package/zh/configure/app/html/disable-html-folder.md +13 -0
- package/zh/configure/app/html/favicon-by-entries.md +13 -0
- package/zh/configure/app/html/favicon.md +13 -0
- package/zh/configure/app/html/inject-by-entries.md +13 -0
- package/zh/configure/app/html/inject.md +13 -0
- package/zh/configure/app/html/meta-by-entries.md +13 -0
- package/zh/configure/app/html/meta.md +13 -0
- package/zh/configure/app/html/mount-id.md +13 -0
- package/zh/configure/app/html/template-by-entries.md +13 -0
- package/zh/configure/app/html/template-parameters-by-entries.md +13 -0
- package/zh/configure/app/html/template-parameters.md +13 -0
- package/zh/configure/app/html/template.md +13 -0
- package/zh/configure/app/html/title-by-entries.md +13 -0
- package/zh/configure/app/html/title.md +13 -0
- package/zh/configure/app/output/_category_.json +4 -0
- package/zh/configure/app/output/asset-prefix.md +13 -0
- package/zh/configure/app/output/assets-retry.md +13 -0
- package/zh/configure/app/output/charset.md +13 -0
- package/zh/configure/app/output/clean-dist-path.md +13 -0
- package/zh/configure/app/output/convert-to-rem.md +13 -0
- package/zh/configure/app/output/copy.md +13 -0
- package/zh/configure/app/output/css-module-local-ident-name.md +13 -0
- package/zh/configure/app/output/data-uri-limit.md +13 -0
- package/zh/configure/app/output/disable-css-module-extension.md +13 -0
- package/zh/configure/app/output/disable-filename-hash.md +13 -0
- package/zh/configure/app/output/disable-inline-runtime-chunk.md +13 -0
- package/zh/configure/app/output/disable-minimize.md +13 -0
- package/zh/configure/app/output/disable-node-polyfill.md +24 -0
- package/zh/configure/app/output/disable-source-map.md +13 -0
- package/zh/configure/app/output/dist-path.md +13 -0
- package/zh/configure/app/output/enable-asset-fallback.md +13 -0
- package/zh/configure/app/output/enable-asset-manifest.md +13 -0
- package/zh/configure/app/output/enable-css-module-tsdeclaration.md +13 -0
- package/zh/configure/app/output/enable-inline-scripts.md +13 -0
- package/zh/configure/app/output/enable-inline-styles.md +13 -0
- package/zh/configure/app/output/enable-latest-decorators.md +13 -0
- package/zh/configure/app/output/enable-modern-mode.md +26 -0
- package/zh/configure/app/output/externals.md +13 -0
- package/zh/configure/app/output/filename.md +13 -0
- package/zh/configure/app/output/legal-comments.md +13 -0
- package/zh/configure/app/output/override-browserslist.md +13 -0
- package/zh/configure/app/output/polyfill.md +13 -0
- package/zh/configure/app/output/ssg.md +226 -0
- package/zh/configure/app/output/svg-default-export.md +13 -0
- package/zh/configure/app/performance/build-cache.md +13 -0
- package/zh/configure/app/performance/bundle-analyze.md +13 -0
- package/zh/configure/app/performance/chunk-split.md +13 -0
- package/zh/configure/app/performance/print-file-size.md +13 -0
- package/zh/configure/app/performance/profile.md +13 -0
- package/zh/configure/app/performance/remove-console.md +13 -0
- package/zh/configure/app/performance/remove-moment-locale.md +13 -0
- package/zh/configure/app/plugins.md +74 -0
- package/zh/configure/app/runtime/_category_.json +4 -0
- package/zh/configure/app/runtime/master-app.md +72 -0
- package/zh/configure/app/runtime/router.md +54 -0
- package/zh/configure/app/runtime/state.md +45 -0
- package/zh/configure/app/security/sri.md +13 -0
- package/zh/configure/app/server/_category_.json +4 -0
- package/zh/configure/app/server/base-url.md +36 -0
- package/zh/configure/app/server/port.md +21 -0
- package/zh/configure/app/server/public-routes.md +29 -0
- package/zh/configure/app/server/routes.md +92 -0
- package/zh/configure/app/server/ssr-by-entries.md +32 -0
- package/zh/configure/app/server/ssr.md +24 -0
- package/zh/configure/app/source/_category_.json +4 -0
- package/zh/configure/app/source/alias.md +13 -0
- package/zh/configure/app/source/compile-js-data-uri.md +13 -0
- package/zh/configure/app/source/config-dir.md +15 -0
- package/zh/configure/app/source/define.md +13 -0
- package/zh/configure/app/source/design-system.md +1156 -0
- package/zh/configure/app/source/disable-default-entries.md +23 -0
- package/zh/configure/app/source/enable-async-entry.md +53 -0
- package/zh/configure/app/source/entries-dir.md +42 -0
- package/zh/configure/app/source/entries.md +55 -0
- package/zh/configure/app/source/global-vars.md +13 -0
- package/zh/configure/app/source/include.md +13 -0
- package/zh/configure/app/source/module-scopes.md +13 -0
- package/zh/configure/app/source/pre-entry.md +13 -0
- package/zh/configure/app/source/resolve-extension-prefix.md +13 -0
- package/zh/configure/app/source/resolve-main-fields.md +13 -0
- package/zh/configure/app/testing/_category_.json +4 -0
- package/zh/configure/app/testing/transformer.md +17 -0
- package/zh/configure/app/tools/_category_.json +4 -0
- package/zh/configure/app/tools/autoprefixer.md +13 -0
- package/zh/configure/app/tools/babel.md +13 -0
- package/zh/configure/app/tools/css-extract.md +13 -0
- package/zh/configure/app/tools/css-loader.md +13 -0
- package/zh/configure/app/tools/dev-server.md +13 -0
- package/zh/configure/app/tools/esbuild.md +61 -0
- package/zh/configure/app/tools/html-plugin.md +13 -0
- package/zh/configure/app/tools/inspector.md +13 -0
- package/zh/configure/app/tools/jest.md +41 -0
- package/zh/configure/app/tools/less.md +13 -0
- package/zh/configure/app/tools/minify-css.md +13 -0
- package/zh/configure/app/tools/postcss.md +13 -0
- package/zh/configure/app/tools/pug.md +13 -0
- package/zh/configure/app/tools/sass.md +13 -0
- package/zh/configure/app/tools/style-loader.md +13 -0
- package/zh/configure/app/tools/styled-components.md +13 -0
- package/zh/configure/app/tools/tailwindcss.md +48 -0
- package/zh/configure/app/tools/terser.md +13 -0
- package/zh/configure/app/tools/ts-checker.md +13 -0
- package/zh/configure/app/tools/ts-loader.md +13 -0
- package/zh/configure/app/tools/webpack-chain.md +13 -0
- package/zh/configure/app/tools/webpack.md +13 -0
- package/zh/configure/app/usage.md +81 -0
- package/zh/configure/generator/introduce.md +113 -0
- package/zh/configure/generator/module.md +43 -0
- package/zh/configure/generator/monorepo.md +28 -0
- package/zh/configure/generator/mwa.md +127 -0
- package/zh/guides/advanced-features/_category_.json +9 -0
- package/zh/guides/advanced-features/bff/_category_.json +4 -0
- package/zh/guides/advanced-features/bff/bff-proxy.md +25 -0
- package/zh/guides/advanced-features/bff/bff-server.md +142 -0
- package/zh/guides/advanced-features/bff/frameworks.md +348 -0
- package/zh/guides/advanced-features/bff/function.md +236 -0
- package/zh/guides/advanced-features/code-split.md +68 -0
- package/zh/guides/advanced-features/compatibility.md +89 -0
- package/zh/guides/advanced-features/custom-app.md +4 -0
- package/zh/guides/advanced-features/eslint.md +146 -0
- package/zh/guides/advanced-features/index.md +12 -0
- package/zh/guides/advanced-features/low-level.md +44 -0
- package/zh/guides/advanced-features/ssg.md +151 -0
- package/zh/guides/advanced-features/ssr.md +186 -0
- package/zh/guides/advanced-features/testing.md +4 -0
- package/zh/guides/advanced-features/typescript.md +4 -0
- package/zh/guides/advanced-features/web-server.md +135 -0
- package/zh/guides/basic-features/_category_.json +9 -0
- package/zh/guides/basic-features/alias.md +67 -0
- package/zh/guides/basic-features/css/_category_.json +4 -0
- package/zh/guides/basic-features/css/css-in-js.md +38 -0
- package/zh/guides/basic-features/css/css-modules.md +86 -0
- package/zh/guides/basic-features/css/less-sass.md +29 -0
- package/zh/guides/basic-features/css/postcss.md +81 -0
- package/zh/guides/basic-features/css/tailwindcss.md +98 -0
- package/zh/guides/basic-features/data-fetch.md +4 -0
- package/zh/guides/basic-features/env-vars.md +83 -0
- package/zh/guides/basic-features/html.md +128 -0
- package/zh/guides/basic-features/image.md +43 -0
- package/zh/guides/basic-features/index.md +12 -0
- package/zh/guides/basic-features/mock.md +85 -0
- package/zh/guides/basic-features/proxy.md +85 -0
- package/zh/guides/basic-features/routes.md +4 -0
- package/zh/guides/concept/_category_.json +5 -0
- package/zh/guides/concept/entries.md +4 -0
- package/zh/guides/concept/integrated.md +4 -0
- package/zh/guides/concept/lifecycle.md +4 -0
- package/zh/guides/concept/solutions.md +4 -0
- package/zh/guides/get-started/_category_.json +5 -0
- package/zh/guides/get-started/quick-start.md +4 -0
- package/zh/guides/get-started/upgrade.md +4 -0
- package/zh/guides/overview.md +11 -0
- package/zh/guides/topic-detail/_category_.json +5 -0
- package/zh/guides/topic-detail/changesets/_category_.json +4 -0
- package/zh/guides/topic-detail/changesets/add.md +125 -0
- package/zh/guides/topic-detail/changesets/changelog.md +239 -0
- package/zh/guides/topic-detail/changesets/commit.md +272 -0
- package/zh/guides/topic-detail/changesets/config.md +146 -0
- package/zh/guides/topic-detail/changesets/github.md +168 -0
- package/zh/guides/topic-detail/changesets/introduce.md +57 -0
- package/zh/guides/topic-detail/changesets/release-note.md +262 -0
- package/zh/guides/topic-detail/changesets/release-pre.md +49 -0
- package/zh/guides/topic-detail/changesets/release.md +228 -0
- package/zh/guides/topic-detail/compile-speed.md +182 -0
- package/zh/guides/topic-detail/framework-plugin/_category_.json +4 -0
- package/zh/guides/topic-detail/framework-plugin/abstract.md +27 -0
- package/zh/guides/topic-detail/framework-plugin/extend.md +163 -0
- package/zh/guides/topic-detail/framework-plugin/implement.md +188 -0
- package/zh/guides/topic-detail/framework-plugin/relationship.md +119 -0
- package/zh/guides/topic-detail/generator-plugin/_category_.json +4 -0
- package/zh/guides/topic-detail/generator-plugin/abstract.md +23 -0
- package/zh/guides/topic-detail/generator-plugin/develop.md +120 -0
- package/zh/guides/topic-detail/generator-plugin/use.md +61 -0
- package/zh/guides/topic-detail/micro-frontend/_category_.json +4 -0
- package/zh/guides/topic-detail/micro-frontend/communicate.md +39 -0
- package/zh/guides/topic-detail/micro-frontend/debugging.md +168 -0
- package/zh/guides/topic-detail/micro-frontend/introduction.md +13 -0
- package/zh/guides/topic-detail/micro-frontend/mixed-stack.md +24 -0
- package/zh/guides/topic-detail/micro-frontend/route-mode.md +110 -0
- package/zh/guides/topic-detail/model/_category_.json +4 -0
- package/zh/guides/topic-detail/model/auto-actions.md +90 -0
- package/zh/guides/topic-detail/model/computed-state.md +151 -0
- package/zh/guides/topic-detail/model/define-model.md +66 -0
- package/zh/guides/topic-detail/model/faq.md +43 -0
- package/zh/guides/topic-detail/model/manage-effects.md +259 -0
- package/zh/guides/topic-detail/model/model-communicate.md +219 -0
- package/zh/guides/topic-detail/model/performance.md +173 -0
- package/zh/guides/topic-detail/model/quick-start.md +112 -0
- package/zh/guides/topic-detail/model/redux-integration.md +21 -0
- package/zh/guides/topic-detail/model/test-model.md +43 -0
- package/zh/guides/topic-detail/model/typescript-best-practice.md +71 -0
- package/zh/guides/topic-detail/model/use-model.md +244 -0
- package/zh/guides/topic-detail/model/use-out-of-modernjs.md +51 -0
- package/zh/guides/topic-detail/monorepo/_category_.json +4 -0
- package/zh/guides/topic-detail/monorepo/create-sub-project.md +64 -0
- package/zh/guides/topic-detail/monorepo/deploy.md +43 -0
- package/zh/guides/topic-detail/monorepo/intro.md +15 -0
- package/zh/guides/topic-detail/monorepo/publish.md +68 -0
- package/zh/guides/topic-detail/monorepo/sub-project-interface.md +170 -0
- package/zh/guides/troubleshooting/_category_.json +5 -0
- package/zh/guides/troubleshooting/compile.md +379 -0
- package/zh/guides/troubleshooting/dependencies.md +168 -0
- package/zh/tutorials/first-app/_category_.json +5 -0
- package/zh/tutorials/first-app/c01-getting-started/1.1-prerequisites.md +25 -0
- package/zh/tutorials/first-app/c01-getting-started/1.2-minimal-mwa.md +118 -0
- package/zh/tutorials/first-app/c01-getting-started/1.3-dev-command.md +29 -0
- package/zh/tutorials/first-app/c01-getting-started/1.4-enable-ssr.md +44 -0
- package/zh/tutorials/first-app/c01-getting-started/1.5-start-command.md +18 -0
- package/zh/tutorials/first-app/c01-getting-started/1.6-create-repo.md +31 -0
- package/zh/tutorials/first-app/c01-getting-started/_category_.json +3 -0
- package/zh/tutorials/first-app/c02-generator-and-studio/2.1-generator.md +87 -0
- package/zh/tutorials/first-app/c02-generator-and-studio/2.2-boilerplates.md +28 -0
- package/zh/tutorials/first-app/c02-generator-and-studio/2.3-configuration.md +21 -0
- package/zh/tutorials/first-app/c02-generator-and-studio/_category_.json +3 -0
- package/zh/tutorials/first-app/c03-ide/3.1-setting-up.md +55 -0
- package/zh/tutorials/first-app/c03-ide/3.2-hints-in-ide.md +66 -0
- package/zh/tutorials/first-app/c03-ide/3.3-autofix-in-ide.md +11 -0
- package/zh/tutorials/first-app/c03-ide/3.4-autofix-in-cli.md +63 -0
- package/zh/tutorials/first-app/c03-ide/_category_.json +3 -0
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.1-use-es6-plus.md +67 -0
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.2-use-typescript.md +111 -0
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/4.3-compatibility.md +67 -0
- package/zh/tutorials/first-app/c04-es6-plus-and-ts/_category_.json +3 -0
- package/zh/tutorials/first-app/c05-component/5.1-use-ui-library.md +68 -0
- package/zh/tutorials/first-app/c05-component/5.2-use-standalone-component.md +92 -0
- package/zh/tutorials/first-app/c05-component/_category_.json +3 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.1-css-in-js.md +110 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.2-utility-class.md +148 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.3-postcss.md +84 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.4-design-system.md +83 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.5-storybook.md +77 -0
- package/zh/tutorials/first-app/c06-css-and-component/6.6-testing.md +113 -0
- package/zh/tutorials/first-app/c06-css-and-component/_category_.json +3 -0
- package/zh/tutorials/first-app/c07-app-entry/7.1-intro.md +64 -0
- package/zh/tutorials/first-app/c07-app-entry/7.2-add-entry-in-cli.md +104 -0
- package/zh/tutorials/first-app/c07-app-entry/7.3-manage-entries-by-hand.md +74 -0
- package/zh/tutorials/first-app/c07-app-entry/_category_.json +3 -0
- package/zh/tutorials/first-app/c08-client-side-routing/8.1-code-based-routing.md +153 -0
- package/zh/tutorials/first-app/c08-client-side-routing/8.2-file-based-routing.md +318 -0
- package/zh/tutorials/first-app/c08-client-side-routing/_category_.json +3 -0
- package/zh/tutorials/first-app/c09-bff/9.1-serverless.md +30 -0
- package/zh/tutorials/first-app/c09-bff/9.2-enable-bff.md +93 -0
- package/zh/tutorials/first-app/c09-bff/9.3-fetch-bff.md +205 -0
- package/zh/tutorials/first-app/c09-bff/_category_.json +3 -0
- package/zh/tutorials/first-app/c10-model/10.1-application-architecture.md +23 -0
- package/zh/tutorials/first-app/c10-model/10.2-add-model.md +185 -0
- package/zh/tutorials/first-app/c10-model/10.3-use-model.md +54 -0
- package/zh/tutorials/first-app/c10-model/10.4-testing.md +69 -0
- package/zh/tutorials/first-app/c10-model/_category_.json +3 -0
- package/zh/tutorials/first-app/c11-container/11.1-use-model-with-app-state.md +274 -0
- package/zh/tutorials/first-app/c11-container/11.2-add-container.md +106 -0
- package/zh/tutorials/first-app/c11-container/11.3-use-loader.md +61 -0
- package/zh/tutorials/first-app/c11-container/11.4-testing.md +56 -0
- package/zh/tutorials/first-app/c11-container/_category_.json +3 -0
- package/zh/tutorials/first-app/overview.md +11 -0
- package/zh/tutorials/foundations/_category_.json +5 -0
- package/zh/tutorials/foundations/basic.md +8 -0
- package/zh/tutorials/foundations/introduction.md +41 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 1
|
3
|
+
title: 快速上手
|
4
|
+
---
|
5
|
+
|
6
|
+
[Reduck](https://github.com/modern-js-dev/reduck) 是 Modern.js 团队开发的遵循 MVC 模式的状态管理库,底层状态存储基于 [Redux](https://redux.js.org/) 实现,同时提供更高层级的抽象,并完全兼容 Redux 生态。
|
7
|
+
|
8
|
+
Reduck 的目标是以 MVC 模式组织 React 应用开发结构,将业务逻辑维护在 Model 层,业务逻辑与 UI 解耦,让开发业务逻辑更集中、更简单,同时通过更高层级的抽象,减少重复工作(样板代码)。
|
9
|
+
|
10
|
+
Reduck 在 MVC 模式中,扮演 M(Model) 的角色,React UI Component 对应 V(View),从 Reduck 中获取 Model 并修改 Model 的 React Container Component 对应 C(View Controller/Container)。
|
11
|
+
|
12
|
+
Modern.js 的状态管理解决方案,是通过内置 Reduck 实现的。在 Modern.js 中使用 Reduck,不仅免去了手动集成的环节,而且所有 Reduck API 都可以从 Modern.js 的 Runtime 包中直接导入使用,具有更好的一致性体验。
|
13
|
+
|
14
|
+
:::info 注
|
15
|
+
1. Modern.js 中使用 Reduck API,需要设置 [runtime.state](/docs/configure/app/runtime/state) 以开启状态管理功能(默认创建的项目已开启)。
|
16
|
+
2. Reduck 也可以脱离 Modern.js 作为状态管理库[单独使用](/docs/guides/topic-detail/model/use-out-of-modernjs)。
|
17
|
+
:::
|
18
|
+
|
19
|
+
|
20
|
+
## 核心概念
|
21
|
+
|
22
|
+
Reduck 中的核心概念只有 4 个: Model、State、Actions、Effects。
|
23
|
+
|
24
|
+
Model: 对独立模块的逻辑和所需状态的封装,由 State、Actions、Effects 组成。
|
25
|
+
|
26
|
+
State: Model 中保存的状态。
|
27
|
+
|
28
|
+
Actions: 用于修改 State 的纯函数,函数必须是**同步**的。
|
29
|
+
|
30
|
+
Effects: 用于修改 State 的带有副作用的函数,函数可以是**异步**的。Effects 中可以调用自身或其他 Model 的 Actions 和 Effects。
|
31
|
+
|
32
|
+
Reduck 数据流如下图所示:
|
33
|
+
|
34
|
+

|
35
|
+
|
36
|
+
## 基本用法
|
37
|
+
|
38
|
+
下来我们以一个简单的 **计数器** 应用为例,演示 Reduck 的基本用法。
|
39
|
+
|
40
|
+
首先,我们定义一个名为 `count` 的 Model:
|
41
|
+
|
42
|
+
```js
|
43
|
+
import { model } from '@modern-js/runtime/model';
|
44
|
+
|
45
|
+
const countModel = model('count').define({
|
46
|
+
state: {
|
47
|
+
value: 1,
|
48
|
+
},
|
49
|
+
});
|
50
|
+
|
51
|
+
export default countModel;
|
52
|
+
```
|
53
|
+
|
54
|
+
我们使用 API `model` 创建 `countModel`,`countModel` 当前只包含存储计数器值的状态,即代码中的 `value`。
|
55
|
+
|
56
|
+
我们定义一个 action,用于计算器自增加 1:
|
57
|
+
|
58
|
+
```js
|
59
|
+
import { model } from '@modern-js/runtime/model';
|
60
|
+
|
61
|
+
const countModel = model('count').define({
|
62
|
+
state: {
|
63
|
+
value: 1,
|
64
|
+
},
|
65
|
+
actions: {
|
66
|
+
add(state) {
|
67
|
+
state.value += 1;
|
68
|
+
},
|
69
|
+
},
|
70
|
+
});
|
71
|
+
|
72
|
+
export default countModel;
|
73
|
+
```
|
74
|
+
|
75
|
+
在 `add` action 中,我们可以直接修改 state 的值,进行加 1 操作,而不需要把 state 作为不可变对象进行操作,这是因为 Reduck 集成了 [immer](https://github.com/immerjs/immer),可以直接修改原 state 对象。
|
76
|
+
|
77
|
+
|
78
|
+
接下来,我们演示如何在组件中使用 Model。
|
79
|
+
|
80
|
+
新建一个组件 Counter,在组件内通过 `useModel` API 使用 countModel:
|
81
|
+
|
82
|
+
```js
|
83
|
+
import { useModel } from '@modern-js/runtime/model';
|
84
|
+
import countModel from './models/count';
|
85
|
+
|
86
|
+
function Counter() {
|
87
|
+
const [state, actions] = useModel(countModel);
|
88
|
+
|
89
|
+
return (
|
90
|
+
<div>
|
91
|
+
<div>counter: {state.value}</div>
|
92
|
+
<button onClick={() => actions.add()}>add</button>
|
93
|
+
</div>
|
94
|
+
);
|
95
|
+
}
|
96
|
+
```
|
97
|
+
|
98
|
+
`useModel` 获取 `countModel` 的 `state` 和 `actions`,组件展示当前计算器的值,点击 `add` 按钮,计数器自增 1。
|
99
|
+
|
100
|
+
:::info 注
|
101
|
+
由于使用的案例比较简单,这里并没有严格按照 MVC 模式进行分层,组件 `Counter` 同时起到了 V 和 C 两层的作用。
|
102
|
+
:::
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
最终演示效果如下:
|
107
|
+
|
108
|
+

|
109
|
+
|
110
|
+
|
111
|
+
这样,我们就完了一个简单的计数器应用。本节完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model)查看。
|
112
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 11
|
3
|
+
title: Redux 生态集成
|
4
|
+
---
|
5
|
+
|
6
|
+
Reduck 基于 Redux 实现,因此可以使用 Redux [生态的库](https://redux.js.org/introduction/ecosystem),实现功能增强。通过 [`Provider`](/docs/apis/app/runtime/model/Provider) 、[`createApp`](/docs/apis/app/runtime/model/create-app) 和 [`createStore`](/docs/apis/app/runtime/model/create-store) 等 API ,可以设置使用 Redux 的 [中间件](https://redux.js.org/understanding/thinking-in-redux/glossary#middleware) 和 [Store Enhancer](https://redux.js.org/understanding/thinking-in-redux/glossary#store-enhancer);使用 [`createStore`](/docs/apis/app/runtime/model/create-store) 还可以完全掌控 Store 的创建过程。
|
7
|
+
|
8
|
+
例如,我们希望使用中间件 [`redux-logger`](https://github.com/LogRocket/redux-logger),示例代码如下:
|
9
|
+
|
10
|
+
```ts
|
11
|
+
ReactDOM.render(
|
12
|
+
<Provider config={{ middlewares: [logger] }}> // 通过 Provider 的 config 参数设置 中间件
|
13
|
+
<App />
|
14
|
+
</Provider>,
|
15
|
+
document.getElementById('root')
|
16
|
+
);
|
17
|
+
```
|
18
|
+
|
19
|
+
:::caution
|
20
|
+
Reduck 基于 Redux 底层 API 做了上层封装,屏蔽了 Redux 的一些底层概念,如 Reducer 等。Reduck 对于 Model 是动态挂载的,而 Redux 是在 Store 创建时就会挂载应用所需的全部状态。基于这些实现上的差异,有些 Redux 生态的库是无法直接在 Reduck 中使用的。
|
21
|
+
:::
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 9
|
3
|
+
title: 测试 Model
|
4
|
+
---
|
5
|
+
|
6
|
+
好的测试对代码的稳健性至关重要。下面以 [快速上手](/docs/guides/topic-detail/model/quick-start) 的 `countModel` 为例,演示在 Modern.js 中,如何对 Model 进行单元测试。
|
7
|
+
|
8
|
+
使用测试功能,需要先开启该功能。在项目根目录下,执行 `pnpm run new`,进行如下选择:
|
9
|
+
|
10
|
+
```bash
|
11
|
+
? 请选择你想要的操作: 启用可选功能
|
12
|
+
? 启用可选功能: 启用「单元测试 / 集成测试」功能
|
13
|
+
```
|
14
|
+
|
15
|
+
即可开启测试功能支持。
|
16
|
+
|
17
|
+
新增 `count.test.ts` 文件,代码如下:
|
18
|
+
|
19
|
+
```ts
|
20
|
+
import { createStore } from '@modern-js/runtime/testing';
|
21
|
+
import countModel from './count';
|
22
|
+
|
23
|
+
describe('test model', () => {
|
24
|
+
it('count value should plus one after add', () => {
|
25
|
+
const store = createStore();
|
26
|
+
const [state, { add }] = store.use(countModel);
|
27
|
+
|
28
|
+
expect(state).toEqual({ value: 1 });
|
29
|
+
|
30
|
+
add();
|
31
|
+
|
32
|
+
expect(store.use(countModel)[0]).toEqual({ value: 2 });
|
33
|
+
});
|
34
|
+
});
|
35
|
+
```
|
36
|
+
:::info 注
|
37
|
+
这里使用的 [`createStore`](/docs/apis/app/runtime/model/create-store) 是从 `@modern-js/runtime/testing` 导入的,内部会使用 [`runtime.state`](/docs/configure/app/runtime/state) 的配置去创建 `store`。
|
38
|
+
:::
|
39
|
+
|
40
|
+
在测试用例里,我们新建一个 `store` 来挂载 `countModel`,通过 `store.use` 获取 `countModel` 的 State 和 Actions。然后调用 `add` Action 更新状态,并断言更新后的状态值。
|
41
|
+
|
42
|
+
执行 `pnpm run test` 命令,触发测试用例的执行。
|
43
|
+
|
@@ -0,0 +1,71 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 10
|
3
|
+
title: TS 最佳实践
|
4
|
+
---
|
5
|
+
|
6
|
+
Reduck 对 TS 提供了良好的支持,大部分使用场景下,无需任何额外工作,就可以直接获得 API 的 TS 类型提示。本节,将对其他的一些使用场景,做补充介绍。
|
7
|
+
|
8
|
+
## 定义 Model 的 State 类型
|
9
|
+
|
10
|
+
为 Model 的 State 声明类型信息,是在 TS 中使用 Reduck 的最佳实践。
|
11
|
+
|
12
|
+
```ts title="示例"
|
13
|
+
interface State {
|
14
|
+
data: string
|
15
|
+
}
|
16
|
+
|
17
|
+
export const foo = model<State>('foo').define({
|
18
|
+
state: {
|
19
|
+
data: ''
|
20
|
+
},
|
21
|
+
computed: {
|
22
|
+
withSuffix: (state) => state.data + 'suffix'
|
23
|
+
},
|
24
|
+
actions: {
|
25
|
+
setData: (state, payload:string) => {
|
26
|
+
state.data = payload
|
27
|
+
}
|
28
|
+
}
|
29
|
+
})
|
30
|
+
```
|
31
|
+
|
32
|
+
当为 Model 的 State 声明类型信息后,Model 的 `computed`、`actions` 都能获取正确的类型信息。事实上,上面的示例代码中,即使我们不定义 State 类型信息,也会根据 `state` 的初始值信息自动推导出 State 的类型信息。不过,仍然建议你在定义 Model 时,声明 State 的类型信息,因为根据 `state` 的初始值信息推导出的 State 类型信息可能不完整(缺少字段或字段的类型信息缺少),而且当使用[函数类型](/docs/apis/app/runtime/model/model_#函数类型)定义 Model 时,State 的类型信息也是无法根据 `state` 的初始值信息自动推导的。
|
33
|
+
|
34
|
+
## 衍生状态的依赖类型
|
35
|
+
|
36
|
+
当 Model 的衍生状态依赖其他 Model 时,需要手动指定其他 Model 的 State。
|
37
|
+
|
38
|
+
|
39
|
+
```ts title="示例"
|
40
|
+
interface State {
|
41
|
+
data: string
|
42
|
+
}
|
43
|
+
|
44
|
+
export const bar = model<State>('bar').define({
|
45
|
+
state: {
|
46
|
+
data: ''
|
47
|
+
},
|
48
|
+
computed: {
|
49
|
+
// 为 fooState 指定类型
|
50
|
+
withFoo: [foo, (state, fooState: FooState) => state.data + fooState.data]
|
51
|
+
},
|
52
|
+
})
|
53
|
+
```
|
54
|
+
|
55
|
+
## 获取 Model 类型信息的 Hooks
|
56
|
+
|
57
|
+
Reduck 提供了一组用于获取 Model 类型信息的工具类型:
|
58
|
+
|
59
|
+
- `GetModelState`: 获取 Model 的 State(包含衍生状态)类型信息。
|
60
|
+
- `GetModelActions`:获取 Model 的 Actions(包含 Effects 函数)类型信息。
|
61
|
+
|
62
|
+
```ts title="示例"
|
63
|
+
export const foo = model<State2>('foo').define({
|
64
|
+
// 省略
|
65
|
+
})
|
66
|
+
|
67
|
+
// 获取 foo 的 State 类型
|
68
|
+
let fooActions: GetModelActions<typeof foo>;
|
69
|
+
// 获取 foo 的 Actions 类型
|
70
|
+
let fooState: GetModelState<typeof foo>;
|
71
|
+
```
|
@@ -0,0 +1,244 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 3
|
3
|
+
title: 使用 Model
|
4
|
+
---
|
5
|
+
|
6
|
+
## 在组件内使用
|
7
|
+
### 作为全局状态使用
|
8
|
+
|
9
|
+
通过 `useModel` 可以获取 Model 的 State、Actions 等。当 Model 的 State 通过 Actions 进行修改后,任何其他使用了该 Model 的组件,都会自动重新渲染。
|
10
|
+
|
11
|
+
在 [快速上手](/docs/guides/topic-detail/model/quick-start) 的计数器案例中,我们已经演示了 `useModel` 的使用,不再重复。
|
12
|
+
|
13
|
+
`useModel` 支持传入多个 Model,多个 Model 的 State 和 Actions 会进行合并后作为返回结果。例如:
|
14
|
+
|
15
|
+
```ts
|
16
|
+
const fooModel = model('foo').define({
|
17
|
+
state: {
|
18
|
+
value: 1,
|
19
|
+
},
|
20
|
+
actions: {
|
21
|
+
add(state) {
|
22
|
+
state += 1;
|
23
|
+
},
|
24
|
+
},
|
25
|
+
});
|
26
|
+
|
27
|
+
const barModel = model('bar').define({
|
28
|
+
state: {
|
29
|
+
title: 'bar',
|
30
|
+
},
|
31
|
+
actions: {
|
32
|
+
set(state, payload) {
|
33
|
+
state.title = payload;
|
34
|
+
},
|
35
|
+
},
|
36
|
+
});
|
37
|
+
|
38
|
+
const [state, actions] = useModel([fooModel, barModel]);
|
39
|
+
// 或
|
40
|
+
const [state, actions] = useModel(fooModel, barModel);
|
41
|
+
```
|
42
|
+
|
43
|
+
`state` 和 `actions` 的值分别为:
|
44
|
+
|
45
|
+
```ts
|
46
|
+
state = {
|
47
|
+
value: 1,
|
48
|
+
title: 'bar',
|
49
|
+
};
|
50
|
+
|
51
|
+
actions = {
|
52
|
+
add(state) {
|
53
|
+
state += 1;
|
54
|
+
},
|
55
|
+
set(state, payload) {
|
56
|
+
state.title = payload;
|
57
|
+
},
|
58
|
+
};
|
59
|
+
```
|
60
|
+
|
61
|
+
`useModel` 还支持对 State 和 Actions 做 selector 操作,实现对 State 和 Actions 的筛选或重命名,例如:
|
62
|
+
|
63
|
+
|
64
|
+
```ts
|
65
|
+
const fooModel = model('foo').define({
|
66
|
+
state: {
|
67
|
+
value: 1,
|
68
|
+
},
|
69
|
+
actions: {
|
70
|
+
add(state) {
|
71
|
+
state += 1;
|
72
|
+
},
|
73
|
+
},
|
74
|
+
});
|
75
|
+
|
76
|
+
const barModel = model('bar').define({
|
77
|
+
state: {
|
78
|
+
value: 'bar',
|
79
|
+
},
|
80
|
+
actions: {
|
81
|
+
set(state, payload) {
|
82
|
+
state.value = payload;
|
83
|
+
},
|
84
|
+
},
|
85
|
+
});
|
86
|
+
|
87
|
+
const [state, actions] = useModel(
|
88
|
+
[fooModel, barModel],
|
89
|
+
(fooState, barState) => ({
|
90
|
+
fooValue: fooState.value,
|
91
|
+
barValue: barState.value,
|
92
|
+
}), // stateSelector
|
93
|
+
(fooActions, barActions) => ({ add: fooActions.add }), // actionsSelector
|
94
|
+
);
|
95
|
+
```
|
96
|
+
|
97
|
+
我们通过 `stateSelector` ,把 `fooModel` 和 `barModel` 中重名的状态做了命名修改,通过 `actionsSelector` ,过滤掉了 `barModel` 的 Actions。
|
98
|
+
|
99
|
+
如果只需要设置 `actionsSelector`,可以把 `stateSelector` 设置为 `undefined`,作为参数占位。例如:
|
100
|
+
|
101
|
+
```ts
|
102
|
+
const [state, actions] = useModel(
|
103
|
+
[fooModel, barModel],
|
104
|
+
undefined,
|
105
|
+
(fooActions, barActions) => ({ add: fooActions.add }), // actionsSelector
|
106
|
+
);
|
107
|
+
```
|
108
|
+
|
109
|
+
### 作为静态状态使用
|
110
|
+
|
111
|
+
通过 `useStaticModel` 获取 Model ,将 Model 中的状态作为静态状态使用。可以保证组件每次访问到的 Model 的 State 都是最新值,但是 Model 的 State 的变化,并不会引起当前组件的重新渲染。
|
112
|
+
|
113
|
+
:::info 注
|
114
|
+
`useStaticModel` 的使用方式和 `useModel` 完全一致。
|
115
|
+
:::
|
116
|
+
|
117
|
+
考虑下面一种场景,有一个组件 Input 负责用户输入,另外一个组件 Search 负责根据用户的输入信息,在点击查询按钮后执行查询操作,我们不希望用户输入过程中的状态变化引起 Search 重新渲染,这时候就可以使用 `useStaticModel`:
|
118
|
+
|
119
|
+
```ts
|
120
|
+
import { useStaticModel } from '@modern-js/runtime/model';
|
121
|
+
|
122
|
+
function Search() {
|
123
|
+
// 这里注意不要解构 state
|
124
|
+
const [state] = useStaticModel(searchModel);
|
125
|
+
|
126
|
+
return (
|
127
|
+
<div>
|
128
|
+
<button
|
129
|
+
onClick={async () => {
|
130
|
+
const result = await mockSearch(state.input);
|
131
|
+
console.log(result);
|
132
|
+
}}
|
133
|
+
>
|
134
|
+
Search
|
135
|
+
</button>
|
136
|
+
</div>
|
137
|
+
);
|
138
|
+
}
|
139
|
+
```
|
140
|
+
|
141
|
+
:::warning 注意
|
142
|
+
不要解构 `useStaticModel` 返回的 `state`,例如改成如下写法:
|
143
|
+
`const [{input}] = useStaticModel(searchModel);`
|
144
|
+
将始终获取到 Input 的初始值。
|
145
|
+
:::
|
146
|
+
|
147
|
+
`useStaticModel` 还适合和 [react-three-fiber](https://github.com/pmndrs/react-three-fiber) 等动画库一起使用,因为在动画组件 UI 里绑定会快速变化的状态,容易引起[性能问题](https:/docs.pmnd.rs/react-three-fiber/advanced/pitfalls#never-bind-fast-state-reactive)。这种情况就可以选择使用 `useStaticModel`,它只会订阅状态,但不会引起视图组件的重新渲染。下面是一个简化示例:
|
148
|
+
|
149
|
+
```ts
|
150
|
+
function ThreeComponent() {
|
151
|
+
const [state, actions] = useStaticModel(modelA);
|
152
|
+
|
153
|
+
useFrame(() => {
|
154
|
+
state.value; // 假设初始化为 0
|
155
|
+
actions.setValue(1);
|
156
|
+
state.value; // 这里会得到1
|
157
|
+
});
|
158
|
+
}
|
159
|
+
```
|
160
|
+
|
161
|
+
使用 React 的 refs 也可以实现类似效果,其实 `useStaticModel` 内部也使用到了 refs。不过直接 `useStaticModel` 有助于将状态的管理逻辑从组件中解耦,统一收敛到 Model 层。
|
162
|
+
|
163
|
+
完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/static-model)查看。
|
164
|
+
|
165
|
+
### 作为局部状态使用
|
166
|
+
|
167
|
+
通过 `useLocalModel` 获取 Model ,将 Model 中的状态作为局部状态使用。此时 Model State 的变化,只会引起当前组件的重新渲染,但是不会引起其他使用了该 Model 的组件重新渲染。效果和通过 React 的 `useState` 管理状态类似,但是可以将状态的管理逻辑从组件中解耦,统一收敛到 Model 层。
|
168
|
+
|
169
|
+
:::info 注
|
170
|
+
`useLocalModel` 的使用方式和 `useModel` 完全一致。
|
171
|
+
:::
|
172
|
+
|
173
|
+
例如,我们修改计数器应用的代码,添加一个有局部状态的计数器组件 `LocalCounter`:
|
174
|
+
|
175
|
+
``` ts
|
176
|
+
import { useLocalModel } from '@modern-js/runtime/model';
|
177
|
+
|
178
|
+
function LocalCounter() {
|
179
|
+
const [state, actions] = useLocalModel(countModel);
|
180
|
+
|
181
|
+
return (
|
182
|
+
<div>
|
183
|
+
<div>local counter: {state.value}</div>
|
184
|
+
<button onClick={() => actions.add()}>add</button>
|
185
|
+
</div>
|
186
|
+
);
|
187
|
+
}
|
188
|
+
```
|
189
|
+
|
190
|
+
分别点击 `Counter` 和 `LocalCounter` 的 `add` 按钮,两者的状态互不影响:
|
191
|
+
|
192
|
+

|
193
|
+
|
194
|
+
完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/local-model)查看。
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
## 在组件外使用
|
199
|
+
|
200
|
+
在实际业务场景中,有时候我们需要在 React 组件外使用 Model,例如在工具函数中访问 State、执行 Actions 等。这个时候,我们就需要使用 Store。 Store 是一个底层概念,一般情况下用户接触不到,它负责存储和管理整个应用的状态。Reduck 的 Store 基于 [Redux 的 Store](https://redux.js.org/api/store) 实现,增加了 Reduck 特有的 API,如 `use` 。
|
201
|
+
|
202
|
+
首先,在组件内调用 `useStore` 获取当前应用使用的 `store` 对象,并挂载到组件外的变量上:
|
203
|
+
|
204
|
+
```ts
|
205
|
+
let store; // 组件外部 `store` 对象的引用
|
206
|
+
function setStore(s) { store = s };
|
207
|
+
function getStore() { return store };
|
208
|
+
|
209
|
+
function Counter() {
|
210
|
+
const [state] = useModel(countModel);
|
211
|
+
const store = useStore();
|
212
|
+
// 通过 useMemo 避免不必要的重复设置
|
213
|
+
useMemo(()=> {
|
214
|
+
setStore(store)
|
215
|
+
}, [store])
|
216
|
+
|
217
|
+
return (
|
218
|
+
<div>
|
219
|
+
<div>counter: {state.value}</div>
|
220
|
+
</div>
|
221
|
+
);
|
222
|
+
}
|
223
|
+
```
|
224
|
+
|
225
|
+
通过 `store.use` 可以获取 Model 对象,`store.use` 的用法同 `useModel` 相同。以计数器应用为例,我们在组件树外,每 1s 对计数器值
|
226
|
+
执行自增操作:
|
227
|
+
|
228
|
+
```ts
|
229
|
+
setInterval(() => {
|
230
|
+
const store = getStore();
|
231
|
+
const [, actions] = store.use(countModel);
|
232
|
+
actions.add();
|
233
|
+
}, 1000)
|
234
|
+
```
|
235
|
+
|
236
|
+
完整的示例代码可以在[这里](https://github.com/modern-js-dev/modern-js-examples/tree/main/series/tutorials/runtime-api/model/counter-model-outof-react)查看。
|
237
|
+
|
238
|
+
:::info 注
|
239
|
+
如果是通过 [`createStore`](/docs/apis/app/runtime/model/create-store) 手动创建的 Store 对象,无需通过 `useStore` 在组件内获取,即可直接使用。
|
240
|
+
:::
|
241
|
+
|
242
|
+
:::info 补充信息
|
243
|
+
本节涉及的 API 的详细定义,请参考[这里](/docs/apis/app/runtime/model/model_)。
|
244
|
+
:::
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 12
|
3
|
+
title: 单独使用 Reduck
|
4
|
+
---
|
5
|
+
|
6
|
+
在 Modern.js 以外,单独集成 Reduck 使用时,主要需要做以下修改:
|
7
|
+
|
8
|
+
1. 安装 Reduck 相关包
|
9
|
+
|
10
|
+
在项目中安装 Reduck 包:`@modern-js-reduck/react`。
|
11
|
+
|
12
|
+
|
13
|
+
2. API 导入包名
|
14
|
+
|
15
|
+
在 Modern.js 中使用时,Reduck 导出 API 的包名为:`@modern-js/runtime/model`。单独使用 Reduck 时,导出包名为:`@modern-js-reduck/react`。
|
16
|
+
|
17
|
+
|
18
|
+
3. 包裹 `Provider` 组件
|
19
|
+
|
20
|
+
Modern.js 自动在应用的入口组件上,包裹了用于注入 Reduck 全局 Store 的 [`Provider`](/docs/apis/app/runtime/model/Provider) 组件。单独使用 Reduck 时,需要手动完成。
|
21
|
+
|
22
|
+
示例:
|
23
|
+
```tsx
|
24
|
+
// 根组件
|
25
|
+
const Root = () => {
|
26
|
+
return (
|
27
|
+
<Provider>
|
28
|
+
{/* 应用入口组件 */}
|
29
|
+
<App />
|
30
|
+
</Provider>
|
31
|
+
)
|
32
|
+
}
|
33
|
+
```
|
34
|
+
|
35
|
+
|
36
|
+
4. 功能配置
|
37
|
+
|
38
|
+
在 Modern.js 中使用时,可以通过 [`runtime.state`](/docs/configure/app/runtime/state) 对 Reduck 功能进行配置。单独使用时,需要通过 [`Provider`](/docs/apis/app/runtime/model/Provider) 的 `config` 或 `store` 参数配置。
|
39
|
+
|
40
|
+
|
41
|
+
示例:
|
42
|
+
```tsx
|
43
|
+
const Root = () => {
|
44
|
+
return (
|
45
|
+
{/* 关闭 Redux DevTools */}
|
46
|
+
<Provider config={{ devTools: false }}>
|
47
|
+
<App />
|
48
|
+
</Provider>
|
49
|
+
)
|
50
|
+
}
|
51
|
+
```
|
@@ -0,0 +1,64 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 2
|
3
|
+
---
|
4
|
+
|
5
|
+
# 创建子项目
|
6
|
+
|
7
|
+
本章将要介绍如何在 Monorepo 工程下创建子项目。
|
8
|
+
|
9
|
+
> Modern.js 支持使用 pnpm 和 Yarn 的 Monorepo,这里以使用 pnpm 为例。以下命令可以以同样方式使用 Yarn 来执行。
|
10
|
+
|
11
|
+
Modern.js 针对 Monorepo 工程提供了生成器功能,它用于在 Monorepo 工程下创建不同类型的 Monorepo 子项目。在生成器中提供以下类型子项目的创建:
|
12
|
+
|
13
|
+
- 「应用」类型
|
14
|
+
- 「模块」类型
|
15
|
+
|
16
|
+
要启动 Monorepo 的生成器功能,可以在 Monorepo 工程根目录下执行命令:
|
17
|
+
|
18
|
+
```
|
19
|
+
pnpm run new
|
20
|
+
```
|
21
|
+
|
22
|
+
:::info 补充信息
|
23
|
+
使用 Yarn 的方式:`yarn new`
|
24
|
+
:::
|
25
|
+
|
26
|
+
执行成功后,可以看到如下内容:
|
27
|
+
|
28
|
+
```
|
29
|
+
? 请选择你想创建的工程类型 (Use arrow keys)
|
30
|
+
❯ 应用
|
31
|
+
应用(测试)
|
32
|
+
模块
|
33
|
+
模块(内部)
|
34
|
+
```
|
35
|
+
|
36
|
+
:::info 注
|
37
|
+
「应用」与「应用(测试)」都是「应用」类型的项目,区别是「应用」类型的子项目会创建在 `./apps` 目录下,而 「应用(测试)」类型的子项目会创建在 `./examples` 目录下。
|
38
|
+
:::
|
39
|
+
|
40
|
+
:::info 注
|
41
|
+
「模块」与「模块(内部)」都是「模块」类型的项目,区别之一是「模块」类型的子项目会创建在 `./packages` 目录下,而「模块(内部)」类型的子项目会创建在 `./features` 目录下。
|
42
|
+
|
43
|
+
对于「模块」类型的子项目允许被发布到外部(例如 npm),而对于「模块(内部)」的子项目则可以在应用项目中直接使用其源码(该特性是「模块」项目不具备的,应用项目对于「模块(内部)」子项目做了特殊处理),因此这类子项目不需要发布到外部。
|
44
|
+
:::
|
45
|
+
|
46
|
+
然后根据不同的需求选择对应的类型项目选项,选择之后便开始出现对应子项目类型的问题和选项。例如选择「应用」后会出现:
|
47
|
+
|
48
|
+
```
|
49
|
+
? 请选择你想创建的工程类型 应用
|
50
|
+
? 请填写子项目名称
|
51
|
+
```
|
52
|
+
|
53
|
+
当完成所有生成器问题之后,便开始进行项目的创建和项目依赖的下载。当创建成功之后,可以看到类似以下内容:
|
54
|
+
|
55
|
+
```
|
56
|
+
[INFO] 依赖自动安装成功
|
57
|
+
[INFO] 创建成功!
|
58
|
+
可在新项目的目录下运行以下命令:
|
59
|
+
pnpm run dev # 按开发环境的要求,运行和调试项目
|
60
|
+
pnpm run build # 按产品环境的要求,构建项目
|
61
|
+
pnpm run start # 按产品环境的要求,运行项目
|
62
|
+
pnpm run lint # 检查和修复所有代码
|
63
|
+
pnpm run new # 继续创建更多项目要素,比如应用入口
|
64
|
+
```
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 5
|
3
|
+
---
|
4
|
+
|
5
|
+
# 应用项目的部署
|
6
|
+
|
7
|
+
本章将要介绍如何在 Monorepo 中对应用项目进行部署。
|
8
|
+
|
9
|
+
所谓的 “在 Monorepo 中对应用项目进行部署” 更像是应用项目部署到服务器的前置工作。应用项目的功能一般来自以下部分
|
10
|
+
|
11
|
+
- 自身的代码逻辑功能
|
12
|
+
- 第三方的依赖
|
13
|
+
- Monorepo 中其他子项目提供的逻辑功能
|
14
|
+
|
15
|
+
而在将应用项目放到部署服务器之前,需要对应用项目、第三方依赖以及它所依赖的子项目做整合处理。
|
16
|
+
|
17
|
+
Modern.js 为 Monorepo 工程提供了部署功能,该功能可以为要部署的项目生成一个最小集合的 Monorepo,在这个 Monorepo 当中包含应用项目以及其依赖的子项目。
|
18
|
+
|
19
|
+
我们以 [子项目联调](/docs/guides/topic-detail/monorepo/sub-project-interface) 章节的例子为例,如果要发布 `apps/app` 应用项目,那么在 Monorepo 根目录下执行:
|
20
|
+
|
21
|
+
```
|
22
|
+
pnpm deploy app
|
23
|
+
```
|
24
|
+
|
25
|
+
:::info 补充信息
|
26
|
+
`app` 为应用项目的项目名称,或者说是 `package.json` 的 `name` 对应的值。
|
27
|
+
:::
|
28
|
+
|
29
|
+
执行命令之后,首先会在 Monorepo 根目录下生成 `output` 目录,其中包含了应用项目 `apps/app`、`features/internal-lib`、`packages/components`。
|
30
|
+
|
31
|
+
:::info 补充信息
|
32
|
+
`output` 目录就是需要部署到服务器上的目录,可以通过命令参数进行路径修改。可以查看 [deploy 命令](/docs/apis/monorepo/commands/deploy)。
|
33
|
+
:::
|
34
|
+
|
35
|
+

|
36
|
+
|
37
|
+
然后会自动进行依赖的安装。
|
38
|
+
|
39
|
+
最后当 deploy 命令运行完成后,我们可以将 `output` 放到部署项目的服务器上。
|
40
|
+
|
41
|
+
:::tip 提示
|
42
|
+
在使用 Yarn 的 Monorepo 中,推荐全局安装 [Lerna](https://github.com/lerna/lerna) 作为 Monorepo 子项目额外的管理工具。由于 [Yarn 1 (Classic) ](https://classic.yarnpkg.com/lang/en/) 在安装依赖的时候,不会触发子项目的 [Life Cycle Scripts](https:/docs.npmjs.com/cli/v7/using-npm/scripts#life-cycle-scripts),因此还需要使用 Lerna 完成这类事情。
|
43
|
+
:::
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 1
|
3
|
+
---
|
4
|
+
|
5
|
+
# 简介
|
6
|
+
|
7
|
+
Modern.js 提供了对于 Monorepo 工程方案的支持,其主要通过 `@modern-js/monorepo-tools` 来提供功能。
|
8
|
+
|
9
|
+
该专题将从以下方面来讲解如何使用 Modern.js 对 Monorepo 进行管理:
|
10
|
+
|
11
|
+
- 在 Monorepo 中创建子项目
|
12
|
+
- Monorepo 下子项目之间的联调开发
|
13
|
+
- 发布 Monorepo 的子项目
|
14
|
+
- 部署 Monorepo 子项目
|
15
|
+
|