├── .gitattributes
├── .gitignore
├── .gitmodules
├── .prettierrc.js
├── LICENSE
├── README.md
├── api
├── ant-design.json
├── pro-components.json
└── umi.json
├── docs
├── ant-design
│ ├── CHANGELOG.md
│ ├── README-zh_CN.md
│ ├── SECURITY.md
│ ├── api.md
│ └── docs
│ │ ├── react
│ │ ├── common-props.zh-CN.md
│ │ ├── compatible-style.zh-CN.md
│ │ ├── contributing.zh-CN.md
│ │ ├── css-variables.zh-CN.md
│ │ ├── customize-theme.zh-CN.md
│ │ ├── faq.zh-CN.md
│ │ ├── getting-started.zh-CN.md
│ │ ├── i18n.zh-CN.md
│ │ ├── introduce.zh-CN.md
│ │ ├── migrate-less-variables.zh-CN.md
│ │ ├── migration-v5.zh-CN.md
│ │ ├── recommendation.zh-CN.md
│ │ ├── server-side-rendering.zh-CN.md
│ │ ├── use-custom-date-library.zh-CN.md
│ │ ├── use-with-create-react-app.zh-CN.md
│ │ ├── use-with-next.zh-CN.md
│ │ ├── use-with-umi.zh-CN.md
│ │ └── use-with-vite.zh-CN.md
│ │ ├── resources.zh-CN.md
│ │ └── spec
│ │ ├── alignment.zh-CN.md
│ │ ├── buttons.zh-CN.md
│ │ ├── cases.zh-CN.md
│ │ ├── colors.zh-CN.md
│ │ ├── contrast.zh-CN.md
│ │ ├── copywriting.zh-CN.md
│ │ ├── data-display.zh-CN.md
│ │ ├── data-entry.zh-CN.md
│ │ ├── data-format.zh-CN.md
│ │ ├── data-list.zh-CN.md
│ │ ├── detail-page.zh-CN.md
│ │ ├── direct.zh-CN.md
│ │ ├── feedback.zh-CN.md
│ │ ├── font.zh-CN.md
│ │ ├── icon.zh-CN.md
│ │ ├── illustration.zh-CN.md
│ │ ├── introduce.zh-CN.md
│ │ ├── invitation.zh-CN.md
│ │ ├── layout.zh-CN.md
│ │ ├── lightweight.zh-CN.md
│ │ ├── motion.zh-CN.md
│ │ ├── navigation.zh-CN.md
│ │ ├── overview.zh-CN.md
│ │ ├── proximity.zh-CN.md
│ │ ├── reaction.zh-CN.md
│ │ ├── repetition.zh-CN.md
│ │ ├── research-empty.zh-CN.md
│ │ ├── research-exception.zh-CN.md
│ │ ├── research-form.zh-CN.md
│ │ ├── research-list.zh-CN.md
│ │ ├── research-message-and-feedback.zh-CN.md
│ │ ├── research-navigation.zh-CN.md
│ │ ├── research-overview.zh-CN.md
│ │ ├── research-result.zh-CN.md
│ │ ├── research-workbench.zh-CN.md
│ │ ├── shadow.zh-CN.md
│ │ ├── stay.zh-CN.md
│ │ ├── transition.zh-CN.md
│ │ ├── values.zh-CN.md
│ │ ├── visual.zh-CN.md
│ │ └── visualization-page.zh-CN.md
├── pro-components
│ ├── CHANGELOG.md
│ ├── LICENSE.md
│ ├── README.zh-CN.md
│ ├── api.md
│ ├── docs
│ │ ├── components.md
│ │ ├── components
│ │ │ └── schema.md
│ │ ├── docs
│ │ │ ├── faq.md
│ │ │ ├── index.md
│ │ │ └── intro.md
│ │ ├── index.md
│ │ └── playground
│ │ │ ├── index.md
│ │ │ ├── pro-descriptions.md
│ │ │ └── pro-form.md
│ └── packages
│ │ ├── card
│ │ └── src
│ │ │ └── components
│ │ │ ├── CheckCard
│ │ │ └── index.md
│ │ │ ├── StatisticCard
│ │ │ └── index.md
│ │ │ └── card.md
│ │ ├── descriptions
│ │ └── src
│ │ │ └── components
│ │ │ └── descriptions.md
│ │ ├── field
│ │ └── src
│ │ │ └── components
│ │ │ └── field.md
│ │ ├── form
│ │ └── src
│ │ │ └── components
│ │ │ ├── Dependency
│ │ │ └── index.md
│ │ │ ├── FieldSet
│ │ │ └── index.md
│ │ │ ├── Group
│ │ │ └── index.md
│ │ │ ├── LoginForm
│ │ │ └── index.md
│ │ │ ├── ModalForm
│ │ │ └── index.md
│ │ │ ├── QueryFilter
│ │ │ └── index.md
│ │ │ ├── SchemaForm
│ │ │ └── index.md
│ │ │ ├── StepsForm
│ │ │ └── index.md
│ │ │ └── form.md
│ │ ├── layout
│ │ └── src
│ │ │ └── components
│ │ │ ├── PageContainer
│ │ │ └── index.md
│ │ │ ├── PageHeader
│ │ │ └── index.md
│ │ │ ├── WaterMark
│ │ │ └── index.md
│ │ │ └── layout.md
│ │ ├── list
│ │ └── src
│ │ │ └── components
│ │ │ └── list.md
│ │ ├── skeleton
│ │ └── src
│ │ │ └── components
│ │ │ └── skeleton.md
│ │ └── table
│ │ └── src
│ │ └── components
│ │ ├── DragSortTable
│ │ └── index.md
│ │ ├── EditableTable
│ │ └── index.md
│ │ └── table.md
└── umi
│ ├── api.md
│ └── docs
│ └── docs
│ ├── blog
│ ├── code-splitting.md
│ ├── develop-blog-using-umi.md
│ ├── legacy-browser.md
│ ├── mfsu-faster-than-vite.md
│ ├── mfsu-independent-usage.md
│ ├── umi-4-rc.md
│ └── webpack-5-prod-cache.md
│ └── docs
│ ├── api
│ ├── api.md
│ ├── commands.md
│ ├── config.md
│ ├── plugin-api.md
│ └── runtime-config.md
│ ├── guides
│ ├── boilerplate.md
│ ├── client-loader.md
│ ├── debug.md
│ ├── directory-structure.md
│ ├── env-variables.md
│ ├── generator.md
│ ├── getting-started.md
│ ├── lint.md
│ ├── mfsu.md
│ ├── mock.md
│ ├── mpa.md
│ ├── plugins.md
│ ├── prepare.md
│ ├── proxy.md
│ ├── routes.md
│ ├── styling.md
│ ├── test.md
│ ├── typescript.md
│ ├── use-plugins.md
│ └── use-vue.md
│ ├── introduce
│ ├── faq.md
│ ├── introduce.md
│ ├── philosophy.md
│ └── upgrade-to-umi-4.md
│ └── max
│ ├── access.md
│ ├── analytics.md
│ ├── antd.md
│ ├── charts.md
│ ├── data-flow.md
│ ├── dva.md
│ ├── i18n.md
│ ├── introduce.md
│ ├── layout-menu.md
│ ├── mf.md
│ ├── micro-frontend.md
│ ├── react-query.md
│ ├── request.md
│ ├── styled-components.md
│ └── valtio.md
├── meta
├── ant-design
│ ├── README-zh_CN.json
│ ├── api.json
│ ├── common-props.json
│ ├── compatible-style.json
│ ├── contributing.json
│ ├── css-variables.json
│ ├── customize-theme.json
│ ├── faq.json
│ ├── getting-started.json
│ ├── i18n.json
│ ├── introduce.json
│ ├── migrate-less-variables.json
│ ├── migration-v5.json
│ ├── recommendation.json
│ ├── resources.json
│ ├── server-side-rendering.json
│ ├── use-custom-date-library.json
│ ├── use-with-create-react-app.json
│ ├── use-with-next.json
│ ├── use-with-umi.json
│ └── use-with-vite.json
├── pro-components
│ ├── LICENSE.json
│ ├── README.json
│ ├── api.json
│ ├── card.json
│ ├── components.json
│ ├── descriptions.json
│ ├── faq.json
│ ├── field.json
│ ├── form.json
│ ├── index.json
│ ├── intro.json
│ ├── layout.json
│ ├── list.json
│ ├── pro-form.json
│ ├── schema.json
│ ├── skeleton.json
│ └── table.json
└── umi
│ ├── access.json
│ ├── antd.json
│ ├── api.json
│ ├── boilerplate.json
│ ├── charts.json
│ ├── client-loader.json
│ ├── commands.json
│ ├── config.json
│ ├── data-flow.json
│ ├── debug.json
│ ├── directory-structure.json
│ ├── dva.json
│ ├── env-variables.json
│ ├── faq.json
│ ├── generator.json
│ ├── getting-started.json
│ ├── i18n.json
│ ├── introduce.json
│ ├── layout-menu.json
│ ├── lint.json
│ ├── mf.json
│ ├── mfsu.json
│ ├── micro-frontend.json
│ ├── mock.json
│ ├── mpa.json
│ ├── philosophy.json
│ ├── plugin-api.json
│ ├── plugins.json
│ ├── prepare.json
│ ├── proxy.json
│ ├── react-query.json
│ ├── request.json
│ ├── routes.json
│ ├── runtime-config.json
│ ├── styled-components.json
│ ├── styling.json
│ ├── test.json
│ ├── typescript.json
│ ├── upgrade-to-umi-4.json
│ ├── use-plugins.json
│ ├── use-vue.json
│ └── valtio.json
├── package.json
├── pnpm-lock.yaml
└── scripts
├── apiToMd.mjs
├── docsToJson.mjs
├── genQA.mjs
├── jsonToEmbedding.mjs
├── readApi.mjs
└── readChange.mjs
/.gitattributes:
--------------------------------------------------------------------------------
1 | **/compiled/** linguist-vendored
2 | .husky/* linguist-vendored
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /examples/*/.esmi
3 | /examples/*/.mfsu
4 | /examples/*/.umi-test
5 | /examples/*/.umi
6 | /examples/*/.umi-production
7 | /examples/*/.output
8 | /examples/*/api
9 | /examples/*/server
10 | /examples/*/src/.umi
11 | /examples/*/src/.umi-test
12 | /examples/*/src/.umi-production
13 | /examples/libs/monorepo/foo/.mfsu
14 | /examples/libs/monorepo/foo/.umi
15 | /examples/*/dist
16 | /examples/*/.env.local
17 | /examples/*/node_modules
18 | /packages/*/node_modules
19 | /packages/*/dist
20 | /packages/*/tsconfig.tsbuildinfo
21 | /packages/*/src/**/fixtures/*/dist
22 | /packages/*/src/**/fixtures/*/.umi
23 | /packages/*/src/**/fixtures/*/.umi-production
24 | /packages/plugin-docs/client/theme-doc/tailwind.out.css
25 | /packages/preset-umi/fixtures/**/dist
26 | /packages/preset-umi/devToolApp/.umi
27 | /packages/preset-umi/devToolApp/.umi-production
28 | /packages/preset-umi/devToolApp/node_modules
29 | /libs/*/dist
30 | /libs/*/node_modules
31 | /.umi
32 | /.mfsu
33 | /.umi-production
34 | /dist
35 | .DS_Store
36 | .turbo
37 | *.tsbuildinfo
38 | .jest-cache
39 | .swc
40 | /test/**/fixtures/*/dist
41 | /test/**/fixtures/*/.umi
42 | /test/**/fixtures/*/.umi-production
43 | /test/**/fixtures/*/src/.umi
44 | /test/**/fixtures/*/src/.umi-production
45 | /coverage
46 | /packages/*/coverage
47 | /examples/*/coverage
48 | /.vscode
49 | /.idea
50 | /.pnpm-*.log
51 | /.github_token
52 | /TMP_CHANGELOG.md
53 | /.openai_token
54 | /.github_account
55 |
56 | # Ignore declaration files, they are generated from local development
57 | /packages/bundler-webpack/client/**/*.d.ts
58 | /packages/bundler-webpack/client/**/*.d.ts.map
59 | /packages/umi/client/**/*.d.ts
60 | /packages/umi/client/**/*.d.ts.map
61 | /packages/bundler-vite/src/fixtures/alias/node_modules
62 | **/cypress/screenshots/
63 | **/cypress/videos/
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "pro-components"]
2 | path = pro-components
3 | url = git@github.com:ant-design/pro-components.git
4 | [submodule "ant-design"]
5 | path = ant-design
6 | url = git@github.com:ant-design/ant-design.git
7 | [submodule "umi"]
8 | path = umi
9 | url = git@github.com:umijs/umi.git
10 |
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | const fabric = require('@umijs/fabric');
2 |
3 | module.exports = {
4 | ...fabric.prettier,
5 | printWidth: 80,
6 | plugins: [require.resolve('prettier-plugin-organize-imports')],
7 | };
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Ant Design Team
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # @ant-design/doc
2 |
3 | ## 简介
4 |
5 | `@ant-design/doc` 是一个提供 antd 技术栈所有文档的库。它可以用于为 AI 功能和 IDE 提供智能提示。
6 |
7 | ## 安装
8 |
9 | 你可以使用 npm 或者 yarn 来安装 `@ant-design/doc`:
10 |
11 | ```shell
12 | npm install @ant-design/doc
13 | ```
14 |
15 | 或者
16 |
17 | ```shell
18 | yarn add @ant-design/doc
19 | ```
20 |
21 | ## 使用
22 |
23 | 安装完成后,你可以在你的 AI 应用程序或者 IDE 中导入该库并开始使用:
24 |
25 | ```javascript
26 | import { antdDocs } from '@ant-design/doc';
27 |
28 | // 在这里使用库的函数...
29 | ```
30 |
31 | ## 文档
32 |
33 | `@ant-design/doc` 库提供以下文档文件:
34 |
35 | - `api`:该文件夹包含 antd 技术栈的 API 文档。
36 | - `docs`:该文件夹包含有关使用 antd 的其他文档和指南。
37 |
38 | 请参考具体的文件和文件夹以获取相关文档。
39 |
40 | ## 作者
41 |
42 | 该库由 chenshuai2144 开发和维护。你可以通过 qixian.cs@outlook.com 联系他们,或者访问他们的 GitHub 主页 [https://github.com/chenshuai2144](https://github.com/chenshuai2144)。
43 |
44 | ## 许可证
45 |
46 | 该库采用 MIT 许可证发布。请查看 LICENSE 文件获取更多详情。
47 |
48 | ---
49 |
50 | 感谢使用 `@ant-design/doc`!如果您有任何问题或需要进一步的帮助,请随时联系我们。
51 |
--------------------------------------------------------------------------------
/docs/ant-design/SECURITY.md:
--------------------------------------------------------------------------------
1 | ### 4.x 版本现在是否还在维护?
2 |
3 | 是的,4.x 版本目前仍在维护,并且有安全更新。
4 |
5 | ### 4.0 以下的版本还能获得支持吗?
6 |
7 | 不可以,4.0 以下的版本已经停止了支持和安全更新。
8 |
9 | ### 目前有哪些版本被支持?
10 |
11 | 目前仅有 4.x 版本被支持,并且有进行安全更新。
12 |
13 | ### 如何报告漏洞?
14 |
15 | 要报告漏洞,您可以前往我们的报告漏洞页面。在该页面上,您将获得提供漏洞细节的表单。一旦您提交了漏洞报告,我们的安全团队将进行审核。
16 |
17 | 我们会在收到漏洞报告后尽快与您联系。您可以期待定期更新,以了解漏洞处理的进展。我们会及时回应您的报告,并保持沟通,直到问题解决。
18 |
19 | 一旦我们接受了您的漏洞报告,我们将会尽快采取措施来修复该漏洞。如果漏洞被拒绝,我们将向您解释拒绝的原因,并提供必要的解释。
20 |
21 | 请注意,我们非常重视漏洞报告的机密性。我们会在处理漏洞时采取适当的措施,确保您的个人信息和报告内容不会被泄露给未授权的第三方。
22 |
23 | 如果您发现了我们系统中的安全漏洞,请尽快向我们报告,以便我们及时采取措施修复漏洞并确保系统的安全性。
24 |
25 | ### 漏洞报告通常要等多久才能得到更新?
26 |
27 | 我们在收到漏洞报告后会尽快与您取得联系,并开始处理漏洞。我们会定期向您提供更新,以告知漏洞处理的进展情况。
28 |
29 | 由于漏洞的复杂性和紧急程度各不相同,因此更新的时间可能会有所不同。但我们会尽力确保尽快解决并修复漏洞。
30 |
31 | ### 漏洞报告被接受后会发生什么?
32 |
33 | 一旦我们接受了您的漏洞报告,我们将会尽快采取措施来修复该漏洞。我们的团队将会评估漏洞的严重性,并决定修复的优先级。
34 |
35 | 在修复过程中,我们会与您保持沟通,并及时提供更新。我们会在修复完成后,通知您漏洞已经修复,并感谢您的悉心报告。
36 |
37 | 如果您对我们的修复措施有任何疑问或需要进一步的解释,请随时与我们的安全团队联系。我们将很高兴为您提供帮助。
38 |
--------------------------------------------------------------------------------
/docs/ant-design/docs/react/common-props.zh-CN.md:
--------------------------------------------------------------------------------
1 | ### 通用属性中的 rootClassName 参数有什么作用?
2 |
3 | rootClassName 参数是用来添加在组件最外层的 className 的。通过指定 rootClassName,可以对组件进行自定义样式的修改。
4 |
5 | ### rootClassName 参数的类型是什么?
6 |
7 | rootClassName 参数的类型是 string。
8 |
9 | ### rootClassName 参数的默认值是什么?
10 |
11 | rootClassName 参数的默认值是 "-",即没有默认值。
12 |
--------------------------------------------------------------------------------
/docs/ant-design/docs/react/css-variables.zh-CN.md:
--------------------------------------------------------------------------------
1 | ### Ant Design 5.x 从哪个版本开始重新支持了 CSS 变量?
2 |
3 | 答案:Ant Design 5.x 从版本 5.12.0 开始重新支持了 CSS 变量。
4 |
5 | ### Ant Design 5.x 在 CSS 变量模式中融合了什么能力?
6 |
7 | 答案:Ant Design 5.x 在 CSS 变量模式中融合了 CSS-in-JS 的能力。
8 |
9 | ### 在 Ant Design 5.x 的 CSS 变量模式下,哪些样式可以共享?
10 |
11 | 答案:在 Ant Design 5.x 的 CSS 变量模式下,不同主题下的样式可以共享,从而减少样式体积。
12 |
13 | ### 什么是 Ant Design 的 CSS 变量模式?
14 |
15 | Ant Design 的 CSS 变量模式是一种样式能力,通过使用 CSS 变量,可以实现在同一组件中,不同主题下的样式共享的目的。这样可以减少样式体积,并提高主题切换的性能。
16 |
17 | ### CSS 变量模式有什么优势?
18 |
19 | CSS 变量模式带来了两个重要的优势。首先,它可以让同一组件在不同主题下的样式共享,从而减少了样式体积。其次,切换主题时不再需要重新序列化样式,提升了主题切换的性能。
20 |
21 | ### 应该在什么情况下开启 Ant Design 的 CSS 变量模式?
22 |
23 | 如果你的应用依赖 Ant Design 的主题能力,即需要在不同主题下展示不同的样式,那么我们强烈建议你开启 Ant Design 的 CSS 变量模式。这样可以享受到样式共享和主题切换性能的提升。
24 |
25 | ### 如何快速上手 Ant Design 的 CSS 变量模式?
26 |
27 | 在 `ConfigProvider` 的 `theme` 属性中,通过 `cssVar` 配置来开启 CSS 变量模式。这个配置会被继承,所以只需要在根节点的 `ConfigProvider` 中配置即可。示例代码如下:
28 |
29 | ```tsx
30 |
17 | ```
18 |
--------------------------------------------------------------------------------
/docs/pro-components/docs/playground/pro-descriptions.md:
--------------------------------------------------------------------------------
1 | 1. 什么是 ProDescriptions Playground?ProDescriptions Playground 是一个基于 React 组件的属性展示组件。它提供了一个 Playground 环境,可以在其中动态展示和调试属性的值。
2 |
3 | 2. ProDescriptions Playground 的背景颜色是什么?ProDescriptions Playground 的背景颜色使用了 CSS 变量,并且可以根据定义的变量动态改变。其中,背景颜色的变量名为 --main-bg-color。
4 |
5 | 3. ProDescriptions Playground 的标题是什么?ProDescriptions Playground 的标题为 "属性展示"。它是一个用于描述和展示属性信息的组件。
6 |
--------------------------------------------------------------------------------
/docs/pro-components/docs/playground/pro-form.md:
--------------------------------------------------------------------------------
1 | ### ProForm 的 layout 切换功能如何使用?
2 |
3 | ProForm 提供了多种预设的 layout,通过改变外面包裹的 Layout 即可实现切换。以下是一个 demo 的代码示例:
4 |
5 | ```tsx
6 |
7 | ```
8 |
9 | ### ProForm 的 layout 切换功能有哪些主要特点?
10 |
11 | ProForm 的 layout 切换功能的主要特点包括:
12 |
13 | - 提供了多种预设的 layout
14 | - 通过改变外面包裹的 Layout 即可实现切换
15 | - 代码示例可以参考 [layout-change.tsx](../../packages/form/src/demos/layout-change.tsx)
16 |
17 | ### 如何使用 ProForm 的 layout 切换功能来实现表单布局的切换?
18 |
19 | 要使用 ProForm 的 layout 切换功能来实现表单布局的切换,只需要按照以下步骤操作:
20 |
21 | 1. 参考代码示例 [layout-change.tsx](../../packages/form/src/demos/layout-change.tsx)
22 | 2. 根据需求选择合适的预设 layout
23 | 3. 改变外面包裹的 Layout 即可实现切换
24 | 4. 查看效果并进行调整和优化
25 |
26 | 以上是 ProForm 的 layout 切换功能的使用方法及相关特点,希望对你有所帮助。
27 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/field/src/components/field.md:
--------------------------------------------------------------------------------
1 | ## 1:如何使用 Ant Design 的基础组件?
2 |
3 | Ant Design 提供了很多基础组件,你可以通过以下步骤来使用它们:
4 |
5 | 1. 首先,在你的代码中导入需要的基础组件的模块。
6 |
7 | ```tsx
8 | import { Button, Input, Checkbox } from 'antd';
9 | ```
10 |
11 | 2. 在页面中使用这些组件,例如:
12 |
13 | ```tsx
14 | <>
15 |
16 |
17 | ` 标签将代码包裹起来,并将代码文件的路径传入 `src` 属性中。
20 |
21 | 3. 在代码示例的 `title` 属性中,填写相应的标题名称,以便更好地描述这段代码的功能和使用场景。
22 |
23 | 4. 确保你的代码中已经定义了 `onOpenChange` 函数,它将作为回调函数,以响应开关状态的变化。
24 |
25 | 5. 将 `open` 属性设置为一个布尔值,用于控制组件的打开或关闭状态。
26 |
27 | 6. 当你需要在组件的打开或关闭状态发生变化时执行一些操作时,你可以在 `onOpenChange` 函数中编写相应的逻辑代码。
28 |
29 | 7. 最后,根据你的具体需求和应用场景,调整代码中的其他相关属性和参数。
30 |
31 | 通过遵循以上步骤,你可以成功使用 open 和 onOpenChange 属性,并根据需要对组件的打开和关闭状态进行控制和相应操作。
32 |
33 | ### open 和 onOpenChange 属性分别用于什么?
34 |
35 | open 和 onOpenChange 属性在前端开发中常用于组件的状态管理和交互控制。
36 |
37 | - open 属性用于控制组件的打开和关闭状态。它的值为布尔类型,当为 true 时表示组件处于打开状态,当为 false 时表示组件处于关闭状态。
38 |
39 | - onOpenChange 属性是一个回调函数,用于监听组件的打开和关闭状态的变化。当组件的打开或关闭状态发生变化时,该函数会被触发,并执行相应的操作逻辑。
40 |
41 | 通过使用 open 和 onOpenChange 属性,你可以实现组件的状态控制和响应交互,以便根据用户的操作和需求对组件进行动态的打开和关闭操作,并在状态变化时执行相应的逻辑代码。
42 |
43 | ### 使用 open 和 onOpenChange 的注意事项
44 |
45 | 在使用 open 和 onOpenChange 属性时,需要注意以下几点:
46 |
47 | - 确保你已经引入了支持这些属性的组件,并按照正确的方式使用它们。
48 |
49 | - 在代码示例中,需要定义一个 `onOpenChange` 函数,该函数将作为回调函数,在组件的打开或关闭状态发生变化时被触发。
50 |
51 | - open 属性的值应为一个布尔类型的变量,用于控制组件的打开和关闭状态。
52 |
53 | - 根据你的具体需求和场景,可以根据组件的打开和关闭状态执行一些操作,例如切换样式、加载数据等。
54 |
55 | - 确保你的代码中也包含了其他相关属性和参数,以满足你的具体需求和应用场景。
56 |
57 | 通过遵循以上注意事项,你可以更好地使用 open 和 onOpenChange 属性,并在前端开发中实现组件的状态控制和交互操作。
58 |
59 | ### ModalForm 组合了哪些组件?
60 |
61 | ModalForm 组合了 Modal 和 ProForm 两个组件。
62 |
63 | ### ModalForm 中的 trigger 参数是用来做什么的?
64 |
65 | trigger 参数是用来触发 Modal 打开的 DOM 元素,通常是一个按钮。
66 |
67 | ### ModalForm 中的 open 参数的类型是什么?
68 |
69 | open 参数的类型是 open,具体含义未给出。
70 |
71 | ### ModalForm 中的 onOpenChange 参数是在什么情况下触发的?
72 |
73 | onOpenChange 参数在 visible 改变时触发。
74 |
75 | ### ModalForm 中的 modalProps 参数是用来做什么的?
76 |
77 | modalProps 参数是 Modal 组件的 props,可以使用与 antd 相同的方式进行配置。
78 |
79 | ### ModalForm 中的 title 参数表示什么?
80 |
81 | title 参数表示弹框的标题。
82 |
83 | ### ModalForm 中的 width 参数表示什么?
84 |
85 | width 参数表示弹框的宽度。
86 |
87 | ### ModalForm 中的 onFinish 参数在什么情况下触发?
88 |
89 | onFinish 参数在提交数据时触发。
90 |
91 | ### ModalForm 中的 submitTimeout 参数是用来做什么的?
92 |
93 | submitTimeout 参数是在提交数据时禁用取消按钮的超时时间(毫秒)。
94 |
95 | ### ModalForm 中的 submitter 参数与哪个组件的配置方式相同?
96 |
97 | submitter 参数的配置方式与 ProForm 组件相同。
98 |
99 | ### DrawerForm 的触发方式是什么?可以使用什么类型的 dom?
100 |
101 | DrawerForm 的触发方式是使用 trigger 参数来触发 Modal 打开,一般是 button。trigger 参数的类型是 ReactNode。
102 |
103 | ### DrawerForm 是否支持调整大小?怎么调整大小?
104 |
105 | 是的,DrawerForm 支持调整大小。调整大小的方式可以通过 resize 参数来实现。resize 参数可以是一个对象,包含 onResize、maxWidth 和 minWidth 属性,也可以是一个布尔值。onResize 用于定义调整大小时的回调函数,maxWidth 和 minWidth 分别用于定义宽度的最大值和最小值。
106 |
107 | ### DrawerForm 的 onFinish 事件是在什么时候触发?触发后会有什么效果?
108 |
109 | DrawerForm 的 onFinish 事件是在提交数据时触发的。当触发 onFinish 事件后,会根据事件处理函数的返回值决定抽屉的行为。如果返回 true,抽屉会关闭,并且如果配置了 destroyOnClose 属性,表单会被重置。如果返回 false,则抽屉会保持打开状态,并且表单不会被重置。如果没有配置 onFinish 事件,提交数据后不会有任何效果。
110 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/form/src/components/StepsForm/index.md:
--------------------------------------------------------------------------------
1 | ## 什么是 StepsForm?
2 |
3 | StepsForm 是一个分步表单组件,通过使用 Provider 来管理子表单的数据。每个子表单都是完整的数据,在 StepsForm 组合成最后的数据。该组件还自带一个进度条和一些管理进度条的相关 API。
4 |
5 | ### StepsForm 继承自哪个组件?它有什么功能?
6 |
7 | StepsForm 继承自 Form.Provider 组件。可以查看[这里](https://ant.design/components/form-cn/#Form.Provider)了解更多关于 Form.Provider 组件的信息。
8 |
9 | StepsForm 还提供了转化 moment 值的功能,这是由 ProForm 提供的功能。因此,在 `onFormFinish` 和 `onFormChange` 事件中,所传递的值都是未经转化的值。你可以使用这些值进行进一步处理或操作。
10 |
11 | ### StepsForm 如何管理进度条?
12 |
13 | StepsForm 自带了一个进度条,以帮助用户了解当前分步表单的进度。此外,StepsForm 还提供了一些管理进度条的相关 API,你可以使用这些 API 来控制进度条的显示和行为。具体的管理进度条的相关 API 可以在官方文档中找到。
14 |
15 | 1. ### `current` 参数的作用是什么?
16 |
17 | - 说明:`current` 是当前表单的步骤数,从 0 开始计数。
18 | - 类型:`number`
19 | - 默认值:0
20 |
21 | 2. ### `onCurrentChange` 是一个什么样的事件?
22 |
23 | - 说明:`onCurrentChange` 是当 `current` 发生改变时触发的事件。
24 | - 类型:`(current:number)=>void`
25 | - 参数:`current`,表示当前的步骤数。
26 |
27 | 3. ### `onFinish` 事件的触发条件是什么?
28 |
29 | - 说明:`onFinish` 是在表单的最后一步提交成功之后触发的事件。
30 | - 类型:`(values:T)=>void | boolean`
31 | - 参数:`values`,表单提交成功后返回的值。
32 | - 返回值:如果返回 `true`,表单将会自动重置(包括 `StepForm` 返回第一步)。
33 |
34 | 4. ### `stepsProps` 是什么?
35 |
36 | - 说明:`stepsProps` 是 `StepsForm` 自带的 `Steps` 组件的属性,使用方式同 [antd](https://ant.design/components/steps-cn/) 组件相同,但去掉了 `current` 和 `onChange`。
37 | - 类型:[props](https://ant.design/components/steps-cn/#API)
38 |
39 | 5. ### `stepFormRender` 的作用是什么?
40 |
41 | - 说明:`stepFormRender` 是用于自定义当前展示的表单的函数,返回的 DOM 会在表单内部显示。
42 | - 参数:`form`,表单的引用对象。
43 | - 返回值:返回一个 `ReactNode`,表示自定义的表单展示内容。
44 |
45 | 6. ### `stepsFormRender` 的作用是什么?
46 |
47 | - 说明:`stepsFormRender` 是用于自定义整个表单区域的函数,返回的 DOM 会在表单的外部显示。
48 | - 参数:`form`,表单的引用对象;`submitter`,表单自带的提交区域。
49 | - 返回值:返回一个 `ReactNode`,表示自定义的表单区域展示内容。
50 |
51 | 7. ### `stepsRender` 的作用是什么?
52 |
53 | - 说明:`stepsRender` 是用于自定义步骤器的函数。
54 | - 参数:`steps`,当前的步骤器;`dom`,DOM 节点。
55 | - 返回值:返回一个 `ReactNode`,表示自定义的步骤器展示内容。
56 |
57 | 8. ### `formRef` 是什么?
58 |
59 | - 说明:`formRef` 是 `StepForm` 引用的对象,方便自定义触发操作。
60 | - 类型:`MutableRefObject`
61 |
62 | ### StepForm 是什么?
63 |
64 | StepForm 是一个基于 ProForm 的组件,提供了与 ProForm 相同的功能,只是在 `onFinish` 回调中支持 Promise。当 `onFinish` 返回 `false` 时,StepForm 不会跳转到下一步。
65 |
66 | ### StepForm 的参数有哪些?
67 |
68 | StepForm 的参数如下:
69 |
70 | - `onFinish`:当表单提交成功时触发的回调函数,类型为`(values:T) => Promise`。
71 |
72 | ### StepForm 的默认值是什么?
73 |
74 | StepForm 没有默认值。
75 |
76 | ### StepForm 的 onFinish 参数是什么类型的?
77 |
78 | StepForm 的 `onFinish` 参数类型为 `(values:T) => Promise`,其中 `values` 表示表单提交时的值。返回的 Promise 中如果是 `false`,则 StepForm 不会跳转到下一步。
79 |
80 | 请注意,以上内容的示例是基于 ProForm 组件,详情请参考 [ProForm](/components/form)。
81 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/layout/src/components/PageHeader/index.md:
--------------------------------------------------------------------------------
1 | ### 什么是页头(PageHeader)组件?
2 |
3 | 页头(PageHeader)组件位于页容器中,页容器的顶部,起到了内容概览和引导页级操作的作用。它包括了面包屑、标题、页面内容简介、页面级操作等元素,以及页面级导航组件。
4 |
5 | ### 页头的作用是什么?
6 |
7 | 页头的作用是提供页面的概览和引导,使用户能够快速了解页面的内容和可用的操作。通过显示面包屑、标题和简介,以及提供页面级别的操作按钮和导航,页头组件帮助用户更好地理解页面的结构和功能,并提供直接进入下一步操作的入口。
8 |
9 | ### 页头包含哪些元素?
10 |
11 | 页头包含以下几个元素:
12 |
13 | - 面包屑:显示当前页面在网站或应用程序结构中的位置。
14 | - 标题:页面的主要标题,用于描述页面的内容。
15 | - 页面内容简介:对页面主要内容的简要描述或说明。
16 | - 页面级操作:与页面内容相关的操作按钮,例如编辑、保存或分享。
17 | - 页面级导航:链接到页面内其他部分的导航组件,例如标签页或侧边栏菜单。
18 |
19 | 通过组合这些元素,页头组件提供了一个整体的上部信息区域,以帮助用户快速了解页面内容和可用的操作选项。
20 |
21 | ### PageHeader 组件有哪些参数?
22 |
23 | 参数列表如下:
24 |
25 | | 参数 | 说明 | 类型 | 默认值 | 版本 |
26 | | --- | --- | --- | --- | --- |
27 | | avatar | 标题栏旁的头像 | [AvatarProps](/components/avatar/) | - | |
28 | | backIcon | 自定义 back icon ,如果为 false 不渲染 back icon | ReactNode \| boolean | \ | |
29 | | breadcrumb | 面包屑的配置 | [Breadcrumb](/components/breadcrumb/) | - | |
30 | | breadcrumbRender | 自定义面包屑区域的内容 | `(props, originBreadcrumb) => ReactNode` | - | 4.11.0 |
31 | | extra | 操作区,位于 title 行的行尾 | ReactNode | - | |
32 | | footer | PageHeader 的页脚,一般用于渲染 TabBar | ReactNode | - | |
33 | | ghost | pageHeader 的类型,将会改变背景颜色 | boolean | true | |
34 | | subTitle | 自定义的二级标题文字 | ReactNode | - | |
35 | | tags | title 旁的 tag 列表 | [Tag](/components/tag/)\[] \| [Tag](/components/tag/) | - | |
36 | | title | 自定义标题文字 | ReactNode | - | |
37 | | onBack | 返回按钮的点击事件 | () => void | - | |
38 |
39 | ### PageHeader 组件的 ghost 属性是干什么用的?
40 |
41 | `ghost` 属性用于设置 PageHeader 的类型,将会改变背景颜色。默认值为 `true`。
42 |
43 | ### PageHeader 组件的 onBack 属性是什么?
44 |
45 | `onBack` 属性为返回按钮的点击事件,即当用户点击返回按钮时触发的回调函数。
46 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/layout/src/components/WaterMark/index.md:
--------------------------------------------------------------------------------
1 | ### 水印的宽度是多少,默认值是多少?
2 |
3 | 水印的宽度是一个数字类型的参数,用于指定水印的宽度。默认值是 120。
4 |
5 | ### 水印的高度是多少,默认值是多少?
6 |
7 | 水印的高度是一个数字类型的参数,用于指定水印的高度。默认值是 64。
8 |
9 | ### 水印绘制时旋转的角度是多少,默认值是多少?
10 |
11 | 水印绘制时旋转的角度是一个数字类型的参数,单位是 °(度)。默认值是 -22。
12 |
13 | 问题 4:
14 |
15 | ### 水印的图片源是什么?
16 |
17 | 水印的图片源是一个字符串类型的参数,用于指定水印使用的图片。建议导出 2 倍或 3 倍图,并优先使用图片来渲染水印。
18 |
19 | 问题 5:
20 |
21 | ### 水印元素的 z-index 是多少,默认值是多少?
22 |
23 | 水印元素的 z-index 是一个数字类型的参数,用于指定追加的水印元素的层级。默认值是 9。
24 |
25 | 问题 6:
26 |
27 | ### 水印的文字内容是什么?
28 |
29 | 水印的文字内容可以是一个字符串类型的参数,也可以是一个字符串数组类型的参数。用于指定水印的文字内容。
30 |
31 | 问题 7:
32 |
33 | ### 水印的文字颜色是什么,默认值是多少?
34 |
35 | 水印的文字颜色是一个字符串类型的参数,用于指定水印的文字颜色。默认值是 `rgba(0,0,0,.15)`。
36 |
37 | 问题 8:
38 |
39 | ### 水印的文字大小是多少,默认值是多少?
40 |
41 | 水印的文字大小可以是一个字符串类型的参数,也可以是一个数字类型的参数。用于指定水印的文字大小。默认值是 16。
42 |
43 | 1. 什么是 markStyle?
44 |
45 | - markStyle 是水印层的样式。
46 | - 类型为 React.CSSProperties。
47 | - 默认值为 -。
48 | - 在 2.3.0 版本引入。
49 |
50 | 2. 什么是 markClassName?
51 |
52 | - markClassName 是水印层的类名。
53 | - 类型为 string。
54 | - 默认值为 -。
55 | - 在 2.3.0 版本引入。
56 |
57 | 3. 什么是 gapX?
58 |
59 | - gapX 是水印之间的水平间距。
60 | - 类型为 number。
61 | - 默认值为 212。
62 | - 在 2.4.0 版本引入。
63 |
64 | 4. 什么是 gapY?
65 |
66 | - gapY 是水印之间的垂直间距。
67 | - 类型为 number。
68 | - 默认值为 222。
69 | - 在 2.4.0 版本引入。
70 |
71 | 5. 什么是 offsetLeft?
72 |
73 | - offsetLeft 是水印在 canvas 画布上绘制的水平偏移量。
74 | - 正常情况下,水印绘制在中间位置,即 `offsetLeft = gapX / 2`。
75 | - 类型为 number。
76 | - 默认值为 `offsetLeft = gapX / 2`。
77 | - 在 2.4.0 版本引入。
78 |
79 | 6. 什么是 offsetTop?
80 |
81 | - offsetTop 是水印在 canvas 画布上绘制的垂直偏移量。
82 | - 正常情况下,水印绘制在中间位置,即 `offsetTop = gapY / 2`。
83 | - 类型为 number。
84 | - 默认值为 `offsetTop = gapY / 2`。
85 | - 在 2.4.0 版本引入。
86 |
87 | 7. 问题:这个组件是用来做什么的?这个组件是用来展示一个带有水印的图片的。
88 |
89 | 8. 问题:图片的地址是什么?图片的地址是"https://gw.alipayobjects.com/zos/alicdn/joeXYy8j3/jieping2021-01-11%252520xiawu4.47.15.png"。
90 |
91 | 9. 问题:图片的宽度是多少?图片的宽度是 100%。
92 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/list/src/components/list.md:
--------------------------------------------------------------------------------
1 | ## ProList 与 antd 的 List 有什么区别?
2 |
3 | ProList 与 antd 的 List 相比,API 设计上更像 Table,使得可以通过配置化的方式快速定义数据项的展现形式。另外,ProList 基于 ProTable 实现,除了 Table 相关的 API 以外, ProList 还支持大部分 ProTable 的 API。
4 |
5 | ### ProList 的常用参数有哪些?
6 |
7 | ProList 的常用参数如下:
8 |
9 | - dataSource: 与 antd 相同的配置,表示数据源,类型为数组,默认值为 `false`。
10 | - actionRef: Table action 的引用,便于自定义触发,类型为 MutableRefObject。
11 | - metas: 列表项配置,类似 Table 中的 columns,类型为 Metas。
12 | - rowKey: 行的 key,一般是行 id,类型为 string 或者 `(row,index)=>string`,默认值为 `'id'`。
13 | - headerTitle: 列表头部主标题,类型为 React.ReactNode。
14 | - loading: 是否加载中,类型为 boolean 或者 `(item: any) => boolean`,默认值为 `false`。
15 | - split: 是否有分割线,类型为 boolean,默认值为 `false`。
16 | - rowSelection: 与 antd 相同的配置,表示行选择,类型为对象或者布尔值,默认值为 false。
17 | - expandable: 与 antd 相同的配置,表示可展开行的配置,类型为对象或者 `false`。
18 | - showActions: 何时展示 actions,CardList 模式下不生效,类型为 `'hover'` 或者 `'always'`,默认值为 `'always'`。
19 | - showExtr 何时展示 extra,类型为 `'hover'` 或者 `'always'`,默认值为 `'always'`。
20 | - onRow: 与 antd 相同的配置,当用户传入 `grid` 属性时,列表将会以卡片模式进行渲染,此事件将不会触发,请使用 `onItem`,类型为 `function(record, index)`。
21 | - onItem: 与 antd 相同的配置,表示在所有类型点击某个项目都会触发该事件,类型为 `function(record, index)`。
22 | - rowClassName: 自定义列表行的类名,类型为字符串或者 `(row, index) => string`。
23 | - itemHeaderRender: 自定义每一列的 header,不同于 itemRender 的是它会保留多选和展开收起。
24 | - itemCardProps: 自定义卡片列表的 proCard props,只在卡片列表下生效。
25 |
26 | ### 如何使用 itemHeaderRender 和 itemCardProps?
27 |
28 | itemHeaderRender 和 itemCardProps 是 ProList 的两个参数。
29 |
30 | - itemHeaderRender 是用来自定义每一列的 header,与 itemRender 不同的是,它会保留多选和展开收起。你可以将自定义的组件传入到 itemHeaderRender 中,实现个性化的列表列头显示。
31 |
32 | - itemCardProps 是用来自定义卡片列表的 proCard 的 props,只在卡片列表下生效。你可以传入一个对象,设置 proCard 的属性,从而自定义卡片列表的显示样式。
33 |
34 | ### Metas.[Meta] 通用 API
35 |
36 | ### 参数
37 |
38 | - **dataIndex**: 数据在数据项中对应的路径,支持通过数组查询嵌套路径
39 |
40 | - 类型: `string` | `string[]`
41 | - 默认值: `-`
42 |
43 | - **valueType**: 值的类型,和 ProTable 一致
44 |
45 | - 类型: `'text'` | `'date'` ...
46 | - 默认值: `'text'`
47 |
48 | - **render**: 自定义渲染函数
49 | - 类型: `(text: React.ReactNode, record: T, index: number) => React.ReactNode | React.ReactNode[]`
50 | - 默认值: `-`
51 |
52 | ### 说明
53 |
54 | Metas.[Meta] 是一个通用 API,用于配置 ProTable 的元数据项。
55 |
56 | ### 示例
57 |
58 | ```jsx
59 | import { ProTable } from 'antd';
60 |
61 | const columns = [
62 | {
63 | title: '姓名',
64 | dataIndex: 'name',
65 | },
66 | {
67 | title: '年龄',
68 | dataIndex: 'age',
69 | valueType: 'number',
70 | },
71 | {
72 | title: '操作',
73 | render: (text, record, index) => (
74 | handleEdit(record)}>编辑
75 | ),
76 | },
77 | ];
78 |
79 | const dataSource = [
80 | {
81 | name: '张三',
82 | age: 18,
83 | },
84 | {
85 | name: '李四',
86 | age: 20,
87 | },
88 | ];
89 |
90 | const MyTable = () => {
91 | return ;
92 | };
93 | ```
94 |
95 | ### 参考链接
96 |
97 | - [ProTable API 文档](https://procomponents.ant.design/components/table#protable)
98 |
99 | ### `dataSource` 的字段类型有哪些?
100 |
101 | `dataSource` 的字段类型有 `'new'`、`'top'` 和 `'inline'`。
102 |
103 | ### `dataSource` 字段类型的含义是什么?
104 |
105 | - `'new'` 表示数据源是新的。
106 | - `'top'` 表示数据源是热门的。
107 | - `'inline'` 表示数据源是内联的。
108 |
109 | ### `dataIndex` 参数的默认值是什么?
110 |
111 | `dataIndex` 参数的默认值是 `'type'`。
112 |
113 | ### Metas.description 的参数说明是什么?
114 |
115 | Metas.description 的参数说明如下:
116 |
117 | | 参数 | 说明 | 类型 | 默认值 |
118 | | :-------- | :--- | :--- | :-------------- |
119 | | dataIndex | - | - | `'description'` |
120 |
121 | 其中,`dataIndex` 参数表示元数据(Metas)的描述信息。默认值为 `'description'`。
122 |
123 | ### Metas.actions 的参数 dataIndex 是什么意思?
124 |
125 | 参数 dataIndex 在 Metas.actions 中的作用是什么?
126 |
127 | ### Metas.actions 的参数 cardActionProps 如何使用?
128 |
129 | 参数 cardActionProps 在 Metas.actions 中有什么用途?如何使用它?
130 |
131 | ### Metas.actions 的参数 cardActionProps 的默认值是什么?
132 |
133 | 参数 cardActionProps 在 Metas.actions 中的默认值是什么?
134 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/skeleton/src/components/skeleton.md:
--------------------------------------------------------------------------------
1 | ## QA 如何使用列表页面?
2 |
3 | 要使用列表页面,你可以根据下面的步骤进行操作:
4 |
5 | 1. 打开列表页面的源代码文件`list.tsx`。
6 |
7 | 2. 查看源代码文件中的示例代码,可以参考示例代码进行调整。
8 |
9 | 3. 根据项目需求,修改列表页面的数据和样式。
10 |
11 | 4. 运行项目,打开列表页面,查看效果。
12 |
13 | ### QA 如何使用静态列表?
14 |
15 | 要使用静态列表,你可以按照以下步骤进行操作:
16 |
17 | 1. 打开静态列表的源代码文件`list.static.tsx`。
18 |
19 | 2. 查看源代码文件中的示例代码,可以参考示例代码进行调整。
20 |
21 | 3. 根据项目需求,修改静态列表的数据和样式。
22 |
23 | 4. 运行项目,打开静态列表页面,查看效果。
24 |
25 | 如果需要进行调试,可以在代码中添加`debug`属性。
26 |
27 | ### QA 如何使用结果页?
28 |
29 | 要使用结果页,你可以按照以下步骤进行操作:
30 |
31 | 1. 打开结果页的源代码文件`result.tsx`。
32 |
33 | 2. 查看源代码文件中的示例代码,可以参考示例代码进行调整。
34 |
35 | 3. 根据项目需求,修改结果页的数据和样式。
36 |
37 | 4. 运行项目,打开结果页,查看效果。
38 |
39 | 希望以上信息对你有帮助!如果有任何问题,请随时提问。
40 |
41 | ### 骨架屏的不同类型有哪些?
42 |
43 | 参数 `type` 控制着骨架屏的类型,可选值为 `'list'`、`'result'`、`'descriptions'`。分别表示列表类型的骨架屏、结果类型的骨架屏和描述类型的骨架屏。默认值为 `'list'`。
44 |
45 | ### 如何控制骨架屏的动态显示?
46 |
47 | 参数 `active` 控制骨架屏是否显示动态效果,可以是一个布尔值,`true` 表示显示动态效果,`false` 表示不显示。默认值为 `true`。
48 |
49 | ### 是否可以为骨架屏添加 pageHeader?
50 |
51 | 参数 `pageHeader` 控制是否显示 pageHeader 的骨架屏,只有在类型为 `descriptions` 或 `list` 时才有效。该参数不需要传入具体的值,只需要填写 `-` 即可。
52 |
53 | ### 统计信息骨架屏的数量如何控制?
54 |
55 | 参数 `statistic` 用于控制统计信息骨架屏的数量,可以是一个数字或布尔值 `false`。当传入一个数字时,表示显示指定数量的统计信息骨架屏;当传入 `false` 时,表示不显示统计信息骨架屏。
56 |
57 | ### 列表骨架屏的数量如何控制?
58 |
59 | 参数 `list` 用于控制列表骨架屏的数量,可以是一个数字或布尔值 `false`。当传入一个数字时,表示显示指定数量的列表骨架屏;当传入 `false` 时,表示不显示列表骨架屏。
60 |
61 | ### 是否可以为列表骨架屏添加操作栏?
62 |
63 | 参数 `toolbar` 控制是否显示列表的操作栏骨架屏,可以是一个布尔值,`true` 表示显示操作栏骨架屏,`false` 表示不显示。该参数不需要传入具体的值,只需要填写 `-` 即可。
64 |
65 | ### 如何自定义编辑框的表现?
66 |
67 | 参数 `renderFormItem` 用于自定义在编辑模式下的表单项的显示形式,可以传入一个自定义的 DOM 元素。
68 |
69 | ### 如何自定义只读模式下的表现形式?
70 |
71 | 参数 `render` 用于自定义在只读模式下的表现形式,可以传入一个自定义的 DOM 元素。
72 |
73 | 请注意,所有参数均有默认值,具体的默认值请查看上方的表格。
74 |
--------------------------------------------------------------------------------
/docs/pro-components/packages/table/src/components/DragSortTable/index.md:
--------------------------------------------------------------------------------
1 | 1. 什么是 dragSortKey 属性?
2 |
3 | - 描述:配置 dragSortKey 属性后,在对应的行显示拖拽排序把手,允许进行拖拽排序。
4 | - 类型:string
5 | - 默认值:-
6 |
7 | 2. 如何自定义拖动排序把手的渲染函数 dragSortHandlerRender?
8 |
9 | - 描述:通过配置 dragSortHandlerRender 参数,可以自定义渲染拖动排序把手的函数。如果配置了 dragSortKey,但未配置 dragSortHandlerRender,则会使用默认的把手图标进行渲染。
10 | - 类型:(rowDatT, idx: number) => React.ReactNode
11 | - 默认值: ` `
12 |
13 | 3. onDragSortEnd 是用来做什么的?
14 | - 描述:onDragSortEnd 是拖动排序完成后的回调函数,可以在该函数中对拖动排序后的数据进行处理。
15 | - 类型:(beforeIndex: number, afterIndex: number, newDataSource: T[]) => Promise | void
16 | - 默认值:-
17 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/blog/code-splitting.md:
--------------------------------------------------------------------------------
1 | ### Umi 4 内置了哪些代码分包策略?
2 |
3 | Umi 4 内置了以下代码分包策略:
4 |
5 | - `all`:将所有路由页面拆分为一个个独立的 JS 文件,每个文件都是一个独立的分包。
6 | - `asyncChunks`:根据异步加载的路由页面进行分包,每个异步加载的路由页面都是一个独立的分包。
7 | - `granularChunks`:根据每个组件或页面的大小进行分包,将大组件或页面拆分为多个独立的分包。
8 | - `children`:将路由页面的子页面拆分为一个个独立的分包。
9 |
10 | 你可以通过配置 `codeSplitting` 的 `jsStrategy` 字段来指定使用哪种代码分包策略。
11 |
12 | ### 如何手动进行更细致的分包?
13 |
14 | 如果你需要手动进行更细致的分包,可以通过配置 `dynamicImport` 字段来实现。在 routes 配置中,可以将 `dynamicImport` 设置为一个函数,该函数返回一个 promise,该 promise 解析后返回组件实例。
15 |
16 | 例如:
17 |
18 | ```ts
19 | export default [
20 | {
21 | path: '/user',
22 | component: dynamic(() => import('./user')),
23 | },
24 | ];
25 | ```
26 |
27 | 其中,`dynamic` 函数用于将组件包装为一个动态加载的组件。
28 |
29 | 这样配置后,会自动将 `/user` 页面以及相关依赖进行分包,实现按需加载的效果。
30 |
31 | ### 如何手动拆分代码?
32 |
33 | 当项目的产物体积变得较大时,我们可以考虑手动拆分代码。下面是一个示例:
34 |
35 | 在 React 应用中,我们可以使用 `lazy` 和 `Suspense` 实现手动拆分。首先,我们需要引入 `lazy` 和 `Suspense`:
36 |
37 | ```ts
38 | import { lazy, Suspense } from 'react';
39 | ```
40 |
41 | 接下来,我们可以使用 `lazy` 方法来异步加载我们要拆分的组件。这样,只有当组件被需要时才会被加载。例如,下面的代码将会把 `./Page` 组件拆分出去:
42 |
43 | ```ts
44 | const Page = lazy(() => import('./Page'));
45 | ```
46 |
47 | 最后,我们需要在组件中使用 `Suspense` 组件来包裹我们需要异步加载的组件,并提供一个 loading 的回退组件:
48 |
49 | ```ts
50 | export default function MyComponent() {
51 | return (
52 | loading...}>
53 |
54 |
55 | )
56 | }
57 | ```
58 |
59 | 通过手动拆分代码,我们可以按需加载较大的第三方库或组件,从而减小项目的总体积。这有助于提升应用的性能和加载速度。
60 |
61 | ### 为什么要手动拆分代码?
62 |
63 | 手动拆分代码是为了应对项目产物体积变大的情况。当应用中引入了较大的第三方库或组件时,整个应用的体积可能会变得很大,导致加载时间变长。
64 |
65 | 通过手动拆分,我们可以将原本一次性加载的组件拆分成多个部分,只在需要时进行加载。这样可以减小初始加载的体积,提升应用的加载速度和性能。
66 |
67 | 手动拆分代码也有助于按需加载,只加载当前页面所需的组件,避免不必要的资源消耗。
68 |
69 | ### 如何手动拆分使用了较大第三方库的组件?
70 |
71 | 当我们的组件依赖于较大的第三方库时,可以使用手动拆分来实现按需加载。下面是一个示例:
72 |
73 | 假设我们的组件需要依赖第三方库 `lodash`,我们可以按如下步骤来手动拆分:
74 |
75 | 1. 首先,引入 `lazy` 和 `Suspense`:
76 |
77 | ```ts
78 | import { lazy, Suspense } from 'react';
79 | ```
80 |
81 | 2. 接下来,使用 `lazy` 方法来异步加载我们要拆分的组件。例如,下面的代码将会拆分出一个组件 `MyComponent`:
82 |
83 | ```ts
84 | const MyComponent = lazy(() => import('./MyComponent'));
85 | ```
86 |
87 | 3. 最后,在使用该组件的地方,使用 `Suspense` 组件来包裹我们需要异步加载的组件,并提供一个 loading 的回退组件:
88 |
89 | ```ts
90 | export default function App() {
91 | return (
92 | Loading...}>
93 |
94 |
95 | )
96 | }
97 | ```
98 |
99 | 通过以上步骤,我们可以手动拆分使用了较大第三方库的组件,并且在需要时进行按需加载。这样可以减小项目的体积,提升应用的性能和加载速度。
100 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/blog/mfsu-faster-than-vite.md:
--------------------------------------------------------------------------------
1 | ### Vite 和 MFSU 的区别是什么?
2 |
3 | Vite 是一种快速的现代前端构建工具,它利用浏览器原生 ES 模块的能力,在开发环境下实现了按需编译和快速冷启动。相比之下,MFSU 是一种优化方案,它通过对模块进行按需编译和缓存,提高了 Webpack 在开发环境下的构建速度。
4 |
5 | ### Umi 4 中支持的构建方式有哪些?
6 |
7 | Umi 4 同时支持 webpack 和 vite 两种构建方式。这样可以让开发者可以根据项目需求选择合适的构建工具,既可以享受 Webpack 的功能和生态,又可以获得 Vite 的速度优势。
8 |
9 | ### MFSU with esbuild 模式与其他模式相比有什么优势?
10 |
11 | 根据测试结果,在多个场景下,MFSU with esbuild 模式在速度方面表现较优。它利用了 MFSU(Module Federation Server-Usage),对模块进行按需编译和缓存。结合 esbuild,可以进一步提高构建速度。根据测试数据,这种模式在无缓存的冷启动、有缓存的热启动、修改代码后的热更新等方面都表现出优秀的性能。
12 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/blog/umi-4-rc.md:
--------------------------------------------------------------------------------
1 | ### Umi 4 RC 发布的新功能有哪些?
2 |
3 | Umi 4 RC发布了以下新功能:
4 |
5 | - 新官网和文档
6 | - MFSU V3 & 默认开启
7 | - 双构建引擎和ESMi
8 | - Webpack 5
9 | - React Router 6 & 新路由
10 | - 最佳实践迭代
11 | - 依赖预打包
12 | - Umi Max
13 | - Low Import 研发模式
14 | - 强约束功能集成
15 | - Import All From Umi 迭代
16 | - srcTranspiler 和 depTranspiler
17 | - jsMinifier 和 cssMinifier
18 | - 应用元数据
19 | - 微生成器
20 | - 贴心小改进
21 |
22 | 还有一些计划在正式版发布之前做的事情,包括api route、umi server and adapter、route loader、稳定的 lint、更多命令、组件研发 father 4、文档工具 dumi 2等。
23 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/boilerplate.md:
--------------------------------------------------------------------------------
1 | ### 如何在当前目录下创建一个 `my-umi-app` 的项目?
2 |
3 | 你可以使用以下命令在当前目录创建一个名为 `my-umi-app` 的 Umi 项目:
4 |
5 | ```
6 | pnpm create umi my-umi-app
7 | ```
8 |
9 | 运行这个命令后,会自动安装 `create-umi` 脚手架,并创建一个最基本的 Umi 项目。
10 |
11 | ### 在创建项目时,有哪些可选项需要注意?
12 |
13 | 在运行 `pnpm create umi my-umi-app` 命令时,会出现两个可选项:
14 |
15 | 1. 选择 Npm 客户端
16 |
17 | 你可以从以下几个选项中选择你习惯使用的 Node 依赖管理工具:
18 |
19 | - npm
20 | - cnpm
21 | - tnpm
22 | - yarn
23 | - pnpm(Umi 官方推荐)
24 |
25 | 2. 选择 Npm 源
26 |
27 | 你可以从以下几个选项中选择你想要使用的 Npm 源:
28 |
29 | - npm
30 | - taobao
31 |
32 | 选择好这两个选项后,脚手架会根据你的选择生成一个最基本的 Umi 项目,并自动安装依赖。
33 |
34 | ### 生成的项目结构是怎样的?
35 |
36 | 创建完项目后,你会在当前文件夹下看到一个名为 `my-umi-app` 的文件夹。这个文件夹包含了以下文件和文件夹:
37 |
38 | - package.json:Umi 项目的配置文件。
39 | - pnpm-lock.yaml:pnpm 安装依赖的锁定文件。
40 | - src/assets:存放项目的静态资源文件。
41 | - src/layouts:存放项目的布局文件。
42 | - src/pages:存放项目的页面文件。
43 | - tsconfig.json:TypeScript 的配置文件。
44 | - typings.d.ts:TypeScript 的类型声明文件。
45 |
46 | 这样,你就成功地一键初始化了一个 Umi 项目。
47 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/client-loader.md:
--------------------------------------------------------------------------------
1 | ## 如何在路由文件中使用 `clientLoader` 函数?
2 |
3 | 要在路由文件中使用 `clientLoader` 函数,需要完成以下步骤:
4 |
5 | 1. 在路由文件(如 `pages/.../some_page.tsx`)中,除了默认导出页面组件外,再导出一个名为 `clientLoader` 的异步函数。
6 | 2. 在 `clientLoader` 函数内部,完成路由数据加载的逻辑,可以通过 `fetch` 或其他方式获取数据。
7 | 3. 在页面组件中,通过调用 `useClientLoaderData` 钩子函数,获取 `clientLoader` 函数返回的数据。
8 |
9 | ### 如何使用 `useClientLoaderData` 钩子函数获取 `clientLoader` 函数返回的数据?
10 |
11 | 要使用 `useClientLoaderData` 钩子函数获取 `clientLoader` 函数返回的数据,可以按照以下步骤进行操作:
12 |
13 | 1. 在需要获取数据的页面组件中,引入 `useClientLoaderData` 钩子函数。
14 | 2. 在页面组件中调用 `useClientLoaderData` 钩子函数,将返回的 `data` 解构赋值给变量。
15 | 3. 在页面组件中使用该变量来显示相应的数据。
16 |
17 | 注意,`useClientLoaderData` 钩子函数是通过 umi 提供的自定义 hooks `useClientLoaderData` 来实现的。
18 |
19 | ### 如何在页面组件中显示 `clientLoader` 函数返回的数据?
20 |
21 | 要在页面组件中显示 `clientLoader` 函数返回的数据,可以按照以下步骤进行操作:
22 |
23 | 1. 在页面组件中定义一个变量,例如 `data`,用于保存 `clientLoader` 函数返回的数据。
24 | 2. 在页面组件中调用 `useClientLoaderData` 钩子函数,将返回的 `data` 解构赋值给变量。
25 | 3. 在页面组件的 JSX 内容中使用该变量来渲染相应的数据。
26 |
27 | 例如,在一个 `SomePage` 组件中,可以使用以下代码来显示 `clientLoader` 函数返回的数据:
28 |
29 | ```tsx
30 | import { useClientLoaderData } from 'umi';
31 |
32 | export default function SomePage() {
33 | const { data } = useClientLoaderData();
34 | return {data};
35 | }
36 | ```
37 |
38 | 在上述代码中,`data` 变量保存了 `clientLoader` 函数返回的数据,并在 `` 中进行了展示。
39 |
40 | ### 如何优化三层嵌套路由的数据请求?
41 |
42 | 在三层嵌套路由的场景中,瀑布流式的数据请求会严重影响用户的体验。为了提高页面渲染速度,我们可以采用以下优化方法:
43 |
44 | 1. 将组件请求数据的程序提取到 `clientLoader` 中。这样,Umi 可以并行地请求这些数据,而不必等待前一层路由的组件加载完成。
45 |
46 | 优化前的瀑布流请求示意图如下:
47 |
48 | 
49 |
50 | 优化后的并行请求示意图如下:
51 |
52 | 
53 |
54 | 通过将组件请求数据的程序提取到 `clientLoader` 中,可以避免瀑布流式的数据请求,提高页面加载速度,提升用户体验。
55 |
56 | 例如,将第一层路由的组件请求数据的逻辑提取到 `clientLoader` 中,使得第一层路由的组件可以并行加载,不必等待数据请求完成。
57 |
58 | 2. 合理使用数据缓存。在嵌套路由场景中,可能会存在多次加载同一组件的情况。为了避免重复加载和数据请求,可以合理使用数据缓存。可以通过 `dva` 的 `loading` 属性来判断数据是否已经加载完成,如果已经加载完成,则不再进行重复请求。
59 |
60 | 例如,当第一层路由的数据请求完成后,可以将请求结果保存到应用的状态管理中,下次再加载该组件时,先从状态管理中获取数据,避免重复请求。
61 |
62 | 3. 使用异步组件加载。在嵌套路由场景中,可以使用异步组件加载的方式来提高页面渲染速度。异步组件加载可以将页面的组件划分为更小的模块,按需加载,减少首屏加载所需的资源。
63 |
64 | 例如,将各个路由的组件按照层级划分为多个异步组件,根据路由的层级加载对应的异步组件,可以提高页面渲染速度,减少不必要的资源加载。
65 |
66 | 通过以上优化方法,可以有效地提高三层嵌套路由场景下页面的加载速度,提升用户的体验。
67 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/debug.md:
--------------------------------------------------------------------------------
1 | ### 如何调试 dev 阶段的构建产物?
2 |
3 | 要调试项目的构建产物,在这里以 `umi.js` 为例,你可以按照以下步骤进行操作:
4 |
5 | 1. 首先,将原来的 `umi.js` 下载到你的当前项目根目录下。
6 |
7 | 2. 然后,根据你的调试需要,对该文件进行编辑。
8 |
9 | 3. 接下来,在浏览器中刷新你的项目页面,此时项目会开始使用根目录下的 `umi.js` 文件。
10 |
11 | 4. 如果你调试完毕并想要恢复原状,只需删除根目录下的 `umi.js` 文件即可。
12 |
13 | 希望以上信息可以帮助到你!
14 |
15 | ### XSwitch 是什么?如何使用?
16 |
17 | XSwitch 是一个 Chrome 插件,提供了在特定的域名环境调试或验证代码的功能。你可以通过 [XSwitch Chrome 插件下载链接](https://chrome.google.com/webstore/detail/xswitch/idkjhjggpffolpidfkikidcokdkdaogg) 下载并安装 XSwitch 插件。安装完插件后,在特定的域名环境下,你可以通过 XSwitch 配置转发规则,替换特定资源的动态地址,以便调试或验证你的本地代码。
18 |
19 | ### 如何使用 XSwitch 配置转发规则调试本地代码?
20 |
21 | 如果你想在线上项目地址 `https://www.myproject.com` 上调试本地代码,可以使用 XSwitch 配置转发规则来实现。在配置转发规则之前,请确保你的本地开发环境已经启动,并设置了环境变量 `SOCKET_SERVER`。下面是具体的步骤:
22 |
23 | 1. 使用环境变量 `SOCKET_SERVER` 启动本地环境(防止因为连接不上 socket server 导致页面不断刷新)。示例代码如下:
24 |
25 | ```bash
26 | $SOCKET_SERVER=http://127.0.0.1:8000/ npx umi dev
27 | ```
28 |
29 | 2. 打开 XSwitch 插件,在转发规则中配置相应的资源替换规则。示例配置如下:
30 |
31 | ```json
32 | {
33 | "proxy": [
34 | [
35 | "https://www.myproject.com/umi.2c8a01df.js",
36 | "http://127.0.0.1:8000/umi.js"
37 | ],
38 | ["https://www.myproject.com/(.*.js)", "http://127.0.0.1:8000/$1"],
39 | [
40 | "https://www.myproject.com/umi.ae8b10e0.css",
41 | "http://127.0.0.1:8000/umi.css"
42 | ]
43 | ]
44 | }
45 | ```
46 |
47 | 这里的配置表示将 `https://www.myproject.com/umi.2c8a01df.js` 替换为本地开发环境的 `http://127.0.0.1:8000/umi.js`,将 `https://www.myproject.com/` 下的所有以 `.js` 结尾的资源替换为本地相同路径的资源,将 `https://www.myproject.com/umi.ae8b10e0.css` 替换为本地开发环境的 `http://127.0.0.1:8000/umi.css`。 3. 刷新页面,正式域名下的内容就被替换了,你就可以方便地在特定环境下调试你的代码了。
48 |
49 | ### 如何退出 XSwitch 的调试模式?
50 |
51 | 如果你调试完毕或者不需要继续调试,你可以关闭 XSwitch 插件的功能来退出调试模式。在 Chrome 浏览器中,点击 XSwitch 插件图标,即可关闭插件功能。
52 |
53 | ### 如何保存 XSwitch 的转发规则?
54 |
55 | 如果你经常使用 XSwitch,并且希望保存你的转发规则,可以新建一个规则保存起来。在 XSwitch 插件中,你可以点击新建规则按钮,并输入规则名称,将你的转发规则保存起来。
56 |
57 | ### 如何找到 XSwitch 插件图标?
58 |
59 | XSwitch 插件的图标一般会显示在 Chrome 浏览器的工具栏中。如果 XSwitch 插件的图标没有显示在工具栏中,你可以在 Chrome 浏览器的扩展程序管理页面找到 XSwitch,并将其固定到工具栏中。
60 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/prepare.md:
--------------------------------------------------------------------------------
1 | ### Umi.js 需要使用 Node.js 进行开发吗?
2 |
3 | 是的,Umi.js 需要使用 Node.js 来进行开发。请确保电脑已经安装了 Node.js,并且版本在 14 以上。如果还没有安装,你可以前往 [Node.js 官网](https://nodejs.org/zh-cn/) 下载并安装。
4 |
5 | ### 如何在 macOS 上安装 Node.js?
6 |
7 | 在 macOS 环境下,我们建议使用 [nvm](https://github.com/nvm-sh/nvm) 来管理 Node.js 的版本。你可以使用以下命令来安装 nvm 和 Node.js:
8 |
9 | ```bash
10 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
11 | nvm -v
12 |
13 | 0.39.1
14 | ```
15 |
16 | 安装完成后,你可以使用以下命令来安装指定版本的 Node.js:
17 |
18 | ```bash
19 | nvm install 16
20 | nvm use 16
21 | ```
22 |
23 | 然后,你可以使用以下命令来检查是否安装成功并且安装了正确的版本:
24 |
25 | ```bash
26 | node -v
27 |
28 | v16.14.0
29 | ```
30 |
31 | ### 如何在 Windows 上安装 Node.js?
32 |
33 | 在 Windows 环境下,我们建议使用 [nvm-windows](https://github.com/coreybutler/nvm-windows) 来管理 Node.js 的版本。你可以前往该项目的 GitHub 页面上进行下载和安装。
34 |
35 | 安装完成后,你可以使用以下命令来安装指定版本的 Node.js:
36 |
37 | ```bash
38 | nvm install 16
39 | nvm use 16
40 | ```
41 |
42 | 然后,你可以使用以下命令来检查是否安装成功并且安装了正确的版本:
43 |
44 | ```bash
45 | node -v
46 |
47 | v16.14.0
48 | ```
49 |
50 | 请根据你的操作系统选择适合的安装方式,并确保安装正确版本的 Node.js。
51 |
52 | ### 什么是 npm 依赖管理工具?
53 |
54 | npm(Node Package Manager)是 Node.js 自带的依赖管理工具,用于管理和发布 JavaScript 代码包。它是一种将代码包进行组织、分享和复用的解决方案。
55 |
56 | ### 为什么 Umi.js 推荐使用 pnpm 来管理依赖?
57 |
58 | Umi.js 是一个基于 React 的可插拔企业级前端应用框架,它推荐使用 pnpm 来管理依赖。pnpm 是一种快速、节省磁盘空间的依赖管理工具,相比 npm 和 yarn,在安装和更新依赖时更快更高效。
59 |
60 | ### 如何安装 pnpm?
61 |
62 | 使用以下命令可以安装 pnpm:
63 |
64 | ```bash
65 | curl -fsSL https://get.pnpm.io/install.sh | sh -
66 | ```
67 |
68 | ### 如何检查是否成功安装 pnpm?
69 |
70 | 安装完成后,可以使用以下命令来检查是否成功安装了 pnpm:
71 |
72 | ```bash
73 | pnpm -v
74 |
75 | 7.3.0
76 | ```
77 |
78 | 若返回的版本号与预期一致,则说明 pnpm 安装成功。
79 |
80 | ### 如何安装 Node.js 和 pnpm?
81 |
82 | 安装完 Node.js 和 pnpm 后,你就可以开始前端开发了。以下是安装步骤:
83 |
84 | 1. 首先,你需要下载 Node.js 的安装包。你可以在 Node.js 的官方网站 [https://nodejs.org/zh-cn/](https://nodejs.org/zh-cn/) 下载适合你操作系统的版本。
85 |
86 | 2. 下载完成后,运行安装包并按照提示完成安装。
87 |
88 | 3. 安装完成后,打开终端或命令行界面,并输入以下命令来验证 Node.js 是否成功安装:
89 |
90 | ```tsx
91 | node - v;
92 | ```
93 |
94 | 如果显示了 Node.js 的版本号,说明安装成功。
95 |
96 | 4. 接下来,你需要安装 pnpm,它是一个快速、零配置的包管理工具。
97 |
98 | 在终端或命令行界面中输入以下命令来安装 pnpm:
99 |
100 | ```tsx
101 | npm install -g pnpm
102 | ```
103 |
104 | 安装完成后,输入以下命令来验证 pnpm 是否成功安装:
105 |
106 | ```tsx
107 | pnpm - v;
108 | ```
109 |
110 | 如果显示了 pnpm 的版本号,说明安装成功。
111 |
112 | ### 前端开发 IDE 的选择有哪些?
113 |
114 | 当你已经安装好 Node.js 和 pnpm 后,你就可以选择一个适合你的 IDE 或文本编辑器来编写代码了。以下是几个常用的选择:
115 |
116 | 1. Visual Studio Code(推荐)- [https://code.visualstudio.com/](https://code.visualstudio.com/) Visual Studio Code 是一个轻量级,免费且强大的代码编辑器。它支持丰富的插件生态系统,可以满足大部分前端开发需求。
117 |
118 | 2. WebStorm(推荐)- [https://www.jetbrains.com/webstorm/](https://www.jetbrains.com/webstorm/) WebStorm 是 JetBrains 公司推出的一款专业的前端开发 IDE。它提供了很多强大的功能,如代码提示、调试工具等,适合专业开发者使用。
119 |
120 | 3. IntelliJ IDEA - [https://www.jetbrains.com/idea/](https://www.jetbrains.com/idea/) IntelliJ IDEA 是 JetBrains 公司推出的一款综合性的 Java IDE,它也支持前端开发,提供了一些有用的插件和功能。
121 |
122 | 4. Sublime Text - [https://www.sublimetext.com/](https://www.sublimetext.com/) Sublime Text 是一款轻巧、快速、稳定的文本编辑器。它支持多种编程语言和插件,可以满足大部分前端开发需求。
123 |
124 | 5. Atom - [https://atom.io/](https://atom.io/) Atom 是由 GitHub 开发的一款跨平台文本编辑器。它具有可配置性强、插件丰富等特点,适合于个性化定制和轻量级项目的开发。
125 |
126 | 根据你的需求和个人喜好,选择一个适合的 IDE 或文本编辑器来开始你的前端开发之旅吧!
127 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/proxy.md:
--------------------------------------------------------------------------------
1 | ### 什么是代理(Proxy)?
2 |
3 | 代理也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。代理服务器作为中间人,接收客户端的请求并将其转发给目标服务器,然后再将目标服务器的响应返回给客户端。通过使用代理,客户端可以间接地访问其他服务器上的资源,解决跨域访问问题。
4 |
5 | ### 在项目开发中如何使用代理?
6 |
7 | 在项目开发(dev)中,为了解决跨域访问问题,我们可以通过使用代理来实现。一种常见的代理方式是使用 `http-proxy-middleware` 中间件。通过在配置文件中设置代理规则,可以将特定的请求代理到另一个目标服务器上。
8 |
9 | 例如,在配置文件中添加以下代理规则:
10 |
11 | ```ts
12 | export default {
13 | proxy: {
14 | '/api': {
15 | target: 'http://jsonplaceholder.typicode.com/',
16 | changeOrigin: true,
17 | pathRewrite: { '^/api': '' },
18 | },
19 | },
20 | };
21 | ```
22 |
23 | 上述配置表示,将以 `/api` 开头的请求代理到目标服务器 `http://jsonplaceholder.typicode.com/` 上。同时,将请求地址中的 `/api` 替换为空字符串,修改请求来源为目标url。例如,请求 `/api/a` 实际上是请求 `http://jsonplaceholder.typicode.com/a`。
24 |
25 | 这样,我们可以通过在本地服务器上发起代理请求,间接地获取远程服务器上的数据,解决跨域访问问题。
26 |
27 | ### 代理的作用是什么?
28 |
29 | 代理的主要作用是解决跨域访问问题。由于浏览器或者 webview 的同源策略限制,引起了跨域访问问题。通过使用代理,我们可以在本地的 node 服务器上发起请求,然后让服务器去请求非同源的远程服务器,从而绕过浏览器的同源策略。代理只是将目标服务器返回的数据传递到前端,不会直接修改发起请求的 URL。因此,在浏览器上看到的请求地址仍然是本地服务器的地址。
30 |
31 | 需要注意的是,代理只能解决开发时的跨域访问问题,在部署时可以使用同源部署。如果在生产环境中(build)出现跨域问题,可以将类似的配置转移到 Nginx 容器上进行处理。
32 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/styling.md:
--------------------------------------------------------------------------------
1 | ### 在 Umi 项目中如何使用 .css 文件声明样式?
2 |
3 | 你可以在 Umi 项目中使用 .css 文件来声明各种样式。首先,在你的项目中创建一个 .css 文件,例如 `src/pages/index.css`。然后,在该文件中按照以下代码声明你想要的样式:
4 |
5 | ```css
6 | .title {
7 | color: red;
8 | }
9 | ```
10 |
11 | 接下来,在你的页面或组件文件中引入该样式文件,即可使样式生效。例如,在 `src/pages/index.tsx` 文件中,你可以通过以下方式引入样式文件:
12 |
13 | ```jsx
14 | import './index.css';
15 | ```
16 |
17 | 此时,你可以使用样式类名 `.title` 来给任何元素应用该样式。
18 |
19 | ### 在 Umi 项目中如何限制样式的作用域?
20 |
21 | 如果你想要限制样式的作用范围,避免全局生效,你可以使用 CSS Modules 功能。使用 CSS Modules 时,每个样式类都会有一个唯一的类名,确保样式只应用在对应的页面或组件中。
22 |
23 | 要使用 CSS Modules,你只需要将你的样式文件命名为 `.module.css` 格式,例如 `index.module.css`。然后,在你的页面或组件文件中引入样式文件,并使用引入的样式类来应用样式。
24 |
25 | ### 在 Umi 项目中如何使用 CSS Modules?
26 |
27 | 要在 Umi 项目中使用 CSS Modules,首先将你的样式文件命名为 `.module.css` 格式,例如 `index.module.css`。
28 |
29 | 然后,在你的页面或组件文件中引入样式文件,并使用引入的样式类来应用样式。例如,在 `src/pages/index.tsx` 文件中:
30 |
31 | ```jsx
32 | import styles from './index.module.css';
33 |
34 | export default function () {
35 | return Hello World;
36 | }
37 | ```
38 |
39 | 在这个例子中,`styles.title` 表示被加工过的唯一样式类名,用它来应用样式。
40 |
41 | 通过使用 CSS Modules,每个样式类都会有一个唯一的类名,确保样式只在对应的页面或组件中生效。这样可以避免全局样式冲突的问题。
42 |
43 | ### 什么是 CSS Modules?
44 |
45 | CSS Modules 是一种将样式模块化的技术。在使用 CSS Modules 时,我们可以在 JavaScript 代码中引入样式文件,并将样式赋予一个变量名。这样,样式只会作用于该模块内部,不会对全局样式产生影响。
46 |
47 | ### 如何在 JavaScript 文件中使用 CSS Modules?
48 |
49 | 要在 JavaScript 文件中使用 CSS Modules,首先需要引入样式文件。可以使用 `import` 语句引入样式文件,并将其赋予一个变量名。然后,可以使用该变量名作为 `className` 属性的值来应用样式。
50 |
51 | 例如,在一个名为 `index.css` 的样式文件中声明了一个名为 `title` 的样式,我们可以在 `index.tsx` 文件中这样使用:
52 |
53 | ```jsx
54 | import styles from './index.css';
55 |
56 | export default function () {
57 | return Hello World;
58 | }
59 | ```
60 |
61 | 这样,`title` 样式只会应用于包裹在 `className={styles.title}` 中的 `div` 元素。
62 |
63 | ### CSS Modules 可以解决什么问题?
64 |
65 | CSS Modules 提供了一种样式模块化的解决方案,可以避免样式的全局污染问题。通过将样式赋予一个变量名,可以确保样式只会作用于当前模块内部,不会影响其他模块的样式。这样可以提高代码的可维护性和复用性,避免样式冲突和命名冲突的问题。
66 |
67 | ### Umi 中支持的 CSS 预处理器有哪些?
68 |
69 | Umi 默认支持 LESS、SASS 和 SCSS 样式的导入。你可以按照引入 CSS 文件的方式引入并使用这些由 CSS 预处理器处理的样式。
70 |
71 | ### 如何在 Umi 中使用 SASS?
72 |
73 | 在 Umi 中使用 SASS 需要额外安装预处理依赖,可以通过以下步骤来安装:
74 |
75 | 1. 打开终端,并进入到项目根目录下。
76 | 2. 执行命令 `npm add -D sass` 来安装 SASS 依赖。
77 | 3. 在你的代码文件中引入 SASS 样式文件即可。
78 |
79 | ### 如何在 Umi 中使用 CSS Module?
80 |
81 | 在 Umi 中同样也支持 CSS Module 的用法。你可以按照以下步骤来使用 CSS Module:
82 |
83 | 1. 在你的代码文件中引入不同的样式文件(比如 LESS、SASS、SCSS 文件)。
84 | 2. 使用导入样式文件时返回的对象来设置元素的 className。
85 |
86 | ### Umi 是否支持其他类型的样式文件?
87 |
88 | 除了支持 LESS、SASS 和 SCSS 文件之外,Umi 还提供了对 `.styl` 和 `.stylus` 文件的内置支持。如果想要使用这些类型的样式文件,你需要先安装相应的预处理器依赖(比如 `stylus`),然后按照之前的方法引入和使用即可。
89 |
90 | ### UnoCSS 是什么?
91 |
92 | UnoCSS 是一个用于快速构建样式的工具。它可以与 Umi 和 Tailwindcss 结合使用,并且提供了内置的 UnoCSS 插件。安装 UnoCSS 需要安装 `unocss` 和 `@unocss/cli`。
93 |
94 | ### 如何在 Umi 中启用 UnoCSS 插件?
95 |
96 | 要在 Umi 中启用 UnoCSS 插件,首先安装 `plugin-unocss`。然后,在项目的 `.umirc.ts` 文件中,使用 `@umijs/plugins/dist/unocss` 模块来引入插件。在 `unocss` 配置中,需要声明要使用 `unocss` 的文件目录。例如:
97 |
98 | ```js
99 | // .umirc.ts
100 |
101 | export default {
102 | plugins: [require.resolve('@umijs/plugins/dist/unocss')],
103 | unocss: {
104 | watch: ['src/**/*.tsx'],
105 | },
106 | };
107 | ```
108 |
109 | 这样配置之后,UnoCSS 插件会监听设置文件中的 `unocss.watch` 字段,动态生成样式文件并自动套用。
110 |
111 | ### 如何配置 UnoCSS?
112 |
113 | 要配置 UnoCSS,可以在项目的根目录下创建一个名为 `unocss.config.ts` 的文件。在这个配置文件中,可以使用 `unocss` 提供的 API 来定义配置项。
114 |
115 | 例如,可以使用 `defineConfig` 方法来创建配置对象,并使用 `presetAttributify` 和 `presetUno` 方法来定义 UnoCSS 的预设配置。在配置对象中,可以设置 `envMode`、`presets` 等属性来自定义 UnoCSS 的行为。例如:
116 |
117 | ```js
118 | // unocss.config.ts
119 |
120 | import { defineConfig, presetAttributify, presetUno } from 'unocss';
121 |
122 | export function createConfig({ strict = true, dev = true } = {}) {
123 | return defineConfig({
124 | envMode: dev ? 'dev' : 'build',
125 | presets: [presetAttributify({ strict }), presetUno()],
126 | });
127 | }
128 |
129 | export default createConfig();
130 | ```
131 |
132 | 这样配置之后,UnoCSS 将根据配置对象中的信息来生成样式。
133 |
134 | 这些信息可以帮助你了解如何在 Umi 中使用 UnoCSS,并进行相应的配置。
135 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/typescript.md:
--------------------------------------------------------------------------------
1 | ### 如何在配置时拥有 TypeScript 提示?
2 |
3 | 要在配置时拥有 TypeScript 语法提示,可以在配置的地方包一层 `defineConfig()`。下面是一个示例:
4 |
5 | ```ts
6 | // .umirc.ts
7 |
8 | import { defineConfig } from 'umi';
9 |
10 | export default defineConfig({
11 | routes: [{ path: '/', component: '@/pages/index' }],
12 | });
13 | ```
14 |
15 | ### 什么是 defineConfig()?
16 |
17 | `defineConfig()` 是一个函数,用于包装配置对象,以便在配置时拥有 TypeScript 语法提示。
18 |
19 | ### 如何使用 defineConfig()?
20 |
21 | 使用 `defineConfig()` 需要先导入它:
22 |
23 | ```ts
24 | import { defineConfig } from 'umi';
25 | ```
26 |
27 | 然后,在配置对象外部使用 `defineConfig()` 包装配置对象:
28 |
29 | ```ts
30 | export default defineConfig({
31 | routes: [{ path: '/', component: '@/pages/index' }],
32 | });
33 | ```
34 |
35 | 这样,在配置时就可以拥有 TypeScript 的语法提示了。
36 |
37 | 
38 |
39 | 以上是如何在配置中使用 TypeScript 提示的方法,并且使用 `defineConfig()` 函数来实现。
40 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/use-plugins.md:
--------------------------------------------------------------------------------
1 | ### 如何在普通的 Umi 应用中使用插件呢?
2 |
3 | 在普通的 Umi 应用中,默认是不附带任何插件的。如果你需要使用 Max 的功能,比如数据流、antd 等,你需要手动安装插件并将它们打开。
4 |
5 | 首先,安装 @umijs/plugins 插件:
6 |
7 | ```bash
8 | pnpm add -D @umijs/plugins
9 | ```
10 |
11 | 然后,在配置文件 .umirc.ts 中开启 antd 插件:
12 |
13 | ```ts
14 | export default {
15 | plugins: ['@umijs/plugins/dist/antd'],
16 | antd: {},
17 | };
18 | ```
19 |
20 | Umi 和 Max 的区别在于,Max 已经内置了很多常用插件,比如数据流(initial-state、model)、antd 等。这些插件都可以在 @umijs/plugins/dist/ 中找到并开启。
21 |
22 | 如果你想进一步了解 Max 具备的功能和配置说明,请参考 Umi Max 章节。
23 |
24 | :::info{title=💡} 我是否应该选择 Max?使用 Max 并不代表你需要使用全部 Max 的功能。你可以根据自己的需求选择关闭一些插件。因此,当你需要使用 Max 的功能时,你可以选择创建一个 Max 项目。 :::
25 |
26 | ### 如何在项目中使用插件功能?
27 |
28 | 要在项目中快速使用插件的功能,可以按照以下步骤进行操作:
29 |
30 | 1. 在项目的根目录创建一个名为 `plugin.ts` 的文件。
31 | 2. 在 `plugin.ts` 文件中编写你的项目级插件代码。
32 | 3. 保存并关闭 `plugin.ts` 文件,该文件将被自动作为插件加载。
33 |
34 | 请注意,在使用插件功能之前,请确保你已经熟悉了相关的目录结构,可以参考章节 [目录结构](./directory-structure) 进行更详细的了解。
35 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/guides/use-vue.md:
--------------------------------------------------------------------------------
1 | ### 什么是命名路由?
2 |
3 | 命名路由是指在定义路由时可以为每个路由提供一个唯一的名称,除了路由的路径外,可以通过该名称来进行路由跳转。
4 |
5 | ### 如何为路由提供名称?
6 |
7 | 可以在定义路由时,通过name属性为路由提供一个名称。例如:
8 |
9 | ```ts
10 | export default {
11 | routes: [
12 | {
13 | path: '/user/:username',
14 | name: 'user',
15 | component: 'index',
16 | },
17 | ],
18 | };
19 | ```
20 |
21 | 在上述例子中,为路径为`/user/:username`的路由提供了一个名称为`user`。
22 |
23 | ### 如何使用命名路由进行导航?
24 |
25 | 要使用命名路由进行导航,可以通过`router-link`组件的`to`属性传递一个对象来链接到一个命名的路由。例如:
26 |
27 | ```html
28 |
29 | User
30 |
31 | ```
32 |
33 | 在上述例子中,通过`router-link`组件的`to`属性,使用`name`属性为`user`的路由,并传递`params`参数`{ username: 'erina' }`,来生成一个包含链接文本`User`的可点击的路由链接。
34 |
35 | ### 如何使用命名路由进行编程式导航?
36 |
37 | 使用命名路由进行编程式导航与使用命令式调用`router.push`方法一致。例如:
38 |
39 | ```ts
40 | router.push({ name: 'user', params: { username: 'erina' } });
41 | ```
42 |
43 | 在上述例子中,通过调用`router.push`方法,传递一个包含`name`属性为`user`的路由和`params`参数`{ username: 'erina' }`,实现了导航到路径`/user/erina`的效果。
44 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/introduce/faq.md:
--------------------------------------------------------------------------------
1 | ### 如何关闭 dynamicImport?
2 |
3 | 要关闭 dynamicImport,你可以按照以下步骤进行操作:
4 |
5 | 1. 首先,在你的项目中安装依赖:
6 |
7 | ```bash
8 | pnpm i babel-plugin-dynamic-import-node -D
9 | ```
10 |
11 | 2. 然后,在你的配置文件中添加 `extraBabelPlugins` 配置项,但只在生产环境中启用该插件:
12 |
13 | ```ts
14 | // .umirc.ts
15 | export default {
16 | extraBabelPlugins:
17 | process.env.NODE_ENV === 'production'
18 | ? ['babel-plugin-dynamic-import-node']
19 | : [],
20 | };
21 | ```
22 |
23 | 请注意,关闭 dynamicImport 不是一个推荐的做法,因为它可以帮助你实现按需加载,提升应用性能。因此,你应该在确保不会对应用性能产生负面影响的情况下使用它。
24 |
25 | ### umi v4 升级了默认的 react 版本到 v18,可以使用 react 17 吗?
26 |
27 | 由于 umi v4 升级了默认的 react 版本到 v18,如果需要使用 react 17,请执行以下命令并重启:
28 |
29 | ```bash
30 | pnpm add react@^17 react-dom@^17
31 | ```
32 |
33 | ### 切换到 umi4 后,可以使用 react 17 吗?
34 |
35 | 如果你切换到 umi4,注意 umi4 默认使用的 react 版本是 v18。如果你仍然需要使用 react 17,可以通过以下命令安装 react 17 的依赖并重启:
36 |
37 | ```bash
38 | pnpm add react@^17 react-dom@^17
39 | ```
40 |
41 | ### umi4 支持使用 react 17 吗?
42 |
43 | umi4 升级了默认的 react 版本到 v18。如果你仍然需要使用 react 17,你可以通过执行以下命令并重启来安装 react 17 的依赖:
44 |
45 | ```bash
46 | pnpm add react@^17 react-dom@^17
47 | ```
48 |
49 | 请注意,以上的命令是使用 pnpm 包管理器进行安装的,如果你使用的是其他的包管理器,请相应地调整命令。
50 |
51 | ### 如何解决代理静态资源到本地后一直刷新页面的问题?
52 |
53 | 问题描述:我在代理静态资源到本地后,发现页面一直在刷新。这给我的开发工作带来了一些困扰。
54 |
55 | 解决方法:你可以配置 `SOCKET_SERVER=127.0.0.1:${port}` 来启动你的项目。具体操作如下:
56 |
57 | ```bash
58 | SOCKET_SERVER=http://127.0.0.1:8000 pnpm dev
59 | ```
60 |
61 | 通过以上配置,你可以解决页面一直刷新的问题。
62 |
63 | ### 为什么我的页面一直在刷新?
64 |
65 | 问题描述:最近我将静态资源代理到本地进行开发,但是发现页面一直在刷新,并无法正常加载。
66 |
67 | 解决方法:你可以尝试配置 `SOCKET_SERVER=127.0.0.1:${port}` 启动你的项目。具体操作如下:
68 |
69 | ```bash
70 | SOCKET_SERVER=http://127.0.0.1:8000 pnpm dev
71 | ```
72 |
73 | 这样的配置能够解决页面一直刷新的问题,让你的页面能够正常加载。
74 |
75 | ### 如何停止页面一直刷新的问题?
76 |
77 | 问题描述:在我将静态资源代理到本地后,页面一直在刷新,无法停止刷新。
78 |
79 | 解决方法:你可以通过配置 `SOCKET_SERVER=127.0.0.1:${port}` 来解决这个问题。具体操作如下:
80 |
81 | ```bash
82 | SOCKET_SERVER=http://127.0.0.1:8000 pnpm dev
83 | ```
84 |
85 | 配置之后,你的页面将不再一直刷新,可以正常加载了。
86 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/introduce/philosophy.md:
--------------------------------------------------------------------------------
1 | ### Umi 的设计思路中的技术收敛是指什么?
2 |
3 | 技术收敛是 Umi 框架设计思路中的一个重要概念。它指的是将复杂多样的技术问题通过统一的方式解决,使得开发者在使用 Umi 框架时不再需要关注底层技术细节,从而提高开发效率。技术收敛帮助开发团队快速构建企业级应用,将重复性的工作交给框架去做,减少重复劳动。
4 |
5 | ### Umi 框架中的插件和插件集是什么?
6 |
7 | 插件和插件集是 Umi 框架设计思路中的两个重要概念。插件是指通过配置文件将一些通用的功能和扩展集成到应用中,例如路由、状态管理、国际化等,从而提高开发效率和代码质量。插件集是指一组相关的插件的集合,可以根据需求选择性地引入,实现功能的灵活组合。
8 |
9 | ### Umi 框架的最佳实践指什么?
10 |
11 | 最佳实践是指在使用 Umi 框架时的一些官方推荐的规范和经验总结。Umi 框架提供了一些约定和规范,通过遵循这些最佳实践可以使得开发团队更好地利用框架的特性和功能,编写出高质量的代码。最佳实践不仅包括代码规范,还包括项目结构、性能优化、异常处理等方面的建议。
12 |
13 | ### Umi 框架的企业级特性是什么?
14 |
15 | Umi 框架设计思路中强调了企业级特性的重要性。企业级特性包括多人协作、数据权限管理、项目部署等一系列与企业级需求相关的功能。Umi 框架提供了一些与企业级开发密切相关的功能和工具,帮助开发团队更好地应对复杂的业务需求和团队协作。
16 |
17 | ### Umi 框架中的 import all from umi 是什么意思?
18 |
19 | import all from umi 是 Umi 框架设计思路中的一个特性。它指的是通过一行代码将整个应用的路由、路由组件和页面组件全部导入,方便进行动态路由配置和页面渲染。import all from umi 的使用简化了繁琐的路由配置和组件导入过程,提高了开发效率和代码可读性。
20 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/introduce/upgrade-to-umi-4.md:
--------------------------------------------------------------------------------
1 | ### 如何升级项目的 Umi 版本和插件?
2 |
3 | 要升级项目的 Umi 版本和插件,需要进行以下步骤:
4 |
5 | 1. 打开项目的 `package.json` 文件。
6 | 2. 在 `devDependencies` 中找到之前使用的 Umi 相关的依赖项。
7 | 3. 将之前的 Umi 相关依赖项的版本号改为新版的 Umi 和相关插件的版本号。例如,将 `umi` 的版本号改为 `"^3.0.0"`,将 `@umijs/preset-react` 的版本号改为 `"^1.2.2"`。
8 | 4. 删除项目的 `node_modules` 文件夹,以确保之前安装的 Umi 版本和插件被完全移除。
9 | 5. 执行 `npm install` 命令,重新安装项目的依赖。
10 |
11 | 注意:如果之前使用的是 `umi` + `@umijs/preset-react` 的组合进行开发,那么可以直接将 Umi 的版本号改为新版的 `max`,然后执行步骤 4 和 5。
12 |
13 | ### 如何使用 `@umijs/max` 替换 `umi` 命令
14 |
15 | 如果你已经安装并使用了 `@umijs/max`,可以使用 `max` 命令来替换 `umi` 命令。例如,使用 `max dev` 替换 `umi dev` 来启动开发服务器,使用 `max build` 替换 `umi build` 来构建项目。
16 |
17 | 在 `package.json` 文件中,修改相应的脚本命令:
18 |
19 | ```diff
20 | {
21 | "scripts": {
22 | - "build": "umi build",
23 | + "build": "max build",
24 | - "postinstall": "umi g tmp",
25 | + "postinstall": "max setup",
26 | - "start": "umi dev",
27 | + "start": "max dev",
28 | }
29 | }
30 | ```
31 |
32 | 这样就可以使用 `max` 命令来代替相应的 `umi` 命令了。
33 |
34 | 但是,需要注意的是,在 umi@4 中,一些项目前置操作被放到了 `setup` 命令中,例如 umi@3 中的 `umi g tmp` 等命令,需要使用 `max setup` 来替代。
35 |
36 | 希望以上信息对你有帮助。
37 |
38 | ### 配置项 `fastRefresh` 的使用方法
39 |
40 | 在 `umi@3` 版本中,`fastRefresh` 配置项是一个对象,在 `umi@4` 版本中,`fastRefresh` 配置项改为直接配置为 `true` 来开启 Fast Refresh 功能。
41 |
42 | 在 `umi@3` 中的配置示例:
43 |
44 | ```typescript
45 | import { defineConfig } from 'umi';
46 |
47 | export default defineConfig({
48 | fastRefresh: {},
49 | });
50 | ```
51 |
52 | 在 `umi@4` 中的配置示例:
53 |
54 | ```typescript
55 | import { defineConfig } from 'umi';
56 |
57 | export default defineConfig({
58 | fastRefresh: true,
59 | });
60 | ```
61 |
62 | 开启 `fastRefresh` 配置项后,可以实现在开发过程中的页面热更新功能,无需手动刷新页面即可查看最新的代码变更效果。
63 |
64 | ### 配置项 `dva` 的使用方法
65 |
66 | 在 `umi@3` 中,`dva` 配置项可以配置 `hmr` 参数来开启 Hot Module Replacement (HMR) 功能。但在 `umi@4` 中不再支持 `hmr` 参数。
67 |
68 | 在 `umi@3` 中的配置示例:
69 |
70 | ```typescript
71 | import { defineConfig } from 'umi';
72 |
73 | export default defineConfig({
74 | dv{
75 | hmr: true,
76 | },
77 | });
78 | ```
79 |
80 | 在 `umi@4` 中的配置示例:
81 |
82 | ```typescript
83 | import { defineConfig } from 'umi';
84 |
85 | export default defineConfig({
86 | dv{},
87 | });
88 | ```
89 |
90 | 在 `umi@4` 中,不再需要配置 `hmr` 参数来开启 HMR 功能,因为 `umi@4` 默认支持 HMR,无需额外配置。
91 |
92 | ### 配置项 `webpack5` 的使用方法
93 |
94 | 在 `umi@4` 中,默认使用 webpack5 作为默认的构建工具。
95 |
96 | 在 `umi@4` 中的配置示例:
97 |
98 | ```typescript
99 | import { defineConfig } from 'umi';
100 |
101 | export default defineConfig({
102 | webpack5: {},
103 | });
104 | ```
105 |
106 | 通过配置 `webpack5: {}`,即可启用 webpack5 的构建能力。
107 |
108 | 请注意,在 `umi@4` 中,默认即开启了 webpack5 的支持,因此不需要额外的配置来开启 webpack5。
109 |
110 | ### Umi 4 中的路由相关使用差异
111 |
112 | 在 Umi 4 中,将 `react-router@5` 升级到了 `react-router@6`,因此在路由相关的一些 API 上存在一些使用上的差异。
113 |
114 | - 在 Umi 3 中,props 默认为空对象,以下属性不能直接从 props 中取出:
115 |
116 | - history
117 | - location
118 | - match
119 |
120 | - 使用路由相关的 API 时,需要从 `useHistory()`,`useLocation()` 或 `useRouteMatch()` hook 中获取相应的属性。
121 |
122 | 请根据 Umi 4 的文档以及具体的代码实现进行修改和适配。
123 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/access.md:
--------------------------------------------------------------------------------
1 | ### src/access.ts 文件的作用是什么?
2 |
3 | `src/access.ts` 文件是权限定义文件,用于定义项目中的权限。它需要默认导出一个方法,在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。
4 |
5 | ### initialState 参数在 src/access.ts 文件中有什么作用?
6 |
7 | `initialState` 是通过初始化状态插件 `initial-state` 提供的数据。它可以用来初始化用户权限。在 `src/access.ts` 文件中,可以使用 `initialState` 来获取用户的 userId 和 role,以确定用户具有哪些权限。
8 |
9 | ### src/access.ts 文件中的权限是如何定义的?
10 |
11 | 在 `src/access.ts` 文件中,权限通过返回的对象来进行定义。对象的每一个键值对都对应一条权限。例如,`canReadFoo` 是一个权限,对应值为 `true`,表示用户具有读取 Foo 的权限。`canUpdateFoo` 是另一条权限,对应值为 `role === 'admin'`,表示用户具有更新 Foo 的权限当且仅当用户的角色为 'admin'。`canDeleteFoo` 是一条更为复杂的权限,对应值为一个回调函数。该函数根据传入的 `foo` 对象和用户的 `userId` 来判断用户是否具有删除 Foo 的权限。
12 |
13 | 以上就是 `src/access.ts` 文件中权限的定义方式。通过定义权限,可以在项目中根据用户的角色和其他条件来控制用户的访问和操作权限。
14 |
15 | ### 如何在 Ant Design 中配置页面权限控制
16 |
17 | 要在 Ant Design 中配置页面权限控制,可以使用配合 `layout` 插件进行扩展的路由配置。以下是一个示例:
18 |
19 | ```ts
20 | export const routes = [
21 | {
22 | path: '/pageA',
23 | component: 'PageA',
24 | access: 'canReadPageA',
25 | },
26 | ];
27 | ```
28 |
29 | 在上述示例中,`routes` 是一个路由配置数组,其中每个对象代表一个页面。每个页面对象包含 `path`、`component` 和 `access` 属性。`path` 是页面的访问路径,`component` 是页面组件的名称或路径,`access` 是页面需要的权限。
30 |
31 | 通过配置 `access` 属性,可以控制只有具备特定权限的用户才能访问该页面。在示例中,用户只有拥有 `canReadPageA` 权限才能访问 `/pageA` 页面。
32 |
33 | 如果用户没有权限访问页面,则会默认渲染 Layout 插件内置的权限错误页面。
34 |
35 | 请注意,`access` 的值是权限定义返回值的某个键(在 `src/access.ts` 中定义)。
36 |
37 | 希望上述信息能够帮助您理解如何在 Ant Design 中配置页面权限控制。
38 |
39 | ### 如何自定义权限页面配置
40 |
41 | 默认情况下,Layout 插件会使用内置的权限错误页面进行渲染。如果你想自定义权限页面,可以在 `src/app.tsx` 文件中进行配置。
42 |
43 | 首先,你需要在该文件中定义 `layout` 函数,并返回一个对象。在该对象中,你可以设置自定义的权限页面。
44 |
45 | 以下是一个示例:
46 |
47 | ```tsx
48 | export const layout: RunTimeLayoutConfig = () => {
49 | return {
50 | // 自定义 403 页面
51 | unAccessible: 'unAccessible',
52 | // 自定义 404 页面
53 | noFound: 'noFound',
54 | };
55 | };
56 | ```
57 |
58 | 在上述示例中,我们定义了两个自定义权限页面:`unAccessible` 和 `noFound`。你可以根据自己的需求来设置这些页面的内容。
59 |
60 | 请注意,以上配置需要在 `src/app.tsx` 文件中进行,并且需要按照以上示例的格式进行编写。
61 |
62 | 该配置将覆盖默认的权限页面,使得渲染时会使用自定义的页面内容。
63 |
64 | 通过以上信息生成的 文档如下:
65 |
66 | ### 如何自定义权限页面配置?
67 |
68 | 要自定义权限页面配置,你需要在 `src/app.tsx` 文件中定义一个名为 `layout` 的函数,并返回一个对象。在该对象中,你可以设置自定义的权限页面。具体的配置如下:
69 |
70 | ```tsx
71 | export const layout: RunTimeLayoutConfig = () => {
72 | return {
73 | // 自定义 403 页面
74 | unAccessible: 'unAccessible',
75 | // 自定义 404 页面
76 | noFound: 'noFound',
77 | };
78 | };
79 | ```
80 |
81 | 在上述示例中,我们定义了两个自定义权限页面:`unAccessible` 和 `noFound`。你可以根据自己的需求来设置这些页面的内容。
82 |
83 | 请注意,以上配置需要在 `src/app.tsx` 文件中进行,并且需要按照以上示例的格式进行编写。
84 |
85 | 这样配置之后,默认的渲染 Layout 插件内置的权限错误页面将会被替换为自定义的页面内容。
86 |
87 | ### 如何使用 useAccess Hooks 在组件中获取权限相关信息?
88 |
89 | 要使用 `useAccess` Hooks 在组件中获取权限相关信息,请按照以下步骤操作:
90 |
91 | 1. 首先,在你的组件中导入 `useAccess` 方法。可以使用以下代码将其导入到你的组件中:
92 |
93 | ```js
94 | import { useAccess } from 'umi';
95 | ```
96 |
97 | 2. 定义你的组件,并在组件函数中调用 `useAccess` 方法,将其赋值给一个变量,例如 `access`。你可以使用以下代码在组件函数中获取权限相关信息:
98 |
99 | ```js
100 | const access = useAccess();
101 | ```
102 |
103 | 3. 现在,你可以在组件中使用 `access` 变量来获取权限相关信息。例如,如果你想检查是否有权限读取 `Foo`,你可以使用以下代码:
104 |
105 | ```js
106 | if (access.canReadFoo) {
107 | // 如果可以读取 Foo,则...
108 | }
109 | ```
110 |
111 | 4. 最后,根据你的需求,在组件中编写其他逻辑或返回 JSX 元素。
112 |
113 | 注意:`useAccess` Hooks 是基于你在项目中配置的权限规则生成的,并且与 `Access` 组件配合使用可以实现页面内元素的权限控制。
114 |
115 | ### How to use CSS variable mode in Ant Design 5.x?
116 |
117 | Starting from version 5.12.0, Ant Design reintroduced the CSS variable mode, which is a feature that was available in version 4.x. In this version, Ant Design combines the capabilities of CSS-in-JS and manages all design tokens using CSS variables. This means that styles in different themes can be shared within the same component, reducing the overall size of styles. Additionally, switching themes no longer requires re-serializing styles, resulting in improved performance when changing themes. If your application relies on Ant Design's theme capabilities, it is highly recommended to enable the CSS variable mode.
118 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/analytics.md:
--------------------------------------------------------------------------------
1 | 1. **`@umijs/max`的站点统计功能有哪些支持的选项?**
2 |
3 | `@umijs/max`内置的站点统计功能目前支持 Google Analytics 和百度统计这两个选项。
4 |
5 | 2. **如何启用`@umijs/max`的站点统计功能?**
6 |
7 | 要启用`@umijs/max`的站点统计功能,首先需要在相关的统计服务中注册并获取统计服务提供的令牌或跟踪 ID。接下来,在 umi 项目的配置文件中配置统计服务的相关信息,包括站点 ID 或令牌等。具体配置的方法请参考`@umijs/max`的官方文档。
8 |
9 | 3. **为什么要使用`@umijs/max`内置的站点统计功能?**
10 |
11 | 使用`@umijs/max`内置的站点统计功能可以方便地统计和分析访问量、用户行为等数据,从而帮助开发者了解站点的受欢迎程度、用户偏好等信息。这些数据可以帮助开发者优化站点的设计和功能,提升用户体验,并且可以用作制定营销策略和决策的依据。
12 |
13 | 请注意,以上信息仅供参考,具体配置和使用请参考`@umijs/max`的官方文档或相关文档。
14 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/introduce.md:
--------------------------------------------------------------------------------
1 | ### Umi Max 是什么?
2 |
3 | Umi Max 是一个可扩展的企业级前端应用框架,目前在蚂蚁集团内部已经直接或间接地服务了超过 10000 个应用。它解决了前端开发中的许多常见问题,并将这些经验累积成为 Umi 的各个插件。为了方便开发者使用这些插件,蚂蚁集团将它们整合到一起,并创建了 `@umijs/max`,让开发者可以通过脚手架快速获得和蚂蚁集团开发 Umi 应用相同的开发体验。
4 |
5 | ### Umi Max 提供了哪些功能?
6 |
7 | Umi Max 提供了以下功能:
8 |
9 | 1. 可扩展的企业级前端应用框架:Umi Max 是一个可扩展的前端应用框架,可以满足企业级应用的需求。
10 | 2. 解决常见问题:Umi Max 在工程实践中解决了许多前端开发中的常见问题,为开发者提供了更好的开发体验。
11 | 3. 插件集成:Umi Max 将蚂蚁集团内部已有的插件整合到一起,开发者可以直接使用这些插件,减少开发成本。
12 | 4. 脚手架支持:开发者可以使用 Umi Max 的脚手架工具快速创建基于 Umi 的应用,并获得与蚂蚁集团开发 Umi 应用相同的开发体验。
13 |
14 | 在使用 `create-umi` 命令创建 Ant Design Pro 项目后,可以根据需要选择安装其他插件来扩展项目功能。以下是可选插件的简要介绍:
15 |
16 | - [权限](./access):为项目添加权限管理功能,控制用户访问的权限。
17 | - [站点统计](./analytics):集成站点统计工具,用于监测和分析网站访问情况。
18 | - [Antd](./antd):集成 Ant Design UI 库,提供丰富的 UI 组件。
19 | - [图表](./charts):集成图表库,方便在项目中绘制各类图表。
20 | - [dva](./dva):集成 dva 数据流方案,用于管理应用的状态和数据流。
21 | - [initial-state](./data-flow#全局初始状态):生成全局初始状态,用于初始化应用的状态。
22 | - [数据流](./data-flow):提供数据流管理工具,如 dva 和 redux,方便管理和共享应用的状态。
23 | - [布局和菜单](./layout-menu):提供布局和菜单组件,用于构建项目的整体结构和导航功能。
24 | - [国际化(多语言)](./i18n):支持应用的多语言功能,方便项目的国际化。
25 | - [model](./data-flow):用于生成 dva model 文件,方便管理应用的状态和数据流。
26 | - [乾坤微前端](./micro-frontend):集成乾坤微前端框架,用于构建微前端应用。
27 | - [请求库](./request):集成请求库,方便进行网络请求操作。
28 | - [Tailwind CSS](./tailwindcss):集成 Tailwind CSS 库,提供快速构建界面的样式工具。
29 | - [CSS-IN-JS](./styled-components):支持使用 CSS-IN-JS 方式编写样式。
30 | - [请求方案](./react-query):提供请求库的替代方案,使用 react-query 进行网络请求。
31 | - [全局数据存储方案](./valtio):提供全局数据存储方案,用于管理和共享应用的状态。
32 | - [Module Federation](./mf):集成 Module Federation,实现模块化开发和共享。
33 |
34 | 根据项目需求,可以选择安装以上插件来扩展项目功能。需要注意的是,在 Umi Max 项目中,命令行使用 `max` 前缀,而不是原来的 `umi`。例如,使用 `max` 命令生成 Jest 测试文件:
35 |
36 | ```bash /max/
37 | $ npx max g jest
38 | ```
39 |
40 | 希望以上信息可以帮助您开始使用 `create-umi` 创建 Ant Design Pro 项目,并根据需求选择合适的插件。
41 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/layout-menu.md:
--------------------------------------------------------------------------------
1 | ### 是否开始国际化配置
2 |
3 | - 类型:布尔值(boolean)
4 | - 默认值:false
5 |
6 | 是否启用国际化配置。开启后,路由配置中的菜单名将被视为菜单名国际化的键值,插件将查找 locales 文件以获取对应的`menu.[key]`的文本。默认情况下,键值与路由配置中的`name`字段相同。如果菜单是多级路由,例如二级路由菜单,插件将查找 locales 文件以获取`menu.[key].[key]`对应的文本。此功能需要配置`i18n`才能使用。如果不需要菜单国际化,可以将其配置为`false`进行关闭。
7 |
8 | ### logout
9 |
10 | `logout` 是一个函数,用于处理用户点击退出登录的操作。它接收一个 `initialState` 参数,并根据需要对用户的登录状态进行处理。
11 |
12 | 默认情况下,`logout` 的值为 `null`,即没有任何处理逻辑。在默认的布局 UI 中,顶部右侧并不会显示退出按钮。如果想要显示退出按钮并实现退出登录功能,需要在运行配置中配合运行时配置 `app.ts(x)` 中的 `getInitialState` 方法返回一个对象。
13 |
14 | 通过在运行时配置中设置合适的 `logout` 函数,可以实现用户点击退出登录时的相关操作,例如清除用户的登录信息、跳转到登录页面或执行其他自定义的逻辑。
15 |
16 | 请根据具体需求,为 `logout` 方法提供对应的处理逻辑。
17 |
18 | ### 扩展的路由配置
19 |
20 | Layout 插件会基于 Umi 的路由,封装了更多的配置项,支持更多配置式的能力。新增的配置如下:
21 |
22 | - 侧边栏菜单配置。
23 | - 布局路由级别展示/隐藏相关配置。
24 | - 与权限插件结合,配置式实现权限路由的功能。
25 |
26 | 示例如下:
27 |
28 | ```typescript
29 | // config/route.ts
30 | export const routes: IBestAFSRoute[] = [
31 | {
32 | path: '/welcome',
33 | component: 'IndexPage',
34 | name: '欢迎',
35 | icon: 'testicon',
36 | target: '_blank',
37 | headerRender: false,
38 | footerRender: false,
39 | menuRender: false,
40 | menuHeaderRender: false,
41 | access: 'canRead',
42 | hideChildrenInMenu: true,
43 | hideInMenu: true,
44 | hideInBreadcrumb: true,
45 | flatMenu: true,
46 | },
47 | ];
48 | ```
49 |
50 | 这些配置项可以用来定制路由的显示和隐藏,在面包屑、侧边栏菜单和顶栏中控制路由的可见性。
51 |
52 | 其中:
53 |
54 | - `component` 表示该路由对应的组件。
55 | - `name` 是菜单项的名称,可以在侧边栏中显示。
56 | - `icon` 是菜单项的图标。
57 | - `target` 可以设置链接的打开方式,例如在新页面打开。
58 | - `headerRender` 可以控制是否在顶栏中展示路由。
59 | - `footerRender` 可以控制是否在页脚中展示路由。
60 | - `menuRender` 可以控制是否在菜单中展示路由。
61 | - `menuHeaderRender` 可以控制是否在菜单顶栏中展示路由。
62 | - `access` 是一个权限配置项,需要和权限插件配合使用。
63 | - `hideChildrenInMenu` 可以隐藏子菜单。
64 | - `hideInMenu` 可以隐藏自己和子菜单。
65 | - `hideInBreadcrumb` 可以在面包屑中隐藏。
66 | - `flatMenu` 可以将子项往上提,仍然展示。
67 |
68 | 这些配置项使得路由的控制更加灵活,可以根据需求来展示或隐藏路由及相关内容。
69 |
70 | ### flatMenu
71 |
72 | - 类型: `boolean`
73 | - 默认值: `false`
74 | - 说明: 当设置为 true 时,在菜单中只隐藏当前项,子项则继续展示,从而实现菜单的展开与收起。
75 |
76 | 该属性用于控制菜单是否打平显示。当你希望子级的菜单项不显示自身而直接展示在上一级菜单中时,可以将该属性配置为 true。
77 |
78 | 示例:
79 |
80 | ```tsx
81 | const before = [{ name: '111' }, { name: '222', children: [{ name: '333' }] }];
82 | // flatMenu = true
83 | const after = [{ name: '111' }, { name: '222' }, { name: '333' }];
84 | ```
85 |
86 | 提供了 xxxRender 参数用于在布局中显示或隐藏特定的模块。根据不同的需求,可以设置以下参数:
87 |
88 | - `headerRender=false`:不显示顶栏
89 | - `footerRender=false`:不显示页脚
90 | - `menuRender=false`:不显示菜单
91 | - `menuHeaderRender=false`:不显示菜单的标题和 logo
92 |
93 | 通过设置以上参数为 false,可以根据实际情况来决定是否展示特定的布局模块。
94 |
95 | 请注意,以上参数的默认值都是 true,即默认情况下会显示对应的布局模块。根据具体需求,灵活设置 xxxRender 参数,以满足项目的需求。
96 |
97 | ### hideChildrenInMenu 在 Ant Design Pro 中如何使用?
98 |
99 | hideChildrenInMenu 是 Ant Design Pro 中的一个属性,用于控制菜单的显示和隐藏。
100 |
101 | 当 hideChildrenInMenu 的值为 true 时,子菜单将会被隐藏,只显示父级菜单。这对于需要简化页面显示的场景非常有用。
102 |
103 | ### hideInMenu 在 Ant Design Pro 中的使用方法是什么?
104 |
105 | hideInMenu 是 Ant Design Pro 中的一个属性,用于控制菜单的显示和隐藏。
106 |
107 | 当隐藏某个页面时,可以将 hideInMenu 的值设为 true,这样该页面将不会在菜单中显示。这在需要隐藏某些敏感或不常用页面时非常有用。
108 |
109 | ### hideInBreadcrumb 在 Ant Design Pro 中如何使用?
110 |
111 | hideInBreadcrumb 是 Ant Design Pro 中的一个属性,用于控制在面包屑中的显示和隐藏。
112 |
113 | 当设置 hideInBreadcrumb 的值为 true 时,该页面在面包屑导航中将被隐藏,不会在导航中显示路径。这对于一些不需要展示在面包屑导航中的页面非常有用,可以减少面包屑导航的冗余信息。
114 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/react-query.md:
--------------------------------------------------------------------------------
1 | ### 如何启用 @umijs/max 中的 reactQuery?
2 |
3 | 如果使用 @umijs/max 的 reactQuery,只需在配置文件中添加以下内容:
4 |
5 | ```ts
6 | export default {
7 | reactQuery: {},
8 | };
9 | ```
10 |
11 | ### 如何启用 umi?
12 |
13 | 如果使用 umi,需要先安装 @umijs/plugins 依赖,然后在配置文件中添加以下内容:
14 |
15 | ```bash
16 | $ pnpm i @umijs/plugins -D
17 | ```
18 |
19 | ```ts
20 | export default {
21 | plugins: ['@umijs/plugins/dist/react-query'],
22 | reactQuery: {},
23 | };
24 | ```
25 |
26 | ### 什么是 react-query 的 devtool?
27 |
28 | devtool 是 react-query 的一个特性,在开发模式下会开启一个 react-query 的浏览器扩展工具,用于在浏览器中查看和调试 react-query 的状态和缓存情况。默认情况下,devtool 是开启的,可以通过 `reactQuery: { devtool: false }` 关闭。
29 |
30 | ### 如何关闭 react-query 的 queryClient?
31 |
32 | 通过设置 `reactQuery: { queryClient: false }` 可以关闭 react-query 的全局 QueryClient 注册功能。在 app.ts 文件中,可以通过 `export const reactQuery = { queryClient }` 进行配置。
33 |
34 | ### 如何使用 react-query 的导出?
35 |
36 | react-query 的大部分导出,可以通过从 `umi` 或 `@umijs/max` 中 import 来使用。这样可以方便地在项目中使用 react-query 的各种功能和组件。
37 |
38 | ### 什么是 react query 的 devtool 工具?
39 |
40 | react query 的 devtool 工具是 react query 官方提供的一个开发工具,用于帮助开发者在浏览器中查看 react query 的状态和调试信息。通过 devtool 工具,开发者可以方便地查看和监控正在进行的查询、缓存的数据以及错误信息等。默认情况下,react query 的 devtool 工具是开启的,但你可以通过配置项将其关闭。
41 |
42 | ### 什么是 react query 的 QueryClient 和 QueryClientProvider?
43 |
44 | 在 react query 中,QueryClient 是一个核心概念,用于管理和缓存所有的查询请求和响应。而 QueryClientProvider 是一个 react 组件,用于将 QueryClient 实例提供给整个应用中的其他组件使用。通过 QueryClientProvider,我们可以在整个应用中使用同一个 QueryClient 实例,确保所有的查询请求都能共享相同的缓存和状态。默认情况下,react query 会注册全局的 QueryClient 和 QueryClientProvider,但你可以通过配置项将其关闭。
45 |
46 | ### 什么是查询客户端(queryClient)的作用?
47 |
48 | 查询客户端(queryClient)是一个配置项,用于配置查询数据的默认选项。在这个配置项中,可以设置默认的查询函数(`queryFn`),以及其他与查询相关的参数。通过查询客户端,可以统一管理查询数据的行为,方便进行统一的异常处理、数据转换等操作,提升开发效率和代码质量。
49 |
50 | ### 如何配置开发工具(devtool)和查询客户端(queryClient)?
51 |
52 | 要配置开发工具(devtool)和查询客户端(queryClient),需要提供相应的配置对象,并将其赋值给相应的变量。在配置对象中,可以设置开发工具的属性和查询客户端的属性,以满足具体的需求。配置对象示例:
53 |
54 | ```ts
55 | const API_SERVER = '/path/to/api/server';
56 | export const reactQuery = {
57 | devtool: {
58 | initialIsOpen: true,
59 | },
60 | queryClient: {
61 | defaultOptions: {
62 | queries: {
63 | queryFn: async ({ queryKey }) => {
64 | const res = await fetch(`${API_SERVER}/${queryKey.join('/')}`);
65 | if (res.status !== 200) {
66 | throw new Error(res.statusText);
67 | }
68 | return res.json();
69 | },
70 | },
71 | },
72 | },
73 | };
74 | ```
75 |
76 | 通过以上配置对象,可以设置开发工具的`initialIsOpen`属性为`true`,使得开发工具在初始时处于打开状态;同时,设置查询客户端的`defaultOptions`属性,指定查询函数`queryFn`为一个异步函数,用于处理查询数据的逻辑。
77 |
--------------------------------------------------------------------------------
/docs/umi/docs/docs/docs/max/styled-components.md:
--------------------------------------------------------------------------------
1 | ### 如何在 umi 项目中启用 styled-components 插件?
2 |
3 | 启用 styled-components 插件需要在 umi 项目中进行相关配置。请按照以下步骤进行操作:
4 |
5 | 1. 首先,确保已经安装了 `@umijs/plugins` 依赖。如果没有安装,请执行以下命令进行安装:
6 |
7 | ```bash
8 | $ pnpm i @umijs/plugins -D
9 | ```
10 |
11 | 2. 在项目的配置文件(通常是 `.umirc.ts` 或 `config/config.ts` 文件)中添加 `plugins` 配置项,并把 `'@umijs/plugins/dist/styled-components'` 添加到插件列表中。示例配置如下:
12 |
13 | ```ts
14 | export default {
15 | plugins: ['@umijs/plugins/dist/styled-components'],
16 | styledComponents: {},
17 | };
18 | ```
19 |
20 | 3. 保存配置文件,在 umi 项目中即可使用 styled-components。
21 |
22 | ### 如何在 @umijs/max 项目中启用 styled-components?
23 |
24 | 启用 styled-components 在 @umijs/max 项目中的配置方法与 umi 有所不同。请按照以下步骤进行操作:
25 |
26 | 1. 在 @umijs/max 项目中,styled-components 是默认已经安装的,无需额外安装。
27 |
28 | 2. 打开项目的配置文件(通常是 `.umirc.ts` 或 `config/config.ts` 文件),在 `export default` 中的 `styledComponents` 对象下添加以下配置:
29 |
30 | ```ts
31 | export default {
32 | styledComponents: {},
33 | };
34 | ```
35 |
36 | 3. 保存配置文件,在 @umijs/max 项目中即可使用 styled-components。
37 |
38 | ### 什么是 styled-components 的插件?
39 |
40 | styled-components 的插件是一个可以帮助你使用 styled-components 的工具。它提供了一些功能帮助你更方便地使用 styled-components。
41 |
42 | ### styled-components 插件都可以从哪里导入使用?
43 |
44 | 大部分 styled-components 的导出可以从 `umi` 或 `@umijs/max` 里 import 使用。
45 |
46 | ### styled-components 的插件有哪些特性?
47 |
48 | 1. 支持通过配置的方式开启 styled-components 的 babel 插件,仅 dev 模式有效。
49 |
50 | 2. 支持通过运行时配置的方式声明全局样式。
51 |
52 | ### 什么是 styled-components 的 babel 插件?
53 |
54 | styled-components 的 babel 插件是用于将 CSS-in-JS 的样式定义转换为对应的 CSS 样式。该插件可以在开发模式下使用,通过配置 `babelPlugin` 可以开启该插件。
55 |
56 | ### 如何配置 styled-components 的 babel 插件?
57 |
58 | 配置 styled-components 的 babel 插件可以通过在 `.umirc.ts` 文件中的 `styledComponents` 配置项中设置 `babelPlugin` 属性。例如:
59 |
60 | ```ts
61 | export default {
62 | styledComponents: {
63 | babelPlugin: {},
64 | },
65 | };
66 | ```
67 |
68 | 如果导入来源不是 `umi` / `@umijs/max`,需要将导入来源配置到 `topLevelImportPaths` 才可以使该 babel 插件生效。例如:
69 |
70 | ```ts
71 | export default {
72 | styledComponents: {
73 | babelPlugin: {
74 | topLevelImportPaths: ['alita'],
75 | },
76 | },
77 | };
78 | ```
79 |
80 | ### 如何使 styled-components 的 babel 插件生效?
81 |
82 | 要使 styled-components 的 babel 插件生效,需要将插件的导入来源配置到 `topLevelImportPaths` 中。例如,如果导入来源是 `alita`,则需要在配置中设置如下:
83 |
84 | ```ts
85 | export default {
86 | styledComponents: {
87 | babelPlugin: {
88 | topLevelImportPaths: ['alita'],
89 | },
90 | },
91 | };
92 | ```
93 |
94 | ### 什么是运行时配置项?
95 |
96 | 运行时配置项是用来配置应用程序在运行时的一些行为或特性的选项。它们可以用来修改默认行为、启用或禁用特定的功能,或者进行其他自定义操作。运行时配置项可以在应用程序启动时进行设置,也可以在运行过程中动态修改。
97 |
98 | ### 如何使用`styled-components`中的`GlobalStyle`?
99 |
100 | 在使用`styled-components`的过程中,可以通过`GlobalStyle`来定义全局样式。`GlobalStyle`是一个 React 组件,它使用了`createGlobalStyle`函数来创建,并可以在整个应用程序中生效。
101 |
102 | 在代码中,首先需要引入`createGlobalStyle`函数,然后使用它来创建一个`GlobalStyle`组件,通过模板字符串的形式定义全局样式。在模板字符串中,可以编写 CSS 样式规则,来定制全局样式。
103 |
104 | 最后,在应用程序中使用`GlobalStyle`组件来将全局样式应用到整个应用程序中,并确保它被正确地渲染和生效。
105 |
106 | ### 如何使用运行时配置项中的`styledComponents`?
107 |
108 | 在运行时配置项中,往往会定义一些常用的`styled-components`组件,以便在整个应用程序中重复使用。
109 |
110 | 在使用这些组件时,只需要将它们引入到代码中,并按照正确的方式使用它们即可。在代码中,可以直接使用这些组件,就像使用普通的`styled-components`组件一样。
111 |
112 | 例如,当一个应用程序需要使用全局样式时,可以直接引入运行时配置项中定义的`GlobalStyle`组件,并将其渲染到应用程序的根节点中,从而应用全局样式。
113 |
114 | ```tsx
115 | import { styledComponents } from 'umi';
116 |
117 | const { GlobalStyle } = styledComponents;
118 |
119 | function App() {
120 | return (
121 | <>
122 |
123 | {/* 其他组件 */}
124 | >
125 | );
126 | }
127 | ```
128 |
129 | 这样就可以在整个应用程序中应用运行时配置项中定义的全局样式了。
130 |
--------------------------------------------------------------------------------
/meta/ant-design/common-props.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "通用属性中的 rootClassName 参数有什么作用?",
4 | "md": "rootClassName 参数是用来添加在组件最外层的 className 的。通过指定 rootClassName,可以对组件进行自定义样式的修改。\n"
5 | },
6 | {
7 | "title": "rootClassName 参数的类型是什么?",
8 | "md": "rootClassName 参数的类型是 string。\n"
9 | },
10 | {
11 | "title": "rootClassName 参数的默认值是什么?",
12 | "md": "rootClassName 参数的默认值是 \"-\",即没有默认值。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/ant-design/css-variables.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Ant Design 5.x 从哪个版本开始重新支持了 CSS 变量?",
4 | "md": "答案:Ant Design 5.x 从版本 5.12.0 开始重新支持了 CSS 变量。\n"
5 | },
6 | {
7 | "title": "Ant Design 5.x 在 CSS 变量模式中融合了什么能力?",
8 | "md": "答案:Ant Design 5.x 在 CSS 变量模式中融合了 CSS-in-JS 的能力。\n"
9 | },
10 | {
11 | "title": "在 Ant Design 5.x 的 CSS 变量模式下,哪些样式可以共享?",
12 | "md": "答案:在 Ant Design 5.x 的 CSS 变量模式下,不同主题下的样式可以共享,从而减少样式体积。\n"
13 | },
14 | {
15 | "title": "什么是 Ant Design 的 CSS 变量模式?",
16 | "md": "Ant Design 的 CSS 变量模式是一种样式能力,通过使用 CSS 变量,可以实现在同一组件中,不同主题下的样式共享的目的。这样可以减少样式体积,并提高主题切换的性能。\n"
17 | },
18 | {
19 | "title": "CSS 变量模式有什么优势?",
20 | "md": "CSS 变量模式带来了两个重要的优势。首先,它可以让同一组件在不同主题下的样式共享,从而减少了样式体积。其次,切换主题时不再需要重新序列化样式,提升了主题切换的性能。\n"
21 | },
22 | {
23 | "title": "应该在什么情况下开启 Ant Design 的 CSS 变量模式?",
24 | "md": "如果你的应用依赖 Ant Design 的主题能力,即需要在不同主题下展示不同的样式,那么我们强烈建议你开启 Ant Design 的 CSS 变量模式。这样可以享受到样式共享和主题切换性能的提升。\n"
25 | },
26 | {
27 | "title": "如何快速上手 Ant Design 的 CSS 变量模式?",
28 | "md": "在 `ConfigProvider` 的 `theme` 属性中,通过 `cssVar` 配置来开启 CSS 变量模式。这个配置会被继承,所以只需要在根节点的 `ConfigProvider` 中配置即可。示例代码如下:\n```tsx\n\n \n \n```\n"
29 | },
30 | {
31 | "title": "CSS 变量模式需要注意哪些问题?",
32 | "md": "在 React 18 中,使用了 `useId` 来生成唯一的 key,所以不需要关心为每一个主题设置唯一的 key。但是在 React 17 或者 16 中,需要手动为每一个主题设置一个唯一的 key,否则会导致主题混乱。\n"
33 | },
34 | {
35 | "title": "如何确认 CSS 变量模式已经生效?",
36 | "md": "开启 CSS 变量模式后,可以审查元素,可以看到 antd 组件样式中一些原本具体的数值被替换为了 CSS 变量。示例图片如下:\n\n希望以上信息能帮到您。如果还有其他问题,请随时提问。\n"
37 | },
38 | {
39 | "title": "CSS 变量模式下,为什么可以关闭 hash?",
40 | "md": "在 Ant Design 5.x 及以上的版本中,hash 是用于隔离主题样式的一个特性。然而,在启用了 CSS 变量之后,相同版本的 Ant Design 下的组件样式不会随着 token 的变化而改变,因为动态部分的样式已经用 CSS 变量填充了。因此,如果你的应用中只使用了一个版本的 Ant Design,你可以考虑关闭 hash 来进一步减小样式体积。\n"
41 | },
42 | {
43 | "title": "如何关闭 hash?",
44 | "md": "你可以通过以下方式关闭 hash:\n```tsx\n\n \n \n```\n这样,你就可以在 `ConfigProvider` 中将 `theme` 的 `hashed` 属性设置为 `false`,来关闭 hash。\n同时,我们还强烈推荐你使用 `extractStyle` 来抽取静态样式。这样做可以提升应用的性能。\n"
45 | },
46 | {
47 | "title": "使用 CSS 变量模式后,关闭 hash 有什么好处?",
48 | "md": "通过关闭 hash,可以进一步减小样式的体积。同时,使用 CSS 变量模式后,即使样式中的 token 发生变化,组件样式也不会改变。这是因为 CSS 变量已经填充了样式中的动态部分。因此,如果应用中只使用了一个版本的 Ant Design,并且启用了 CSS 变量模式,关闭 hash 可以提供更好的性能和更小的样式体积。\n"
49 | },
50 | {
51 | "title": "CSS 变量的前缀是什么?",
52 | "md": "* 属性:prefix\n* 说明:CSS 变量的前缀\n* 类型:string\n* 默认值:`ant`\n* 版本:5.12.0\n"
53 | },
54 | {
55 | "title": "如何填充当前主题的唯一识别 key?",
56 | "md": "* 属性:key\n* 说明:当前主题的唯一识别 key. 在 React 18 中会默认用 `useId` 填充,小于 React 18 的版本需要手动填充。\n* 类型:string\n* 默认值:`useId` in React 18\n* 版本:5.12.0\n"
57 | },
58 | {
59 | "title": "有哪些参数支持在 `cssVar` 中使用?",
60 | "md": "* 属性:prefix\n\n* 说明:CSS 变量的前缀\n\n* 类型:string\n\n* 默认值:`ant`\n\n* 版本:5.12.0\n\n* 属性:key\n\n* 说明:当前主题的唯一识别 key. 在 React 18 中会默认用 `useId` 填充,小于 React 18 的版本需要手动填充。\n\n* 类型:string\n\n* 默认值:`useId` in React 18\n\n* 版本:5.12.0\n"
61 | }
62 | ]
--------------------------------------------------------------------------------
/meta/ant-design/recommendation.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "React Hooks 库推荐",
4 | "md": "哪些 React Hooks 库可以推荐使用?\n我们可以推荐以下 React Hooks 库:\n* [ahooks](https://github.com/alibaba/hooks)\n"
5 | },
6 | {
7 | "title": "有哪些与表单相关的库可以推荐?",
8 | "md": "以下是一些与表单相关的库推荐:\n* [ProForm](https://procomponents.ant.design/components/form)\n* [Formily](https://github.com/alibaba/formily)\n* [react-hook-form](https://github.com/react-hook-form/react-hook-form)\n* [formik](https://github.com/formium/formik)\n"
9 | },
10 | {
11 | "title": "有哪些常用的图标库可以推荐?",
12 | "md": "以下是一些常用的图标库推荐:\n* [react-fontawesome](https://github.com/FortAwesome/react-fontawesome)\n* [react-icons](https://github.com/gorangajic/react-icons)\n请注意,以上推荐的库并非完整列表,仅供参考。你可以根据具体需求选择适合的库来使用。\n"
13 | },
14 | {
15 | "title": "文档管理推荐产品有哪些?",
16 | "md": "以下是一些常用的文档管理工具,供前端/设计/产品使用:\n1. [🐦 语雀](https://www.yuque.com/?chInfo=ch_antd):语雀是一个很不错的文档管理工具,可以帮助团队更好地协作和分享知识。\n"
17 | },
18 | {
19 | "title": "前端常用的图标库有哪些?",
20 | "md": "以下是一些常用的前端图标库:\n1. [阿里巴巴矢量图标库](https://www.iconfont.cn/):阿里巴巴矢量图标库是一个非常强大的图标库,包含了各种各样的图标,可以方便地在项目中使用。\n"
21 | },
22 | {
23 | "title": "有哪些 Sketch 插件推荐使用?",
24 | "md": "下面是一些推荐的 Sketch 插件:\n1. [Kitchen](https://kitchen.alipay.com):Kitchen 是一个非常实用的 Sketch 插件,可以帮助开发者更高效地进行设计工作。\n"
25 | },
26 | {
27 | "title": "常用的在线代码编辑工具有哪些?",
28 | "md": "以下是一些常用的在线代码编辑工具:\n1. [codesandbox](https://codesandbox.io/):codesandbox 是一个非常方便的在线代码编辑工具,可以帮助开发者快速创建、分享和部署前端应用。\n2. [codepen](https://codepen.io/):codepen 也是一个非常好用的在线代码编辑工具,可以实时预览并分享你的前端代码。\n"
29 | },
30 | {
31 | "title": "有什么好用的图片压缩工具推荐?",
32 | "md": "以下是一些常用的图片压缩工具:\n1. [tinypng](https://tinypng.com/):tinypng 是一个非常方便的在线图片压缩工具,可以帮助你减小图片的文件大小,同时保持较高的图片质量。\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/ant-design/use-with-create-react-app.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Qcreate-react-app 是什么?",
4 | "md": "A`create-react-app` 是业界最优秀的 React 应用开发工具之一。\n"
5 | },
6 | {
7 | "title": "Q 如何在 create-react-app 中使用 antd?",
8 | "md": "A 在 create-react-app 中使用 antd,需要先创建一个 TypeScript 项目,并引入 antd。确保项目中使用匹配的 antd 版本。\n"
9 | },
10 | {
11 | "title": "Q antd 基于什么版本的 TypeScript?",
12 | "md": "A antd 基于最新稳定版本的 TypeScript(>=5.0.0)。\n"
13 | },
14 | {
15 | "title": "如何安装和初始化项目?",
16 | "md": "在开始之前,你需要安装 `yarn` 或者 `pnpm`,你可以使用以下命令来进行安装:\n* 如果你选择使用 `yarn`,可以运行以下命令:\n```bash\n$ yarn create react-app antd-demo --template typescript\n```\n* 如果你选择使用 `pnpm`,可以运行以下命令:\n```bash\n$ pnpm create react-app antd-demo --template typescript\n```\n这样工具会自动为你初始化一个脚手架,并安装 React 项目所需的各种必要依赖。\n请注意,如果在安装过程中出现网络问题,你可以尝试配置代理或者切换至其他 npm registry。\n安装和初始化完成后,你需要进入项目并启动,使用以下命令:\n```bash\n$ cd antd-demo\n$ npm run start\n```\n此时,你的浏览器将自动打开一个页面,访问 http://localhost:3000/,并显示 `Welcome to React` 的界面。这意味着安装和初始化项目成功了。\n"
17 | },
18 | {
19 | "title": "如何启动项目?",
20 | "md": "在项目初始化完成后,你可以使用以下命令来启动项目:\n```bash\n$ cd antd-demo\n$ npm run start\n```\n执行以上命令后,你的浏览器会自动打开一个页面,并访问 http://localhost:3000/。在页面上你将看到 `Welcome to React` 的界面,这意味着项目启动成功。\n"
21 | },
22 | {
23 | "title": "如果遇到网络问题怎么办?",
24 | "md": "如果在安装或初始化项目的过程中遇到网络问题,你可以尝试以下解决方案:\n* 配置代理:你可以通过设置代理来解决网络问题。具体的代理配置方法可以参考你所使用的工具的文档。\n\n* 使用其他 npm registry:如果你所使用的 npm registry 出现问题,你可以尝试切换至其他可靠的 npm registry。\n希望以上方法能够帮助你解决网络问题,并顺利安装和初始化你的项目。\n"
25 | },
26 | {
27 | "title": "如何安装和引入 antd?",
28 | "md": "你可以通过以下命令使用 npm 安装 antd:\n```\n$ npm install antd --save\n```\n或者使用 yarn:\n```\n$ yarn add antd\n```\n或者使用 pnpm:\n```\n$ pnpm install antd --save\n```\n安装完成后,你可以在项目中引入 antd 组件。例如,在 `src/App.js` 文件中,你可以按如下方式引入 antd 的按钮组件:\n```tsx\nimport React from 'react';\nimport { Button } from 'antd';\n\nconst App: React.FC = () => (\n \n \n \n);\n\nexport default App;\n```\n这样,你就可以在应用中使用 antd 的按钮组件了。\n"
29 | },
30 | {
31 | "title": "如何在 create-react-app 中使用 antd?",
32 | "md": "如果你使用 create-react-app 工具创建了项目,可以按照以下步骤来使用 antd:\n1. 在项目根目录下,使用命令安装 antd:\n```tsx\n $ npm install antd --save\n```\n或者\n```tsx\n $ yarn add antd\n```\n或者\n```tsx\n $ pnpm install antd --save\n```\n2. 在你想要使用 antd 组件的文件中,使用 `import` 语句来引入需要的组件,例如:\n```tsx\nimport { Button } from 'antd';\n```\n3. 在需要使用 antd 组件的地方直接使用它们,例如:\n```tsx\n\n```\n这样,在应用中就可以使用 antd 的组件了。\n4. 如果你还需要其他的 antd 组件,可以在相应的文件中引入并使用它们。\n以上是在 create-react-app 中使用 antd 的基本步骤,请参考 create-react-app 的[官方文档](https://create-react-app.dev/docs/getting-started)了解更多开发流程。\n"
33 | },
34 | {
35 | "title": "如何配置自定义主题?",
36 | "md": "要配置自定义主题,可以参考 Ant Design 的 [配置主题](/docs/react/customize-theme) 文档。在你的应用中,可以通过`ConfigProvider`组件进行主题配置。下面是一个示例:\n```tsx\nimport React from 'react';\nimport { ConfigProvider } from 'antd';\n\nconst App: React.FC = () => (\n \n \n \n);\n\nexport default App;\n```\n注意,在你的应用中使用`antd`时,还需要确保不要安装`@types/antd`,因为`antd`已经提供了完整的 TypeScript 定义。\n"
37 | },
38 | {
39 | "title": "如何享受 TypeScript 的属性输入建议和定义检查功能?",
40 | "md": "`antd`使用 TypeScript 书写,并提供了完整的定义。因此,在开发时,你可以享受组件属性输入建议和定义检查的功能。确保使用正确的`import`语句来导入`antd`组件,然后你就可以在编辑器中获得相应的输入建议和类型检查。\n"
41 | },
42 | {
43 | "title": "如何运行 antd 组件并开始开发我的应用?",
44 | "md": "通过上述配置主题的步骤,你已经成功将 antd 组件运行起来了。现在,你可以开始开发你的应用了!根据你的需求,使用 antd 提供的各种组件和功能,来构建出你想要的应用界面。\n"
45 | }
46 | ]
--------------------------------------------------------------------------------
/meta/ant-design/use-with-vite.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在 Vite 中使用 antd 组件?",
4 | "md": "在 Vite 创建的工程中使用 antd 组件是很简单的。首先,确保你已经安装了 `antd` 组件库。然后,按照以下步骤进行操作:\n1. 在你的 Vite 工程目录中,打开终端并执行以下命令安装 antd:\n```shell\n npm install antd\n```\n或者,你也可以使用 yarn:\n```shell\n yarn add antd\n```\n2. 在你的入口文件(一般是 `main.js` 或 `main.tsx`)中导入 antd 组件样式:\n```javascript\nimport 'antd/dist/antd.css';\n```\n这将会全局引入 antd 组件的样式。\n3. 现在,你可以在你的 Vite 工程中使用 antd 组件了。只需按照官方文档的示例代码,在你的组件中导入需要的组件并使用即可。\n```jsx\nimport { Button } from 'antd';\n\nfunction App() {\n return (\n \n \n \n );\n}\n```\n以上就是在 Vite 中使用 antd 组件的基本步骤。如果你想要进一步自定义 Vite 的配置以满足特定需求,可以参考下面的内容。\n"
5 | },
6 | {
7 | "title": "如何自定义 Vite 配置以满足各类工程化需求?",
8 | "md": "Vite 提供了很多配置选项,可以帮助你满足各类工程化需求。下面列举了一些常见的配置需求,并给出了相应的解决方案:\n* **自定义开发服务器配置**:你可以在 Vite 工程目录中创建一个 `vite.config.js` 文件,并在其中编写自定义的服务器配置。\n\n ```javascript\n // vite.config.js\n export default {\n server: {\n port: 3000, // 自定义端口号\n proxy: {\n '/api': {\n target: 'http://localhost:8080', // 自定义代理目标\n changeOrigin: true,\n rewrite: (path) => path.replace(/^\\/api/, ''),\n },\n },\n },\n };\n ```\n\n* **自定义构建配置**:你可以在 `vite.config.js` 文件中使用 `define` 和 `resolve` 配置项来定义全局变量和自定义模块解析规则。\n\n ```javascript\n // vite.config.js\n export default {\n build: {\n define: {\n __DEV__: true, // 自定义全局变量\n },\n resolve: {\n alias: {\n components: '/src/components', // 自定义模块解析别名\n },\n },\n },\n };\n ```\n\n* **添加额外的插件和工具**:你可以在 `vite.config.js` 文件中使用 `plugins` 配置项来添加额外的插件和工具。\n\n ```javascript\n // vite.config.js\n import vue from '@vitejs/plugin-vue';\n import myPlugin from './plugins/myPlugin';\n\n export default {\n plugins: [\n vue(), // 添加 vue 插件\n myPlugin(), // 添加自定义插件\n ],\n };\n ```\n通过自定义 Vite 的配置,你可以满足各类工程化需求,更好地开发 React 应用。\n希望以上内容对你有所帮助!如果还有其他问题,请随时提问。\n"
9 | },
10 | {
11 | "title": "如何安装并初始化 Ant Design React 项目?",
12 | "md": "在开始之前,你需要安装 `yarn` 或者 `pnpm`,然后执行以下命令初始化一个脚手架并安装 React 项目的必要依赖:\n```bash\n$ yarn create vite antd-demo\n```\n或者\n```bash\n$ pnpm create vite antd-demo\n```\n如果网络有问题,你可以尝试配置代理或使用其他 npm registry。\n然后进入项目目录并安装依赖,并启动项目:\n```bash\n$ cd antd-demo\n$ npm install\n$ npm run dev\n```\n最后,通过浏览器访问 http://localhost:5173/ ,如果能看到 `Vite + React` 的界面,说明安装和初始化成功。\n"
13 | },
14 | {
15 | "title": "如何启动 Ant Design React 项目?",
16 | "md": "在项目目录下执行以下命令启动 Ant Design React 项目:\n```bash\n$ npm run dev\n```\n然后,通过浏览器访问 http://localhost:5173/ ,如果能看到 `Vite + React` 的界面,说明项目启动成功。\n"
17 | },
18 | {
19 | "title": "如何安装 Ant Design React 的依赖?",
20 | "md": "在项目目录下执行以下命令安装 Ant Design React 的依赖:\n```bash\n$ npm install\n```\n"
21 | },
22 | {
23 | "title": "如何在 Vite 中引入 antd 组件?",
24 | "md": "在 Vite 生成的默认目录结构中,你可以通过以下步骤引入 antd 组件:\n1. 在 `src/App.js` 中导入 antd 组件库:\n```jsx\nimport { Button } from 'antd';\n```\n2. 在组件中使用 antd 的按钮组件:\n```jsx\n\n```\n这样,你就可以在页面上看到 antd 的蓝色按钮组件了。\n"
25 | },
26 | {
27 | "title": "如何安装 antd?",
28 | "md": "你可以通过以下命令使用 npm、yarn 或 pnpm 来安装 antd:\n使用 npm:\n```\n$ npm install antd --save\n```\n使用 yarn:\n```\n$ yarn add antd\n```\n使用 pnpm:\n```\n$ pnpm install antd --save\n```\n安装完成后,你就可以在项目中引入并使用 antd 组件了。\n"
29 | },
30 | {
31 | "title": "如何查阅 Vite 的官方文档?",
32 | "md": "如果你对 Vite 的其他开发流程感兴趣,你可以参考 Vite 的[官方文档](https://cn.vitejs.dev/)。官方文档中提供了详细的开发指南和文档,可以帮助你更好地使用 Vite 进行开发。\n希望以上信息能帮助你顺利引入 antd 组件并开始开发应用!如有其他问题,请继续提问。\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/pro-components/LICENSE.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "MIT 许可证是什么?",
4 | "md": "MIT 许可证是一种开源软件许可证,它允许使用、修改、合并、发布、分发、再许可和出售软件的副本。该许可证还包含了代码的免责声明,表示软件是\"按原样\"提供的,没有任何担保。此外,MIT 许可证要求在所有副本或实质部分中包含版权声明和许可声明。\n"
5 | },
6 | {
7 | "title": "MIT 许可证有什么限制和条件?",
8 | "md": "MIT 许可证中明确规定了一些限制和条件,包括:\n* 必须包含版权声明和许可声明;\n* 不提供任何担保和条件;\n* 不承担任何索赔、损害赔偿责任等。\n"
9 | },
10 | {
11 | "title": "如何使用 MIT 许可证?",
12 | "md": "使用 MIT 许可证的软件需要在每个副本中包含版权声明和许可声明。此外,您可以根据自己的需求对软件进行修改、合并、发布、分发、再许可和出售。请注意,MIT 许可证不提供任何担保,使用软件时需要自行承担风险和责任。\n注意:本文所提供的信息仅用于参考。具体的法律问题和许可证应该请教专业人士。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/pro-components/components.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在 ProTable 和 ProList 中使用新的数据结构?",
4 | "md": "ProTable 和 ProList 使用了新的数据结构,你只需要按照我们的约定使用参数,就能非常简单地使用它们。以下是一个示例:\n```tsx\nconst msg: {\n datT[];\n page: number;\n success: boolean;\n total: number;\n} = {\n dat[],\n page: 1,\n success: true,\n total: 0,\n};\n```\n只需要将你的数据按照这个结构传递给 ProTable 或 ProList,就可以轻松地使用它们了。\n"
5 | },
6 | {
7 | "title": "如何配置全局的网络请求转化器?",
8 | "md": "如果你的后端数据使用了自己熟悉的 URL,虽然我们可以用 Umi 的 request 来转化,但是每个 table 都需要单独配置就比较麻烦。不过,如果你使用 Umi 的 request,我们可以定义一个全局的转化器。在 app.tsx 文件中进行如下配置:\n```tsx\nimport { request, RequestConfig } from 'umi';\n\nexport const request: RequestConfig = {\n errorConfig: {\n adaptor: (resData) => {\n // resData 是我们自己的数据\n return {\n ...resData,\n total: resData.sum,\n success: resData.ok,\n errorMessage: resData.message,\n };\n },\n },\n};\n```\n配置完成后,你可以在任何地方使用像这样的代码:\n```tsx\n \n```\n"
9 | },
10 | {
11 | "title": "如何自定义 fetch 请求?",
12 | "md": "如果你使用了 fetch 来进行网络请求,你可以对 fetch 进行自定义。以下是一个示例:\n```tsx\nconst request = (url, options) => {\n return fetch(url, options)\n .then((res) => res.json())\n .then((resData) => {\n return Promise.resolve({\n ...resData,\n total: resData.sum,\n success: resData.ok,\n errorMessage: resData.message,\n });\n });\n};\n\n// 使用时\n ;\n```\n你可以根据自己的需求对 fetch 进行适配,并将返回的数据转化为 ProTable 或 ProList 需要的结构。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/pro-components/field.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "2:如何在 Ant Design 中使用搜索功能?",
4 | "md": "如果你需要在 Ant Design 中使用搜索功能,可以参考以下步骤:\n1. 导入相应的组件:\n```tsx\nimport { Input, Button, Table } from 'antd';\n```\n2. 在页面上创建一个搜索框组件:\n```tsx\nconst Search = Input.Search;\n\n console.log(value)}\n style={{ width: 200 }}\n/>;\n```\n这样就在页面上创建了一个搜索框。\n3. 结合 Table 组件使用搜索功能:\n```tsx\n const columns = [\n {\n title: '姓名',\n dataIndex: 'name',\n key: 'name',\n },\n ...\n ];\n\n
\n```\n使用 Ant Design 的 Table 组件可以将搜索和表格结合起来,实现搜索功能。\n4. 根据需要配置搜索功能的逻辑和样式,在搜索框中输入内容后,可以通过相关的事件或回调函数处理搜索逻辑。\n"
5 | },
6 | {
7 | "title": "3:如何在 Ant Design 中使用下拉选择框?",
8 | "md": "Ant Design 提供了下拉选择框组件,你可以按照以下步骤来使用它:\n1. 首先,在你的代码中导入下拉选择框组件的模块:\n```tsx\nimport { Select } from 'antd';\n```\n2. 创建一个 Select 组件,并配置选项:\n```tsx\nconst { Option } = Select;\n\n;\n```\n通过添加 Option 组件可以配置下拉选择框的选项。\n3. 根据需要,你可以使用 onChange 属性来监听选择变化的事件,并在回调函数中处理选择逻辑。\n```tsx\nfunction handleChange(value) {\n console.log(`selected ${value}`);\n}\n```\n通过回调函数可以获取用户选择的值,并进行相应的操作。\n以上是在 Ant Design 中使用搜索功能和下拉选择框的基本步骤,具体使用方法可以参考 Ant Design 的官方文档。\n"
9 | },
10 | {
11 | "title": "text 参数",
12 | "md": "* 说明:需要格式化的值\n* 类型:any\n* 默认值:-\n"
13 | },
14 | {
15 | "title": "valueType 参数",
16 | "md": "* 说明:格式化的类型\n* 类型:ValueType\n* 默认值:-\n"
17 | },
18 | {
19 | "title": "mode 参数",
20 | "md": "* 说明:组件的模式\n* 默认值:-\n* 类型:-\n"
21 | },
22 | {
23 | "title": "plain 参数",
24 | "md": "* 说明:精简模式\n* 默认值:-\n* 类型:-\n"
25 | },
26 | {
27 | "title": "renderFormItem 参数",
28 | "md": "* 说明:自定义 `mode=update \\| edit` 下的 dom 表现,一般用于渲染编辑框\n* 默认值:-\n* 类型:-\n"
29 | },
30 | {
31 | "title": "render 参数",
32 | "md": "* 说明:自定义 `mode=read` 下的 dom 表现,只是单纯的表现形式\n* 默认值:-\n* 类型:-\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/pro-components/index.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "ProComponents 是基于什么开发的?",
4 | "md": "ProComponents 是基于 Ant Design 而开发的模板组件。\n"
5 | },
6 | {
7 | "title": "ProComponents 提供了哪些组件?",
8 | "md": "ProComponents 提供以下组件:\n* ProLayout 解决布局的问题,提供开箱即用的菜单和面包屑功能\n* ProTable 表格模板组件,抽象网络请求和表格格式化\n* ProForm 表单模板组件,预设常见布局和行为\n* ProCard 提供卡片切分和栅格布局能力\n* ProDescriptions 定义列表模板组件,ProTable 的配套组件\n* ProSkeleton 页面级别的骨架屏\n"
9 | },
10 | {
11 | "title": "ProComponents 适用于哪些场景?",
12 | "md": "ProComponents 适用于中后台的 CRUD,预设了丰富的样式和行为。如果你的业务需要丰富的自定义,建议直接使用 Ant Design。在使用 ProComponents 之前,可以查看典型的 Demo 来判断组件是否适合你们的业务。\n"
13 | },
14 | {
15 | "title": "如何安装 ProComponents?",
16 | "md": "你可以通过以下步骤来安装 ProComponents:\n1. 打开命令行工具,进入你的项目目录。\n2. 运行以下命令来安装 ProComponents 的 npm 包:\n```shell\nnpm i @ant-design/pro-components --save\n```\n这样就成功安装了 ProComponents。\n"
17 | },
18 | {
19 | "title": "ProComponents 提供了哪些组件?",
20 | "md": "ProComponents 提供了多个可直接使用的组件。你可以通过运行以下命令来安装这些组件:\n```shell\nnpm i @ant-design/pro-components --save\n```\n安装完成后,你就可以在你的项目中直接使用这些组件了。\n请注意,如果你只需要使用部分组件,可以根据自己的需求进行选择安装。\n"
21 | },
22 | {
23 | "title": "在项目中如何使用 ProForm 组件?",
24 | "md": "在项目中使用 ProForm 组件时,首先需要将该组件引入到项目中,示例如下:\n```jsx\nimport React from 'react';\nimport { ProForm } from '@ant-design/pro-components';\n\nexport default () => {\n return (\n {\n console.log(values);\n }}\n >\n {/* 其他表单项 */}\n \n );\n};\n```\n在上述示例代码中,我们将 ProForm 组件引入到项目中,并通过 onFinish 函数来处理表单提交事件。你可以根据项目的需求添加/修改表单项,并在 onFinish 函数中处理表单数据。\n记得在项目中安装 `@ant-design/pro-components` 包。\n"
25 | },
26 | {
27 | "title": "如何使用 ProFormText 组件?",
28 | "md": "ProFormText 是 ProForm 组件的子组件,用于创建文本输入框表单项。要使用 ProFormText 组件,需要先将其引入到项目中,示例如下:\n```jsx\nimport React from 'react';\nimport { ProForm, ProFormText } from '@ant-design/pro-components';\n\nexport default () => {\n return (\n {\n console.log(values);\n }}\n >\n \n {/* 其他表单项 */}\n \n );\n};\n```\n在上述示例代码中,我们在 ProForm 组件内部使用了 ProFormText 组件来创建一个姓名输入框表单项。在 ProFormText 组件中,我们需要设置 name 属性来指定表单项的字段名,label 属性用于设置表单项的标签显示文本。\n"
29 | },
30 | {
31 | "title": "如何处理 ProForm 组件的表单提交?",
32 | "md": "在使用 ProForm 组件时,我们可以通过 onFinish 函数来处理表单的提交事件。示例代码如下:\n```jsx\nimport React from 'react';\nimport { ProForm, ProFormText } from '@ant-design/pro-components';\n\nexport default () => {\n return (\n {\n console.log(values);\n // 在这里可以进行表单数据的提交处理\n }}\n >\n {/* 表单项 */}\n \n );\n};\n```\n在上述示例代码中,我们在 ProForm 组件的 onFinish 函数中获取到了表单的值(values),你可以在这个函数中对表单数据进行处理,比如提交到服务器或者进行其他操作。\n记得在项目中安装 `@ant-design/pro-components` 包。\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/pro-components/list.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "ProList 的常用参数有哪些?",
4 | "md": "ProList 的常用参数如下:\n* dataSource: 与 antd 相同的配置,表示数据源,类型为数组,默认值为 `false`。\n* actionRef: Table action 的引用,便于自定义触发,类型为 MutableRefObject。\n* metas: 列表项配置,类似 Table 中的 columns,类型为 Metas。\n* rowKey: 行的 key,一般是行 id,类型为 string 或者 `(row,index)=>string`,默认值为 `'id'`。\n* headerTitle: 列表头部主标题,类型为 React.ReactNode。\n* loading: 是否加载中,类型为 boolean 或者 `(item: any) => boolean`,默认值为 `false`。\n* split: 是否有分割线,类型为 boolean,默认值为 `false`。\n* rowSelection: 与 antd 相同的配置,表示行选择,类型为对象或者布尔值,默认值为 false。\n* expandable: 与 antd 相同的配置,表示可展开行的配置,类型为对象或者 `false`。\n* showActions: 何时展示 actions,CardList 模式下不生效,类型为 `'hover'` 或者 `'always'`,默认值为 `'always'`。\n* showExtr 何时展示 extra,类型为 `'hover'` 或者 `'always'`,默认值为 `'always'`。\n* onRow: 与 antd 相同的配置,当用户传入 `grid` 属性时,列表将会以卡片模式进行渲染,此事件将不会触发,请使用 `onItem`,类型为 `function(record, index)`。\n* onItem: 与 antd 相同的配置,表示在所有类型点击某个项目都会触发该事件,类型为 `function(record, index)`。\n* rowClassName: 自定义列表行的类名,类型为字符串或者 `(row, index) => string`。\n* itemHeaderRender: 自定义每一列的 header,不同于 itemRender 的是它会保留多选和展开收起。\n* itemCardProps: 自定义卡片列表的 proCard props,只在卡片列表下生效。\n"
5 | },
6 | {
7 | "title": "如何使用 itemHeaderRender 和 itemCardProps?",
8 | "md": "itemHeaderRender 和 itemCardProps 是 ProList 的两个参数。\n* itemHeaderRender 是用来自定义每一列的 header,与 itemRender 不同的是,它会保留多选和展开收起。你可以将自定义的组件传入到 itemHeaderRender 中,实现个性化的列表列头显示。\n\n* itemCardProps 是用来自定义卡片列表的 proCard 的 props,只在卡片列表下生效。你可以传入一个对象,设置 proCard 的属性,从而自定义卡片列表的显示样式。\n"
9 | },
10 | {
11 | "title": "Metas.\\[Meta] 通用 API",
12 | "md": ""
13 | },
14 | {
15 | "title": "参数",
16 | "md": "* **dataIndex**: 数据在数据项中对应的路径,支持通过数组查询嵌套路径\n\n * 类型: `string` | `string[]`\n * 默认值: `-`\n\n* **valueType**: 值的类型,和 ProTable 一致\n\n * 类型: `'text'` | `'date'` ...\n * 默认值: `'text'`\n\n* **render**: 自定义渲染函数\n * 类型: `(text: React.ReactNode, record: T, index: number) => React.ReactNode | React.ReactNode[]`\n * 默认值: `-`\n"
17 | },
18 | {
19 | "title": "说明",
20 | "md": "Metas.\\[Meta] 是一个通用 API,用于配置 ProTable 的元数据项。\n"
21 | },
22 | {
23 | "title": "示例",
24 | "md": "```jsx\nimport { ProTable } from 'antd';\n\nconst columns = [\n {\n title: '姓名',\n dataIndex: 'name',\n },\n {\n title: '年龄',\n dataIndex: 'age',\n valueType: 'number',\n },\n {\n title: '操作',\n render: (text, record, index) => (\n handleEdit(record)}>编辑\n ),\n },\n];\n\nconst dataSource = [\n {\n name: '张三',\n age: 18,\n },\n {\n name: '李四',\n age: 20,\n },\n];\n\nconst MyTable = () => {\n return ;\n};\n```\n"
25 | },
26 | {
27 | "title": "参考链接",
28 | "md": "* [ProTable API 文档](https://procomponents.ant.design/components/table#protable)\n"
29 | },
30 | {
31 | "title": "`dataSource` 的字段类型有哪些?",
32 | "md": "`dataSource` 的字段类型有 `'new'`、`'top'` 和 `'inline'`。\n"
33 | },
34 | {
35 | "title": "`dataSource` 字段类型的含义是什么?",
36 | "md": "* `'new'` 表示数据源是新的。\n* `'top'` 表示数据源是热门的。\n* `'inline'` 表示数据源是内联的。\n"
37 | },
38 | {
39 | "title": "`dataIndex` 参数的默认值是什么?",
40 | "md": "`dataIndex` 参数的默认值是 `'type'`。\n"
41 | },
42 | {
43 | "title": "Metas.description 的参数说明是什么?",
44 | "md": "Metas.description 的参数说明如下:\n| 参数 | 说明 | 类型 | 默认值 |\n| :-------- | :--- | :--- | :-------------- |\n| dataIndex | - | - | `'description'` |\n其中,`dataIndex` 参数表示元数据(Metas)的描述信息。默认值为 `'description'`。\n"
45 | },
46 | {
47 | "title": "Metas.actions 的参数 dataIndex 是什么意思?",
48 | "md": "参数 dataIndex 在 Metas.actions 中的作用是什么?\n"
49 | },
50 | {
51 | "title": "Metas.actions 的参数 cardActionProps 如何使用?",
52 | "md": "参数 cardActionProps 在 Metas.actions 中有什么用途?如何使用它?\n"
53 | },
54 | {
55 | "title": "Metas.actions 的参数 cardActionProps 的默认值是什么?",
56 | "md": "参数 cardActionProps 在 Metas.actions 中的默认值是什么?\n"
57 | }
58 | ]
--------------------------------------------------------------------------------
/meta/pro-components/pro-form.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "ProForm 的 layout 切换功能如何使用?",
4 | "md": "ProForm 提供了多种预设的 layout,通过改变外面包裹的 Layout 即可实现切换。以下是一个 demo 的代码示例:\n```tsx\n
\n```\n"
5 | },
6 | {
7 | "title": "ProForm 的 layout 切换功能有哪些主要特点?",
8 | "md": "ProForm 的 layout 切换功能的主要特点包括:\n* 提供了多种预设的 layout\n* 通过改变外面包裹的 Layout 即可实现切换\n* 代码示例可以参考 [layout-change.tsx](../../packages/form/src/demos/layout-change.tsx)\n"
9 | },
10 | {
11 | "title": "如何使用 ProForm 的 layout 切换功能来实现表单布局的切换?",
12 | "md": "要使用 ProForm 的 layout 切换功能来实现表单布局的切换,只需要按照以下步骤操作:\n1. 参考代码示例 [layout-change.tsx](../../packages/form/src/demos/layout-change.tsx)\n2. 根据需求选择合适的预设 layout\n3. 改变外面包裹的 Layout 即可实现切换\n4. 查看效果并进行调整和优化\n以上是 ProForm 的 layout 切换功能的使用方法及相关特点,希望对你有所帮助。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/pro-components/skeleton.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "QA 如何使用静态列表?",
4 | "md": "要使用静态列表,你可以按照以下步骤进行操作:\n1. 打开静态列表的源代码文件`list.static.tsx`。\n\n2. 查看源代码文件中的示例代码,可以参考示例代码进行调整。\n\n3. 根据项目需求,修改静态列表的数据和样式。\n\n4. 运行项目,打开静态列表页面,查看效果。\n如果需要进行调试,可以在代码中添加`debug`属性。\n"
5 | },
6 | {
7 | "title": "QA 如何使用结果页?",
8 | "md": "要使用结果页,你可以按照以下步骤进行操作:\n1. 打开结果页的源代码文件`result.tsx`。\n\n2. 查看源代码文件中的示例代码,可以参考示例代码进行调整。\n\n3. 根据项目需求,修改结果页的数据和样式。\n\n4. 运行项目,打开结果页,查看效果。\n希望以上信息对你有帮助!如果有任何问题,请随时提问。\n"
9 | },
10 | {
11 | "title": "骨架屏的不同类型有哪些?",
12 | "md": "参数 `type` 控制着骨架屏的类型,可选值为 `'list'`、`'result'`、`'descriptions'`。分别表示列表类型的骨架屏、结果类型的骨架屏和描述类型的骨架屏。默认值为 `'list'`。\n"
13 | },
14 | {
15 | "title": "如何控制骨架屏的动态显示?",
16 | "md": "参数 `active` 控制骨架屏是否显示动态效果,可以是一个布尔值,`true` 表示显示动态效果,`false` 表示不显示。默认值为 `true`。\n"
17 | },
18 | {
19 | "title": "是否可以为骨架屏添加 pageHeader?",
20 | "md": "参数 `pageHeader` 控制是否显示 pageHeader 的骨架屏,只有在类型为 `descriptions` 或 `list` 时才有效。该参数不需要传入具体的值,只需要填写 `-` 即可。\n"
21 | },
22 | {
23 | "title": "统计信息骨架屏的数量如何控制?",
24 | "md": "参数 `statistic` 用于控制统计信息骨架屏的数量,可以是一个数字或布尔值 `false`。当传入一个数字时,表示显示指定数量的统计信息骨架屏;当传入 `false` 时,表示不显示统计信息骨架屏。\n"
25 | },
26 | {
27 | "title": "列表骨架屏的数量如何控制?",
28 | "md": "参数 `list` 用于控制列表骨架屏的数量,可以是一个数字或布尔值 `false`。当传入一个数字时,表示显示指定数量的列表骨架屏;当传入 `false` 时,表示不显示列表骨架屏。\n"
29 | },
30 | {
31 | "title": "是否可以为列表骨架屏添加操作栏?",
32 | "md": "参数 `toolbar` 控制是否显示列表的操作栏骨架屏,可以是一个布尔值,`true` 表示显示操作栏骨架屏,`false` 表示不显示。该参数不需要传入具体的值,只需要填写 `-` 即可。\n"
33 | },
34 | {
35 | "title": "如何自定义编辑框的表现?",
36 | "md": "参数 `renderFormItem` 用于自定义在编辑模式下的表单项的显示形式,可以传入一个自定义的 DOM 元素。\n"
37 | },
38 | {
39 | "title": "如何自定义只读模式下的表现形式?",
40 | "md": "参数 `render` 用于自定义在只读模式下的表现形式,可以传入一个自定义的 DOM 元素。\n请注意,所有参数均有默认值,具体的默认值请查看上方的表格。\n"
41 | }
42 | ]
--------------------------------------------------------------------------------
/meta/umi/access.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "src/access.ts 文件的作用是什么?",
4 | "md": "`src/access.ts` 文件是权限定义文件,用于定义项目中的权限。它需要默认导出一个方法,在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。\n"
5 | },
6 | {
7 | "title": "initialState 参数在 src/access.ts 文件中有什么作用?",
8 | "md": "`initialState` 是通过初始化状态插件 `initial-state` 提供的数据。它可以用来初始化用户权限。在 `src/access.ts` 文件中,可以使用 `initialState` 来获取用户的 userId 和 role,以确定用户具有哪些权限。\n"
9 | },
10 | {
11 | "title": "src/access.ts 文件中的权限是如何定义的?",
12 | "md": "在 `src/access.ts` 文件中,权限通过返回的对象来进行定义。对象的每一个键值对都对应一条权限。例如,`canReadFoo` 是一个权限,对应值为 `true`,表示用户具有读取 Foo 的权限。`canUpdateFoo` 是另一条权限,对应值为 `role === 'admin'`,表示用户具有更新 Foo 的权限当且仅当用户的角色为 'admin'。`canDeleteFoo` 是一条更为复杂的权限,对应值为一个回调函数。该函数根据传入的 `foo` 对象和用户的 `userId` 来判断用户是否具有删除 Foo 的权限。\n以上就是 `src/access.ts` 文件中权限的定义方式。通过定义权限,可以在项目中根据用户的角色和其他条件来控制用户的访问和操作权限。\n"
13 | },
14 | {
15 | "title": "如何在 Ant Design 中配置页面权限控制",
16 | "md": "要在 Ant Design 中配置页面权限控制,可以使用配合 `layout` 插件进行扩展的路由配置。以下是一个示例:\n```ts\nexport const routes = [\n {\n path: '/pageA',\n component: 'PageA',\n access: 'canReadPageA',\n },\n];\n```\n在上述示例中,`routes` 是一个路由配置数组,其中每个对象代表一个页面。每个页面对象包含 `path`、`component` 和 `access` 属性。`path` 是页面的访问路径,`component` 是页面组件的名称或路径,`access` 是页面需要的权限。\n通过配置 `access` 属性,可以控制只有具备特定权限的用户才能访问该页面。在示例中,用户只有拥有 `canReadPageA` 权限才能访问 `/pageA` 页面。\n如果用户没有权限访问页面,则会默认渲染 Layout 插件内置的权限错误页面。\n请注意,`access` 的值是权限定义返回值的某个键(在 `src/access.ts` 中定义)。\n希望上述信息能够帮助您理解如何在 Ant Design 中配置页面权限控制。\n"
17 | },
18 | {
19 | "title": "如何自定义权限页面配置",
20 | "md": "默认情况下,Layout 插件会使用内置的权限错误页面进行渲染。如果你想自定义权限页面,可以在 `src/app.tsx` 文件中进行配置。\n首先,你需要在该文件中定义 `layout` 函数,并返回一个对象。在该对象中,你可以设置自定义的权限页面。\n以下是一个示例:\n```tsx\nexport const layout: RunTimeLayoutConfig = () => {\n return {\n // 自定义 403 页面\n unAccessible: 'unAccessible',\n // 自定义 404 页面\n noFound: 'noFound',\n };\n};\n```\n在上述示例中,我们定义了两个自定义权限页面:`unAccessible` 和 `noFound`。你可以根据自己的需求来设置这些页面的内容。\n请注意,以上配置需要在 `src/app.tsx` 文件中进行,并且需要按照以上示例的格式进行编写。\n该配置将覆盖默认的权限页面,使得渲染时会使用自定义的页面内容。\n通过以上信息生成的 文档如下:\n"
21 | },
22 | {
23 | "title": "如何自定义权限页面配置?",
24 | "md": "要自定义权限页面配置,你需要在 `src/app.tsx` 文件中定义一个名为 `layout` 的函数,并返回一个对象。在该对象中,你可以设置自定义的权限页面。具体的配置如下:\n```tsx\nexport const layout: RunTimeLayoutConfig = () => {\n return {\n // 自定义 403 页面\n unAccessible: 'unAccessible',\n // 自定义 404 页面\n noFound: 'noFound',\n };\n};\n```\n在上述示例中,我们定义了两个自定义权限页面:`unAccessible` 和 `noFound`。你可以根据自己的需求来设置这些页面的内容。\n请注意,以上配置需要在 `src/app.tsx` 文件中进行,并且需要按照以上示例的格式进行编写。\n这样配置之后,默认的渲染 Layout 插件内置的权限错误页面将会被替换为自定义的页面内容。\n"
25 | },
26 | {
27 | "title": "如何使用 useAccess Hooks 在组件中获取权限相关信息?",
28 | "md": "要使用 `useAccess` Hooks 在组件中获取权限相关信息,请按照以下步骤操作:\n1. 首先,在你的组件中导入 `useAccess` 方法。可以使用以下代码将其导入到你的组件中:\n```js\nimport { useAccess } from 'umi';\n```\n2. 定义你的组件,并在组件函数中调用 `useAccess` 方法,将其赋值给一个变量,例如 `access`。你可以使用以下代码在组件函数中获取权限相关信息:\n```js\nconst access = useAccess();\n```\n3. 现在,你可以在组件中使用 `access` 变量来获取权限相关信息。例如,如果你想检查是否有权限读取 `Foo`,你可以使用以下代码:\n```js\nif (access.canReadFoo) {\n // 如果可以读取 Foo,则...\n}\n```\n4. 最后,根据你的需求,在组件中编写其他逻辑或返回 JSX 元素。\n注意:`useAccess` Hooks 是基于你在项目中配置的权限规则生成的,并且与 `Access` 组件配合使用可以实现页面内元素的权限控制。\n"
29 | },
30 | {
31 | "title": "How to use CSS variable mode in Ant Design 5.x?",
32 | "md": "Starting from version 5.12.0, Ant Design reintroduced the CSS variable mode, which is a feature that was available in version 4.x. In this version, Ant Design combines the capabilities of CSS-in-JS and manages all design tokens using CSS variables. This means that styles in different themes can be shared within the same component, reducing the overall size of styles. Additionally, switching themes no longer requires re-serializing styles, resulting in improved performance when changing themes. If your application relies on Ant Design's theme capabilities, it is highly recommended to enable the CSS variable mode.\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/umi/boilerplate.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在当前目录下创建一个 `my-umi-app` 的项目?",
4 | "md": "你可以使用以下命令在当前目录创建一个名为 `my-umi-app` 的 Umi 项目:\n```\npnpm create umi my-umi-app\n```\n运行这个命令后,会自动安装 `create-umi` 脚手架,并创建一个最基本的 Umi 项目。\n"
5 | },
6 | {
7 | "title": "在创建项目时,有哪些可选项需要注意?",
8 | "md": "在运行 `pnpm create umi my-umi-app` 命令时,会出现两个可选项:\n1. 选择 Npm 客户端\n你可以从以下几个选项中选择你习惯使用的 Node 依赖管理工具:\n* npm\n* cnpm\n* tnpm\n* yarn\n* pnpm(Umi 官方推荐)\n2. 选择 Npm 源\n你可以从以下几个选项中选择你想要使用的 Npm 源:\n* npm\n* taobao\n选择好这两个选项后,脚手架会根据你的选择生成一个最基本的 Umi 项目,并自动安装依赖。\n"
9 | },
10 | {
11 | "title": "生成的项目结构是怎样的?",
12 | "md": "创建完项目后,你会在当前文件夹下看到一个名为 `my-umi-app` 的文件夹。这个文件夹包含了以下文件和文件夹:\n* package.json:Umi 项目的配置文件。\n* pnpm-lock.yaml:pnpm 安装依赖的锁定文件。\n* src/assets:存放项目的静态资源文件。\n* src/layouts:存放项目的布局文件。\n* src/pages:存放项目的页面文件。\n* tsconfig.json:TypeScript 的配置文件。\n* typings.d.ts:TypeScript 的类型声明文件。\n这样,你就成功地一键初始化了一个 Umi 项目。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/umi/client-loader.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何使用 `useClientLoaderData` 钩子函数获取 `clientLoader` 函数返回的数据?",
4 | "md": "要使用 `useClientLoaderData` 钩子函数获取 `clientLoader` 函数返回的数据,可以按照以下步骤进行操作:\n1. 在需要获取数据的页面组件中,引入 `useClientLoaderData` 钩子函数。\n2. 在页面组件中调用 `useClientLoaderData` 钩子函数,将返回的 `data` 解构赋值给变量。\n3. 在页面组件中使用该变量来显示相应的数据。\n注意,`useClientLoaderData` 钩子函数是通过 umi 提供的自定义 hooks `useClientLoaderData` 来实现的。\n"
5 | },
6 | {
7 | "title": "如何在页面组件中显示 `clientLoader` 函数返回的数据?",
8 | "md": "要在页面组件中显示 `clientLoader` 函数返回的数据,可以按照以下步骤进行操作:\n1. 在页面组件中定义一个变量,例如 `data`,用于保存 `clientLoader` 函数返回的数据。\n2. 在页面组件中调用 `useClientLoaderData` 钩子函数,将返回的 `data` 解构赋值给变量。\n3. 在页面组件的 JSX 内容中使用该变量来渲染相应的数据。\n例如,在一个 `SomePage` 组件中,可以使用以下代码来显示 `clientLoader` 函数返回的数据:\n```tsx\nimport { useClientLoaderData } from 'umi';\n\nexport default function SomePage() {\n const { data } = useClientLoaderData();\n return {data};\n}\n```\n在上述代码中,`data` 变量保存了 `clientLoader` 函数返回的数据,并在 `` 中进行了展示。\n"
9 | },
10 | {
11 | "title": "如何优化三层嵌套路由的数据请求?",
12 | "md": "在三层嵌套路由的场景中,瀑布流式的数据请求会严重影响用户的体验。为了提高页面渲染速度,我们可以采用以下优化方法:\n1. 将组件请求数据的程序提取到 `clientLoader` 中。这样,Umi 可以并行地请求这些数据,而不必等待前一层路由的组件加载完成。\n\n 优化前的瀑布流请求示意图如下:\n\n \n\n 优化后的并行请求示意图如下:\n\n \n\n 通过将组件请求数据的程序提取到 `clientLoader` 中,可以避免瀑布流式的数据请求,提高页面加载速度,提升用户体验。\n\n 例如,将第一层路由的组件请求数据的逻辑提取到 `clientLoader` 中,使得第一层路由的组件可以并行加载,不必等待数据请求完成。\n\n2. 合理使用数据缓存。在嵌套路由场景中,可能会存在多次加载同一组件的情况。为了避免重复加载和数据请求,可以合理使用数据缓存。可以通过 `dva` 的 `loading` 属性来判断数据是否已经加载完成,如果已经加载完成,则不再进行重复请求。\n\n 例如,当第一层路由的数据请求完成后,可以将请求结果保存到应用的状态管理中,下次再加载该组件时,先从状态管理中获取数据,避免重复请求。\n\n3. 使用异步组件加载。在嵌套路由场景中,可以使用异步组件加载的方式来提高页面渲染速度。异步组件加载可以将页面的组件划分为更小的模块,按需加载,减少首屏加载所需的资源。\n\n 例如,将各个路由的组件按照层级划分为多个异步组件,根据路由的层级加载对应的异步组件,可以提高页面渲染速度,减少不必要的资源加载。\n通过以上优化方法,可以有效地提高三层嵌套路由场景下页面的加载速度,提升用户的体验。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/umi/debug.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何调试 dev 阶段的构建产物?",
4 | "md": "要调试项目的构建产物,在这里以 `umi.js` 为例,你可以按照以下步骤进行操作:\n1. 首先,将原来的 `umi.js` 下载到你的当前项目根目录下。\n\n2. 然后,根据你的调试需要,对该文件进行编辑。\n\n3. 接下来,在浏览器中刷新你的项目页面,此时项目会开始使用根目录下的 `umi.js` 文件。\n\n4. 如果你调试完毕并想要恢复原状,只需删除根目录下的 `umi.js` 文件即可。\n希望以上信息可以帮助到你!\n"
5 | },
6 | {
7 | "title": "XSwitch 是什么?如何使用?",
8 | "md": "XSwitch 是一个 Chrome 插件,提供了在特定的域名环境调试或验证代码的功能。你可以通过 [XSwitch Chrome 插件下载链接](https://chrome.google.com/webstore/detail/xswitch/idkjhjggpffolpidfkikidcokdkdaogg) 下载并安装 XSwitch 插件。安装完插件后,在特定的域名环境下,你可以通过 XSwitch 配置转发规则,替换特定资源的动态地址,以便调试或验证你的本地代码。\n"
9 | },
10 | {
11 | "title": "如何使用 XSwitch 配置转发规则调试本地代码?",
12 | "md": "如果你想在线上项目地址 `https://www.myproject.com` 上调试本地代码,可以使用 XSwitch 配置转发规则来实现。在配置转发规则之前,请确保你的本地开发环境已经启动,并设置了环境变量 `SOCKET_SERVER`。下面是具体的步骤:\n1. 使用环境变量 `SOCKET_SERVER` 启动本地环境(防止因为连接不上 socket server 导致页面不断刷新)。示例代码如下:\n```bash\n $SOCKET_SERVER=http://127.0.0.1:8000/ npx umi dev\n```\n2. 打开 XSwitch 插件,在转发规则中配置相应的资源替换规则。示例配置如下:\n```json\n{\n \"proxy\": [\n [\n \"https://www.myproject.com/umi.2c8a01df.js\",\n \"http://127.0.0.1:8000/umi.js\"\n ],\n [\"https://www.myproject.com/(.*.js)\", \"http://127.0.0.1:8000/$1\"],\n [\n \"https://www.myproject.com/umi.ae8b10e0.css\",\n \"http://127.0.0.1:8000/umi.css\"\n ]\n ]\n}\n```\n这里的配置表示将 `https://www.myproject.com/umi.2c8a01df.js` 替换为本地开发环境的 `http://127.0.0.1:8000/umi.js`,将 `https://www.myproject.com/` 下的所有以 `.js` 结尾的资源替换为本地相同路径的资源,将 `https://www.myproject.com/umi.ae8b10e0.css` 替换为本地开发环境的 `http://127.0.0.1:8000/umi.css`。 3. 刷新页面,正式域名下的内容就被替换了,你就可以方便地在特定环境下调试你的代码了。\n"
13 | },
14 | {
15 | "title": "如何退出 XSwitch 的调试模式?",
16 | "md": "如果你调试完毕或者不需要继续调试,你可以关闭 XSwitch 插件的功能来退出调试模式。在 Chrome 浏览器中,点击 XSwitch 插件图标,即可关闭插件功能。\n"
17 | },
18 | {
19 | "title": "如何保存 XSwitch 的转发规则?",
20 | "md": "如果你经常使用 XSwitch,并且希望保存你的转发规则,可以新建一个规则保存起来。在 XSwitch 插件中,你可以点击新建规则按钮,并输入规则名称,将你的转发规则保存起来。\n"
21 | },
22 | {
23 | "title": "如何找到 XSwitch 插件图标?",
24 | "md": "XSwitch 插件的图标一般会显示在 Chrome 浏览器的工具栏中。如果 XSwitch 插件的图标没有显示在工具栏中,你可以在 Chrome 浏览器的扩展程序管理页面找到 XSwitch,并将其固定到工具栏中。\n"
25 | }
26 | ]
--------------------------------------------------------------------------------
/meta/umi/env-variables.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Windows 中如何设置环境变量并执行 umi dev 命令?",
4 | "md": "在 Windows 系统中,可以使用 `set` 命令来设置环境变量,并使用 `&&` 运算符执行 `umi dev` 命令。具体的操作步骤如下:\n1. 打开命令提示符(cmd.exe)。\n2. 输入以下命令,并将 `PORT` 的值设置为 `3000`:\n```tsx\n set PORT=3000&&umi dev\n```\n3. 执行以上命令后,umi 将会以 `3000` 端口启动开发服务器,并开始监听文件变化以进行热更新。\n请注意,以上命令适用于 Windows 系统。如果需要在不同的操作系统中使用环境变量,推荐使用工具 [cross-env](https://github.com/kentcdodds/cross-env)。\n"
5 | },
6 | {
7 | "title": "如何在不同的操作系统中使用环境变量来执行 umi dev 命令?",
8 | "md": "如果你需要在不同的操作系统中使用环境变量来执行 `umi dev` 命令,可以使用工具 [cross-env](https://github.com/kentcdodds/cross-env) 来实现。以下是具体的操作步骤:\n1. 打开命令提示符或终端。\n2. 使用包管理工具(如 pnpm、npm 或 yarn)安装 `cross-env`:\n```bash\n $ pnpm install cross-env -D\n```\n3. 在命令行中使用 `cross-env` 命令来设置环境变量,并执行 `umi dev` 命令。例如,设置 `PORT` 的值为 `3000`:\n```bash\n $ cross-env PORT=3000 umi dev\n```\n4. 执行以上命令后,umi 将会以指定的端口启动开发服务器,并开始监听文件变化以进行热更新。\n通过使用 `cross-env` 工具,你可以在不同的操作系统中统一设置环境变量并执行 umi 命令,避免了操作系统之间的差异性带来的问题。\n"
9 | },
10 | {
11 | "title": "可以使用哪些工具在不同的操作系统中设置环境变量并执行 umi dev 命令?",
12 | "md": "在不同的操作系统中,可以使用多种工具来设置环境变量并执行 `umi dev` 命令。以下是一些常用的工具:\n1. cross-env:一个可以跨平台设置环境变量的 npm 包,可以在任意操作系统中使用。\n * 安装 cross-env:使用包管理工具(如 pnpm、npm 或 yarn)安装 `cross-env`:\n```bash\n $ pnpm install cross-env -D\n```\n* 使用 cross-env:在命令行中使用 `cross-env` 命令来设置环境变量,并执行 `umi dev` 命令。例如,设置 `PORT` 的值为 `3000`:\n```bash\n $ cross-env PORT=3000 umi dev\n```\n通过使用这些工具,你可以在不同的操作系统中灵活地设置环境变量并执行 umi 命令,提高开发效率并避免操作系统之间的差异性带来的问题。\n问题 1:如何在 umi 项目中修改端口号?\n回答 1:要在 umi 项目中修改端口号,你需要修改项目根目录下的 `.env` 文件。在该文件中找到名为 `PORT` 的变量,并将其值修改为你想要的端口号。例如,如果你想将端口号修改为 4000,可以将 `PORT=3000` 修改为 `PORT=4000`。然后,在终端中执行 `umi dev` 命令,umi 会以修改后的端口号启动 dev server。\n"
13 | },
14 | {
15 | "title": "如何禁用 umi 项目中的 babel 缓存?",
16 | "md": "回答 2:要禁用 umi 项目中的 babel 缓存,你需要修改项目根目录下的 `.env` 文件。在该文件中找到名为 `BABEL_CACHE` 的变量,并将其值修改为 `none`。然后,在终端中执行 `umi dev` 命令,umi 会在运行时禁用 babel 缓存。\n"
17 | },
18 | {
19 | "title": "如果我想在本地开发时使用不同于 `.env` 文件中的配置,应该如何配置?",
20 | "md": "回答 3:如果你需要在本地开发时使用不同于 `.env` 文件中的配置,可以在项目根目录下创建一个名为 `.env.local` 的文件。在该文件中,你可以覆盖之前在 `.env` 文件中定义的配置。例如,如果你想在本地开发时将端口号修改为 4000,可以在 `.env.local` 文件中定义 `PORT=4000`。运行 `umi dev` 命令时,umi 将使用 `.env.local` 文件中的配置来覆盖 `.env` 文件中的配置。\n"
21 | },
22 | {
23 | "title": "如何使用 `config.ts` 文件?",
24 | "md": "在 UMI 中,`config.ts` 文件是用于配置项目的文件。它可以设置路由、插件、代理等项目相关的配置信息。当你运行项目时,默认会加载该文件中的配置。\n要使用 `config.ts` 文件,你可以按照以下步骤操作:\n1. 在你的项目根目录下创建一个名为 `config.ts` 的文件。\n\n2. 在 `config.ts` 文件中,可以根据你的需要添加与项目相关的配置信息,例如:\n```javascript\n export default {\n routes: [...], // 设置路由\n plugins: [...], // 设置插件\n proxy: {...}, // 设置代理\n // 其他配置项...\n };\n```\n3. 当你运行项目时,UMI 会自动加载并应用 `config.ts` 文件中的配置。\n通过以上步骤,你就可以使用 `config.ts` 文件来配置你的 UMI 项目了。\n"
25 | },
26 | {
27 | "title": "如何使用 `config.${UMI_ENV}.ts` 文件?",
28 | "md": "`config.${UMI_ENV}.ts` 文件是根据 `UMI_ENV` 环境变量来加载的配置文件。当你指定了 `UMI_ENV` 值时,UMI 会加载对应的 `config.${UMI_ENV}.ts` 文件。这样,你可以根据不同的环境设置不同的项目配置。\n要使用 `config.${UMI_ENV}.ts` 文件,你可以按照以下步骤操作:\n1. 在你的项目根目录下创建一个名为 `config.${UMI_ENV}.ts` 的文件。其中,`${UMI_ENV}` 指的是你要指定的环境变量值,例如 `dev`、`prod`、`test`。\n\n2. 在 `config.${UMI_ENV}.ts` 文件中,可以根据你的需要添加与该环境相关的配置信息。这些配置会在该环境下覆盖掉 `config.ts` 文件中相同的配置项。\n```javascript\nexport default {\n // 该环境下的配置项...\n};\n```\n3. 当你运行项目时,UMI 会根据指定的 `UMI_ENV` 值加载对应的 `config.${UMI_ENV}.ts` 文件,并应用其中的配置。\n通过以上步骤,你就可以使用 `config.${UMI_ENV}.ts` 文件来设置不同环境下的项目配置了。\n"
29 | },
30 | {
31 | "title": "如何使用 `config.${dev | prod | test}.ts` 文件?",
32 | "md": "在 UMI 中,当你没有指定 `UMI_ENV` 环境变量时,UMI 会根据当前的环境自动加载对应的配置文件。这些文件名分别为 `config.dev.ts`、`config.prod.ts` 和 `config.test.ts`。\n你可以根据不同的环境,在对应的配置文件中设置与该环境相关的项目配置。\n要使用 `config.${dev | prod | test}.ts` 文件,你可以按照以下步骤操作:\n1. 在你的项目根目录下创建一个名为 `config.${dev | prod | test}.ts` 的文件。其中,`${dev | prod | test}` 指的是你的当前环境,例如 `dev`、`prod`、`test`。\n\n2. 在 `config.${dev | prod | test}.ts` 文件中,可以根据你的需要添加与该环境相关的配置信息。这些配置会在该环境下覆盖掉 `config.ts` 文件中相同的配置项。\n```javascript\nexport default {\n // 该环境下的配置项...\n};\n```\n3. 当你运行项目时,UMI 会根据当前环境加载对应的 `config.${dev | prod | test}.ts` 文件,并应用其中的配置。\n通过以上步骤,你就可以使用 `config.${dev | prod | test}.ts` 文件来设置不同环境下的项目配置了。\n请注意,这些配置文件的优先级是从上到下降低的,越往下的越具体,优先级更高。因此,高优的配置可以往下移动。\n希望以上信息对你有所帮助!如果你还有任何问题,请随时提问。\n"
33 | }
34 | ]
--------------------------------------------------------------------------------
/meta/umi/faq.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何关闭 dynamicImport?",
4 | "md": "要关闭 dynamicImport,你可以按照以下步骤进行操作:\n1. 首先,在你的项目中安装依赖:\n```bash\npnpm i babel-plugin-dynamic-import-node -D\n```\n2. 然后,在你的配置文件中添加 `extraBabelPlugins` 配置项,但只在生产环境中启用该插件:\n```ts\n// .umirc.ts\nexport default {\n extraBabelPlugins:\n process.env.NODE_ENV === 'production'\n ? ['babel-plugin-dynamic-import-node']\n : [],\n};\n```\n请注意,关闭 dynamicImport 不是一个推荐的做法,因为它可以帮助你实现按需加载,提升应用性能。因此,你应该在确保不会对应用性能产生负面影响的情况下使用它。\n"
5 | },
6 | {
7 | "title": "umi v4 升级了默认的 react 版本到 v18,可以使用 react 17 吗?",
8 | "md": "由于 umi v4 升级了默认的 react 版本到 v18,如果需要使用 react 17,请执行以下命令并重启:\n```bash\npnpm add react@^17 react-dom@^17\n```\n"
9 | },
10 | {
11 | "title": "切换到 umi4 后,可以使用 react 17 吗?",
12 | "md": "如果你切换到 umi4,注意 umi4 默认使用的 react 版本是 v18。如果你仍然需要使用 react 17,可以通过以下命令安装 react 17 的依赖并重启:\n```bash\npnpm add react@^17 react-dom@^17\n```\n"
13 | },
14 | {
15 | "title": "umi4 支持使用 react 17 吗?",
16 | "md": "umi4 升级了默认的 react 版本到 v18。如果你仍然需要使用 react 17,你可以通过执行以下命令并重启来安装 react 17 的依赖:\n```bash\npnpm add react@^17 react-dom@^17\n```\n请注意,以上的命令是使用 pnpm 包管理器进行安装的,如果你使用的是其他的包管理器,请相应地调整命令。\n"
17 | },
18 | {
19 | "title": "如何解决代理静态资源到本地后一直刷新页面的问题?",
20 | "md": "问题描述:我在代理静态资源到本地后,发现页面一直在刷新。这给我的开发工作带来了一些困扰。\n解决方法:你可以配置 `SOCKET_SERVER=127.0.0.1:${port}` 来启动你的项目。具体操作如下:\n```bash\nSOCKET_SERVER=http://127.0.0.1:8000 pnpm dev\n```\n通过以上配置,你可以解决页面一直刷新的问题。\n"
21 | },
22 | {
23 | "title": "为什么我的页面一直在刷新?",
24 | "md": "问题描述:最近我将静态资源代理到本地进行开发,但是发现页面一直在刷新,并无法正常加载。\n解决方法:你可以尝试配置 `SOCKET_SERVER=127.0.0.1:${port}` 启动你的项目。具体操作如下:\n```bash\nSOCKET_SERVER=http://127.0.0.1:8000 pnpm dev\n```\n这样的配置能够解决页面一直刷新的问题,让你的页面能够正常加载。\n"
25 | },
26 | {
27 | "title": "如何停止页面一直刷新的问题?",
28 | "md": "问题描述:在我将静态资源代理到本地后,页面一直在刷新,无法停止刷新。\n解决方法:你可以通过配置 `SOCKET_SERVER=127.0.0.1:${port}` 来解决这个问题。具体操作如下:\n```bash\nSOCKET_SERVER=http://127.0.0.1:8000 pnpm dev\n```\n配置之后,你的页面将不再一直刷新,可以正常加载了。\n"
29 | }
30 | ]
--------------------------------------------------------------------------------
/meta/umi/layout-menu.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "是否开始国际化配置",
4 | "md": "* 类型:布尔值(boolean)\n* 默认值:false\n是否启用国际化配置。开启后,路由配置中的菜单名将被视为菜单名国际化的键值,插件将查找 locales 文件以获取对应的`menu.[key]`的文本。默认情况下,键值与路由配置中的`name`字段相同。如果菜单是多级路由,例如二级路由菜单,插件将查找 locales 文件以获取`menu.[key].[key]`对应的文本。此功能需要配置`i18n`才能使用。如果不需要菜单国际化,可以将其配置为`false`进行关闭。\n"
5 | },
6 | {
7 | "title": "logout",
8 | "md": "`logout` 是一个函数,用于处理用户点击退出登录的操作。它接收一个 `initialState` 参数,并根据需要对用户的登录状态进行处理。\n默认情况下,`logout` 的值为 `null`,即没有任何处理逻辑。在默认的布局 UI 中,顶部右侧并不会显示退出按钮。如果想要显示退出按钮并实现退出登录功能,需要在运行配置中配合运行时配置 `app.ts(x)` 中的 `getInitialState` 方法返回一个对象。\n通过在运行时配置中设置合适的 `logout` 函数,可以实现用户点击退出登录时的相关操作,例如清除用户的登录信息、跳转到登录页面或执行其他自定义的逻辑。\n请根据具体需求,为 `logout` 方法提供对应的处理逻辑。\n"
9 | },
10 | {
11 | "title": "扩展的路由配置",
12 | "md": "Layout 插件会基于 Umi 的路由,封装了更多的配置项,支持更多配置式的能力。新增的配置如下:\n* 侧边栏菜单配置。\n* 布局路由级别展示/隐藏相关配置。\n* 与权限插件结合,配置式实现权限路由的功能。\n示例如下:\n```typescript\n// config/route.ts\nexport const routes: IBestAFSRoute[] = [\n {\n path: '/welcome',\n component: 'IndexPage',\n name: '欢迎',\n icon: 'testicon',\n target: '_blank',\n headerRender: false,\n footerRender: false,\n menuRender: false,\n menuHeaderRender: false,\n access: 'canRead',\n hideChildrenInMenu: true,\n hideInMenu: true,\n hideInBreadcrumb: true,\n flatMenu: true,\n },\n];\n```\n这些配置项可以用来定制路由的显示和隐藏,在面包屑、侧边栏菜单和顶栏中控制路由的可见性。\n其中:\n* `component` 表示该路由对应的组件。\n* `name` 是菜单项的名称,可以在侧边栏中显示。\n* `icon` 是菜单项的图标。\n* `target` 可以设置链接的打开方式,例如在新页面打开。\n* `headerRender` 可以控制是否在顶栏中展示路由。\n* `footerRender` 可以控制是否在页脚中展示路由。\n* `menuRender` 可以控制是否在菜单中展示路由。\n* `menuHeaderRender` 可以控制是否在菜单顶栏中展示路由。\n* `access` 是一个权限配置项,需要和权限插件配合使用。\n* `hideChildrenInMenu` 可以隐藏子菜单。\n* `hideInMenu` 可以隐藏自己和子菜单。\n* `hideInBreadcrumb` 可以在面包屑中隐藏。\n* `flatMenu` 可以将子项往上提,仍然展示。\n这些配置项使得路由的控制更加灵活,可以根据需求来展示或隐藏路由及相关内容。\n"
13 | },
14 | {
15 | "title": "flatMenu",
16 | "md": "* 类型: `boolean`\n* 默认值: `false`\n* 说明: 当设置为 true 时,在菜单中只隐藏当前项,子项则继续展示,从而实现菜单的展开与收起。\n该属性用于控制菜单是否打平显示。当你希望子级的菜单项不显示自身而直接展示在上一级菜单中时,可以将该属性配置为 true。\n示例:\n```tsx\nconst before = [{ name: '111' }, { name: '222', children: [{ name: '333' }] }];\n// flatMenu = true\nconst after = [{ name: '111' }, { name: '222' }, { name: '333' }];\n```\n提供了 xxxRender 参数用于在布局中显示或隐藏特定的模块。根据不同的需求,可以设置以下参数:\n* `headerRender=false`:不显示顶栏\n* `footerRender=false`:不显示页脚\n* `menuRender=false`:不显示菜单\n* `menuHeaderRender=false`:不显示菜单的标题和 logo\n通过设置以上参数为 false,可以根据实际情况来决定是否展示特定的布局模块。\n请注意,以上参数的默认值都是 true,即默认情况下会显示对应的布局模块。根据具体需求,灵活设置 xxxRender 参数,以满足项目的需求。\n"
17 | },
18 | {
19 | "title": "hideChildrenInMenu 在 Ant Design Pro 中如何使用?",
20 | "md": "hideChildrenInMenu 是 Ant Design Pro 中的一个属性,用于控制菜单的显示和隐藏。\n当 hideChildrenInMenu 的值为 true 时,子菜单将会被隐藏,只显示父级菜单。这对于需要简化页面显示的场景非常有用。\n"
21 | },
22 | {
23 | "title": "hideInMenu 在 Ant Design Pro 中的使用方法是什么?",
24 | "md": "hideInMenu 是 Ant Design Pro 中的一个属性,用于控制菜单的显示和隐藏。\n当隐藏某个页面时,可以将 hideInMenu 的值设为 true,这样该页面将不会在菜单中显示。这在需要隐藏某些敏感或不常用页面时非常有用。\n"
25 | },
26 | {
27 | "title": "hideInBreadcrumb 在 Ant Design Pro 中如何使用?",
28 | "md": "hideInBreadcrumb 是 Ant Design Pro 中的一个属性,用于控制在面包屑中的显示和隐藏。\n当设置 hideInBreadcrumb 的值为 true 时,该页面在面包屑导航中将被隐藏,不会在导航中显示路径。这对于一些不需要展示在面包屑导航中的页面非常有用,可以减少面包屑导航的冗余信息。\n"
29 | }
30 | ]
--------------------------------------------------------------------------------
/meta/umi/philosophy.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Umi 的设计思路中的技术收敛是指什么?",
4 | "md": "技术收敛是 Umi 框架设计思路中的一个重要概念。它指的是将复杂多样的技术问题通过统一的方式解决,使得开发者在使用 Umi 框架时不再需要关注底层技术细节,从而提高开发效率。技术收敛帮助开发团队快速构建企业级应用,将重复性的工作交给框架去做,减少重复劳动。\n"
5 | },
6 | {
7 | "title": "Umi 框架中的插件和插件集是什么?",
8 | "md": "插件和插件集是 Umi 框架设计思路中的两个重要概念。插件是指通过配置文件将一些通用的功能和扩展集成到应用中,例如路由、状态管理、国际化等,从而提高开发效率和代码质量。插件集是指一组相关的插件的集合,可以根据需求选择性地引入,实现功能的灵活组合。\n"
9 | },
10 | {
11 | "title": "Umi 框架的最佳实践指什么?",
12 | "md": "最佳实践是指在使用 Umi 框架时的一些官方推荐的规范和经验总结。Umi 框架提供了一些约定和规范,通过遵循这些最佳实践可以使得开发团队更好地利用框架的特性和功能,编写出高质量的代码。最佳实践不仅包括代码规范,还包括项目结构、性能优化、异常处理等方面的建议。\n"
13 | },
14 | {
15 | "title": "Umi 框架的企业级特性是什么?",
16 | "md": "Umi 框架设计思路中强调了企业级特性的重要性。企业级特性包括多人协作、数据权限管理、项目部署等一系列与企业级需求相关的功能。Umi 框架提供了一些与企业级开发密切相关的功能和工具,帮助开发团队更好地应对复杂的业务需求和团队协作。\n"
17 | },
18 | {
19 | "title": "Umi 框架中的 import all from umi 是什么意思?",
20 | "md": "import all from umi 是 Umi 框架设计思路中的一个特性。它指的是通过一行代码将整个应用的路由、路由组件和页面组件全部导入,方便进行动态路由配置和页面渲染。import all from umi 的使用简化了繁琐的路由配置和组件导入过程,提高了开发效率和代码可读性。\n"
21 | }
22 | ]
--------------------------------------------------------------------------------
/meta/umi/prepare.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Umi.js 需要使用 Node.js 进行开发吗?",
4 | "md": "是的,Umi.js 需要使用 Node.js 来进行开发。请确保电脑已经安装了 Node.js,并且版本在 14 以上。如果还没有安装,你可以前往 [Node.js 官网](https://nodejs.org/zh-cn/) 下载并安装。\n"
5 | },
6 | {
7 | "title": "如何在 macOS 上安装 Node.js?",
8 | "md": "在 macOS 环境下,我们建议使用 [nvm](https://github.com/nvm-sh/nvm) 来管理 Node.js 的版本。你可以使用以下命令来安装 nvm 和 Node.js:\n```bash\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash\nnvm -v\n\n0.39.1\n```\n安装完成后,你可以使用以下命令来安装指定版本的 Node.js:\n```bash\nnvm install 16\nnvm use 16\n```\n然后,你可以使用以下命令来检查是否安装成功并且安装了正确的版本:\n```bash\nnode -v\n\nv16.14.0\n```\n"
9 | },
10 | {
11 | "title": "如何在 Windows 上安装 Node.js?",
12 | "md": "在 Windows 环境下,我们建议使用 [nvm-windows](https://github.com/coreybutler/nvm-windows) 来管理 Node.js 的版本。你可以前往该项目的 GitHub 页面上进行下载和安装。\n安装完成后,你可以使用以下命令来安装指定版本的 Node.js:\n```bash\nnvm install 16\nnvm use 16\n```\n然后,你可以使用以下命令来检查是否安装成功并且安装了正确的版本:\n```bash\nnode -v\n\nv16.14.0\n```\n请根据你的操作系统选择适合的安装方式,并确保安装正确版本的 Node.js。\n"
13 | },
14 | {
15 | "title": "什么是 npm 依赖管理工具?",
16 | "md": "npm(Node Package Manager)是 Node.js 自带的依赖管理工具,用于管理和发布 JavaScript 代码包。它是一种将代码包进行组织、分享和复用的解决方案。\n"
17 | },
18 | {
19 | "title": "为什么 Umi.js 推荐使用 pnpm 来管理依赖?",
20 | "md": "Umi.js 是一个基于 React 的可插拔企业级前端应用框架,它推荐使用 pnpm 来管理依赖。pnpm 是一种快速、节省磁盘空间的依赖管理工具,相比 npm 和 yarn,在安装和更新依赖时更快更高效。\n"
21 | },
22 | {
23 | "title": "如何安装 pnpm?",
24 | "md": "使用以下命令可以安装 pnpm:\n```bash\ncurl -fsSL https://get.pnpm.io/install.sh | sh -\n```\n"
25 | },
26 | {
27 | "title": "如何检查是否成功安装 pnpm?",
28 | "md": "安装完成后,可以使用以下命令来检查是否成功安装了 pnpm:\n```bash\npnpm -v\n\n7.3.0\n```\n若返回的版本号与预期一致,则说明 pnpm 安装成功。\n"
29 | },
30 | {
31 | "title": "如何安装 Node.js 和 pnpm?",
32 | "md": "安装完 Node.js 和 pnpm 后,你就可以开始前端开发了。以下是安装步骤:\n1. 首先,你需要下载 Node.js 的安装包。你可以在 Node.js 的官方网站 下载适合你操作系统的版本。\n\n2. 下载完成后,运行安装包并按照提示完成安装。\n\n3. 安装完成后,打开终端或命令行界面,并输入以下命令来验证 Node.js 是否成功安装:\n```tsx\nnode - v;\n```\n如果显示了 Node.js 的版本号,说明安装成功。\n4. 接下来,你需要安装 pnpm,它是一个快速、零配置的包管理工具。\n\n 在终端或命令行界面中输入以下命令来安装 pnpm:\n```tsx\n npm install -g pnpm\n```\n安装完成后,输入以下命令来验证 pnpm 是否成功安装:\n```tsx\npnpm - v;\n```\n如果显示了 pnpm 的版本号,说明安装成功。\n"
33 | },
34 | {
35 | "title": "前端开发 IDE 的选择有哪些?",
36 | "md": "当你已经安装好 Node.js 和 pnpm 后,你就可以选择一个适合你的 IDE 或文本编辑器来编写代码了。以下是几个常用的选择:\n1. Visual Studio Code(推荐)- Visual Studio Code 是一个轻量级,免费且强大的代码编辑器。它支持丰富的插件生态系统,可以满足大部分前端开发需求。\n\n2. WebStorm(推荐)- WebStorm 是 JetBrains 公司推出的一款专业的前端开发 IDE。它提供了很多强大的功能,如代码提示、调试工具等,适合专业开发者使用。\n\n3. IntelliJ IDEA - IntelliJ IDEA 是 JetBrains 公司推出的一款综合性的 Java IDE,它也支持前端开发,提供了一些有用的插件和功能。\n\n4. Sublime Text - Sublime Text 是一款轻巧、快速、稳定的文本编辑器。它支持多种编程语言和插件,可以满足大部分前端开发需求。\n\n5. Atom - Atom 是由 GitHub 开发的一款跨平台文本编辑器。它具有可配置性强、插件丰富等特点,适合于个性化定制和轻量级项目的开发。\n根据你的需求和个人喜好,选择一个适合的 IDE 或文本编辑器来开始你的前端开发之旅吧!\n"
37 | }
38 | ]
--------------------------------------------------------------------------------
/meta/umi/proxy.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "什么是代理(Proxy)?",
4 | "md": "代理也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。代理服务器作为中间人,接收客户端的请求并将其转发给目标服务器,然后再将目标服务器的响应返回给客户端。通过使用代理,客户端可以间接地访问其他服务器上的资源,解决跨域访问问题。\n"
5 | },
6 | {
7 | "title": "在项目开发中如何使用代理?",
8 | "md": "在项目开发(dev)中,为了解决跨域访问问题,我们可以通过使用代理来实现。一种常见的代理方式是使用 `http-proxy-middleware` 中间件。通过在配置文件中设置代理规则,可以将特定的请求代理到另一个目标服务器上。\n例如,在配置文件中添加以下代理规则:\n```ts\nexport default {\n proxy: {\n '/api': {\n target: 'http://jsonplaceholder.typicode.com/',\n changeOrigin: true,\n pathRewrite: { '^/api': '' },\n },\n },\n};\n```\n上述配置表示,将以 `/api` 开头的请求代理到目标服务器 `http://jsonplaceholder.typicode.com/` 上。同时,将请求地址中的 `/api` 替换为空字符串,修改请求来源为目标url。例如,请求 `/api/a` 实际上是请求 `http://jsonplaceholder.typicode.com/a`。\n这样,我们可以通过在本地服务器上发起代理请求,间接地获取远程服务器上的数据,解决跨域访问问题。\n"
9 | },
10 | {
11 | "title": "代理的作用是什么?",
12 | "md": "代理的主要作用是解决跨域访问问题。由于浏览器或者 webview 的同源策略限制,引起了跨域访问问题。通过使用代理,我们可以在本地的 node 服务器上发起请求,然后让服务器去请求非同源的远程服务器,从而绕过浏览器的同源策略。代理只是将目标服务器返回的数据传递到前端,不会直接修改发起请求的 URL。因此,在浏览器上看到的请求地址仍然是本地服务器的地址。\n需要注意的是,代理只能解决开发时的跨域访问问题,在部署时可以使用同源部署。如果在生产环境中(build)出现跨域问题,可以将类似的配置转移到 Nginx 容器上进行处理。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/umi/react-query.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何启用 @umijs/max 中的 reactQuery?",
4 | "md": "如果使用 @umijs/max 的 reactQuery,只需在配置文件中添加以下内容:\n```ts\nexport default {\n reactQuery: {},\n};\n```\n"
5 | },
6 | {
7 | "title": "如何启用 umi?",
8 | "md": "如果使用 umi,需要先安装 @umijs/plugins 依赖,然后在配置文件中添加以下内容:\n```bash\n$ pnpm i @umijs/plugins -D\n```\n```ts\nexport default {\n plugins: ['@umijs/plugins/dist/react-query'],\n reactQuery: {},\n};\n```\n"
9 | },
10 | {
11 | "title": "什么是 react-query 的 devtool?",
12 | "md": "devtool 是 react-query 的一个特性,在开发模式下会开启一个 react-query 的浏览器扩展工具,用于在浏览器中查看和调试 react-query 的状态和缓存情况。默认情况下,devtool 是开启的,可以通过 `reactQuery: { devtool: false }` 关闭。\n"
13 | },
14 | {
15 | "title": "如何关闭 react-query 的 queryClient?",
16 | "md": "通过设置 `reactQuery: { queryClient: false }` 可以关闭 react-query 的全局 QueryClient 注册功能。在 app.ts 文件中,可以通过 `export const reactQuery = { queryClient }` 进行配置。\n"
17 | },
18 | {
19 | "title": "如何使用 react-query 的导出?",
20 | "md": "react-query 的大部分导出,可以通过从 `umi` 或 `@umijs/max` 中 import 来使用。这样可以方便地在项目中使用 react-query 的各种功能和组件。\n"
21 | },
22 | {
23 | "title": "什么是 react query 的 devtool 工具?",
24 | "md": "react query 的 devtool 工具是 react query 官方提供的一个开发工具,用于帮助开发者在浏览器中查看 react query 的状态和调试信息。通过 devtool 工具,开发者可以方便地查看和监控正在进行的查询、缓存的数据以及错误信息等。默认情况下,react query 的 devtool 工具是开启的,但你可以通过配置项将其关闭。\n"
25 | },
26 | {
27 | "title": "什么是 react query 的 QueryClient 和 QueryClientProvider?",
28 | "md": "在 react query 中,QueryClient 是一个核心概念,用于管理和缓存所有的查询请求和响应。而 QueryClientProvider 是一个 react 组件,用于将 QueryClient 实例提供给整个应用中的其他组件使用。通过 QueryClientProvider,我们可以在整个应用中使用同一个 QueryClient 实例,确保所有的查询请求都能共享相同的缓存和状态。默认情况下,react query 会注册全局的 QueryClient 和 QueryClientProvider,但你可以通过配置项将其关闭。\n"
29 | },
30 | {
31 | "title": "什么是查询客户端(queryClient)的作用?",
32 | "md": "查询客户端(queryClient)是一个配置项,用于配置查询数据的默认选项。在这个配置项中,可以设置默认的查询函数(`queryFn`),以及其他与查询相关的参数。通过查询客户端,可以统一管理查询数据的行为,方便进行统一的异常处理、数据转换等操作,提升开发效率和代码质量。\n"
33 | },
34 | {
35 | "title": "如何配置开发工具(devtool)和查询客户端(queryClient)?",
36 | "md": "要配置开发工具(devtool)和查询客户端(queryClient),需要提供相应的配置对象,并将其赋值给相应的变量。在配置对象中,可以设置开发工具的属性和查询客户端的属性,以满足具体的需求。配置对象示例:\n```ts\nconst API_SERVER = '/path/to/api/server';\nexport const reactQuery = {\n devtool: {\n initialIsOpen: true,\n },\n queryClient: {\n defaultOptions: {\n queries: {\n queryFn: async ({ queryKey }) => {\n const res = await fetch(`${API_SERVER}/${queryKey.join('/')}`);\n if (res.status !== 200) {\n throw new Error(res.statusText);\n }\n return res.json();\n },\n },\n },\n },\n};\n```\n通过以上配置对象,可以设置开发工具的`initialIsOpen`属性为`true`,使得开发工具在初始时处于打开状态;同时,设置查询客户端的`defaultOptions`属性,指定查询函数`queryFn`为一个异步函数,用于处理查询数据的逻辑。\n"
37 | }
38 | ]
--------------------------------------------------------------------------------
/meta/umi/styled-components.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在 umi 项目中启用 styled-components 插件?",
4 | "md": "启用 styled-components 插件需要在 umi 项目中进行相关配置。请按照以下步骤进行操作:\n1. 首先,确保已经安装了 `@umijs/plugins` 依赖。如果没有安装,请执行以下命令进行安装:\n```bash\n$ pnpm i @umijs/plugins -D\n```\n2. 在项目的配置文件(通常是 `.umirc.ts` 或 `config/config.ts` 文件)中添加 `plugins` 配置项,并把 `'@umijs/plugins/dist/styled-components'` 添加到插件列表中。示例配置如下:\n```ts\nexport default {\n plugins: ['@umijs/plugins/dist/styled-components'],\n styledComponents: {},\n};\n```\n3. 保存配置文件,在 umi 项目中即可使用 styled-components。\n"
5 | },
6 | {
7 | "title": "如何在 @umijs/max 项目中启用 styled-components?",
8 | "md": "启用 styled-components 在 @umijs/max 项目中的配置方法与 umi 有所不同。请按照以下步骤进行操作:\n1. 在 @umijs/max 项目中,styled-components 是默认已经安装的,无需额外安装。\n\n2. 打开项目的配置文件(通常是 `.umirc.ts` 或 `config/config.ts` 文件),在 `export default` 中的 `styledComponents` 对象下添加以下配置:\n```ts\nexport default {\n styledComponents: {},\n};\n```\n3. 保存配置文件,在 @umijs/max 项目中即可使用 styled-components。\n"
9 | },
10 | {
11 | "title": "什么是 styled-components 的插件?",
12 | "md": "styled-components 的插件是一个可以帮助你使用 styled-components 的工具。它提供了一些功能帮助你更方便地使用 styled-components。\n"
13 | },
14 | {
15 | "title": "styled-components 插件都可以从哪里导入使用?",
16 | "md": "大部分 styled-components 的导出可以从 `umi` 或 `@umijs/max` 里 import 使用。\n"
17 | },
18 | {
19 | "title": "styled-components 的插件有哪些特性?",
20 | "md": "1. 支持通过配置的方式开启 styled-components 的 babel 插件,仅 dev 模式有效。\n\n2. 支持通过运行时配置的方式声明全局样式。\n"
21 | },
22 | {
23 | "title": "什么是 styled-components 的 babel 插件?",
24 | "md": "styled-components 的 babel 插件是用于将 CSS-in-JS 的样式定义转换为对应的 CSS 样式。该插件可以在开发模式下使用,通过配置 `babelPlugin` 可以开启该插件。\n"
25 | },
26 | {
27 | "title": "如何配置 styled-components 的 babel 插件?",
28 | "md": "配置 styled-components 的 babel 插件可以通过在 `.umirc.ts` 文件中的 `styledComponents` 配置项中设置 `babelPlugin` 属性。例如:\n```ts\nexport default {\n styledComponents: {\n babelPlugin: {},\n },\n};\n```\n如果导入来源不是 `umi` / `@umijs/max`,需要将导入来源配置到 `topLevelImportPaths` 才可以使该 babel 插件生效。例如:\n```ts\nexport default {\n styledComponents: {\n babelPlugin: {\n topLevelImportPaths: ['alita'],\n },\n },\n};\n```\n"
29 | },
30 | {
31 | "title": "如何使 styled-components 的 babel 插件生效?",
32 | "md": "要使 styled-components 的 babel 插件生效,需要将插件的导入来源配置到 `topLevelImportPaths` 中。例如,如果导入来源是 `alita`,则需要在配置中设置如下:\n```ts\nexport default {\n styledComponents: {\n babelPlugin: {\n topLevelImportPaths: ['alita'],\n },\n },\n};\n```\n"
33 | },
34 | {
35 | "title": "什么是运行时配置项?",
36 | "md": "运行时配置项是用来配置应用程序在运行时的一些行为或特性的选项。它们可以用来修改默认行为、启用或禁用特定的功能,或者进行其他自定义操作。运行时配置项可以在应用程序启动时进行设置,也可以在运行过程中动态修改。\n"
37 | },
38 | {
39 | "title": "如何使用`styled-components`中的`GlobalStyle`?",
40 | "md": "在使用`styled-components`的过程中,可以通过`GlobalStyle`来定义全局样式。`GlobalStyle`是一个 React 组件,它使用了`createGlobalStyle`函数来创建,并可以在整个应用程序中生效。\n在代码中,首先需要引入`createGlobalStyle`函数,然后使用它来创建一个`GlobalStyle`组件,通过模板字符串的形式定义全局样式。在模板字符串中,可以编写 CSS 样式规则,来定制全局样式。\n最后,在应用程序中使用`GlobalStyle`组件来将全局样式应用到整个应用程序中,并确保它被正确地渲染和生效。\n"
41 | },
42 | {
43 | "title": "如何使用运行时配置项中的`styledComponents`?",
44 | "md": "在运行时配置项中,往往会定义一些常用的`styled-components`组件,以便在整个应用程序中重复使用。\n在使用这些组件时,只需要将它们引入到代码中,并按照正确的方式使用它们即可。在代码中,可以直接使用这些组件,就像使用普通的`styled-components`组件一样。\n例如,当一个应用程序需要使用全局样式时,可以直接引入运行时配置项中定义的`GlobalStyle`组件,并将其渲染到应用程序的根节点中,从而应用全局样式。\n```tsx\nimport { styledComponents } from 'umi';\n\nconst { GlobalStyle } = styledComponents;\n\nfunction App() {\n return (\n <>\n \n {/* 其他组件 */}\n >\n );\n}\n```\n这样就可以在整个应用程序中应用运行时配置项中定义的全局样式了。\n"
45 | }
46 | ]
--------------------------------------------------------------------------------
/meta/umi/styling.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "在 Umi 项目中如何使用 .css 文件声明样式?",
4 | "md": "你可以在 Umi 项目中使用 .css 文件来声明各种样式。首先,在你的项目中创建一个 .css 文件,例如 `src/pages/index.css`。然后,在该文件中按照以下代码声明你想要的样式:\n```css\n.title {\n color: red;\n}\n```\n接下来,在你的页面或组件文件中引入该样式文件,即可使样式生效。例如,在 `src/pages/index.tsx` 文件中,你可以通过以下方式引入样式文件:\n```jsx\nimport './index.css';\n```\n此时,你可以使用样式类名 `.title` 来给任何元素应用该样式。\n"
5 | },
6 | {
7 | "title": "在 Umi 项目中如何限制样式的作用域?",
8 | "md": "如果你想要限制样式的作用范围,避免全局生效,你可以使用 CSS Modules 功能。使用 CSS Modules 时,每个样式类都会有一个唯一的类名,确保样式只应用在对应的页面或组件中。\n要使用 CSS Modules,你只需要将你的样式文件命名为 `.module.css` 格式,例如 `index.module.css`。然后,在你的页面或组件文件中引入样式文件,并使用引入的样式类来应用样式。\n"
9 | },
10 | {
11 | "title": "在 Umi 项目中如何使用 CSS Modules?",
12 | "md": "要在 Umi 项目中使用 CSS Modules,首先将你的样式文件命名为 `.module.css` 格式,例如 `index.module.css`。\n然后,在你的页面或组件文件中引入样式文件,并使用引入的样式类来应用样式。例如,在 `src/pages/index.tsx` 文件中:\n```jsx\nimport styles from './index.module.css';\n\nexport default function () {\n return Hello World;\n}\n```\n在这个例子中,`styles.title` 表示被加工过的唯一样式类名,用它来应用样式。\n通过使用 CSS Modules,每个样式类都会有一个唯一的类名,确保样式只在对应的页面或组件中生效。这样可以避免全局样式冲突的问题。\n"
13 | },
14 | {
15 | "title": "什么是 CSS Modules?",
16 | "md": "CSS Modules 是一种将样式模块化的技术。在使用 CSS Modules 时,我们可以在 JavaScript 代码中引入样式文件,并将样式赋予一个变量名。这样,样式只会作用于该模块内部,不会对全局样式产生影响。\n"
17 | },
18 | {
19 | "title": "如何在 JavaScript 文件中使用 CSS Modules?",
20 | "md": "要在 JavaScript 文件中使用 CSS Modules,首先需要引入样式文件。可以使用 `import` 语句引入样式文件,并将其赋予一个变量名。然后,可以使用该变量名作为 `className` 属性的值来应用样式。\n例如,在一个名为 `index.css` 的样式文件中声明了一个名为 `title` 的样式,我们可以在 `index.tsx` 文件中这样使用:\n```jsx\nimport styles from './index.css';\n\nexport default function () {\n return Hello World;\n}\n```\n这样,`title` 样式只会应用于包裹在 `className={styles.title}` 中的 `div` 元素。\n"
21 | },
22 | {
23 | "title": "CSS Modules 可以解决什么问题?",
24 | "md": "CSS Modules 提供了一种样式模块化的解决方案,可以避免样式的全局污染问题。通过将样式赋予一个变量名,可以确保样式只会作用于当前模块内部,不会影响其他模块的样式。这样可以提高代码的可维护性和复用性,避免样式冲突和命名冲突的问题。\n"
25 | },
26 | {
27 | "title": "Umi 中支持的 CSS 预处理器有哪些?",
28 | "md": "Umi 默认支持 LESS、SASS 和 SCSS 样式的导入。你可以按照引入 CSS 文件的方式引入并使用这些由 CSS 预处理器处理的样式。\n"
29 | },
30 | {
31 | "title": "如何在 Umi 中使用 SASS?",
32 | "md": "在 Umi 中使用 SASS 需要额外安装预处理依赖,可以通过以下步骤来安装:\n1. 打开终端,并进入到项目根目录下。\n2. 执行命令 `npm add -D sass` 来安装 SASS 依赖。\n3. 在你的代码文件中引入 SASS 样式文件即可。\n"
33 | },
34 | {
35 | "title": "如何在 Umi 中使用 CSS Module?",
36 | "md": "在 Umi 中同样也支持 CSS Module 的用法。你可以按照以下步骤来使用 CSS Module:\n1. 在你的代码文件中引入不同的样式文件(比如 LESS、SASS、SCSS 文件)。\n2. 使用导入样式文件时返回的对象来设置元素的 className。\n"
37 | },
38 | {
39 | "title": "Umi 是否支持其他类型的样式文件?",
40 | "md": "除了支持 LESS、SASS 和 SCSS 文件之外,Umi 还提供了对 `.styl` 和 `.stylus` 文件的内置支持。如果想要使用这些类型的样式文件,你需要先安装相应的预处理器依赖(比如 `stylus`),然后按照之前的方法引入和使用即可。\n"
41 | },
42 | {
43 | "title": "UnoCSS 是什么?",
44 | "md": "UnoCSS 是一个用于快速构建样式的工具。它可以与 Umi 和 Tailwindcss 结合使用,并且提供了内置的 UnoCSS 插件。安装 UnoCSS 需要安装 `unocss` 和 `@unocss/cli`。\n"
45 | },
46 | {
47 | "title": "如何在 Umi 中启用 UnoCSS 插件?",
48 | "md": "要在 Umi 中启用 UnoCSS 插件,首先安装 `plugin-unocss`。然后,在项目的 `.umirc.ts` 文件中,使用 `@umijs/plugins/dist/unocss` 模块来引入插件。在 `unocss` 配置中,需要声明要使用 `unocss` 的文件目录。例如:\n```js\n// .umirc.ts\n\nexport default {\n plugins: [require.resolve('@umijs/plugins/dist/unocss')],\n unocss: {\n watch: ['src/**/*.tsx'],\n },\n};\n```\n这样配置之后,UnoCSS 插件会监听设置文件中的 `unocss.watch` 字段,动态生成样式文件并自动套用。\n"
49 | },
50 | {
51 | "title": "如何配置 UnoCSS?",
52 | "md": "要配置 UnoCSS,可以在项目的根目录下创建一个名为 `unocss.config.ts` 的文件。在这个配置文件中,可以使用 `unocss` 提供的 API 来定义配置项。\n例如,可以使用 `defineConfig` 方法来创建配置对象,并使用 `presetAttributify` 和 `presetUno` 方法来定义 UnoCSS 的预设配置。在配置对象中,可以设置 `envMode`、`presets` 等属性来自定义 UnoCSS 的行为。例如:\n```js\n// unocss.config.ts\n\nimport { defineConfig, presetAttributify, presetUno } from 'unocss';\n\nexport function createConfig({ strict = true, dev = true } = {}) {\n return defineConfig({\n envMode: dev ? 'dev' : 'build',\n presets: [presetAttributify({ strict }), presetUno()],\n });\n}\n\nexport default createConfig();\n```\n这样配置之后,UnoCSS 将根据配置对象中的信息来生成样式。\n这些信息可以帮助你了解如何在 Umi 中使用 UnoCSS,并进行相应的配置。\n"
53 | }
54 | ]
--------------------------------------------------------------------------------
/meta/umi/typescript.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在配置时拥有 TypeScript 提示?",
4 | "md": "要在配置时拥有 TypeScript 语法提示,可以在配置的地方包一层 `defineConfig()`。下面是一个示例:\n```ts\n// .umirc.ts\n\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n routes: [{ path: '/', component: '@/pages/index' }],\n});\n```\n"
5 | },
6 | {
7 | "title": "什么是 defineConfig()?",
8 | "md": "`defineConfig()` 是一个函数,用于包装配置对象,以便在配置时拥有 TypeScript 语法提示。\n"
9 | },
10 | {
11 | "title": "如何使用 defineConfig()?",
12 | "md": "使用 `defineConfig()` 需要先导入它:\n```ts\nimport { defineConfig } from 'umi';\n```\n然后,在配置对象外部使用 `defineConfig()` 包装配置对象:\n```ts\nexport default defineConfig({\n routes: [{ path: '/', component: '@/pages/index' }],\n});\n```\n这样,在配置时就可以拥有 TypeScript 的语法提示了。\n\n以上是如何在配置中使用 TypeScript 提示的方法,并且使用 `defineConfig()` 函数来实现。\n"
13 | }
14 | ]
--------------------------------------------------------------------------------
/meta/umi/upgrade-to-umi-4.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何升级项目的 Umi 版本和插件?",
4 | "md": "要升级项目的 Umi 版本和插件,需要进行以下步骤:\n1. 打开项目的 `package.json` 文件。\n2. 在 `devDependencies` 中找到之前使用的 Umi 相关的依赖项。\n3. 将之前的 Umi 相关依赖项的版本号改为新版的 Umi 和相关插件的版本号。例如,将 `umi` 的版本号改为 `\"^3.0.0\"`,将 `@umijs/preset-react` 的版本号改为 `\"^1.2.2\"`。\n4. 删除项目的 `node_modules` 文件夹,以确保之前安装的 Umi 版本和插件被完全移除。\n5. 执行 `npm install` 命令,重新安装项目的依赖。\n注意:如果之前使用的是 `umi` + `@umijs/preset-react` 的组合进行开发,那么可以直接将 Umi 的版本号改为新版的 `max`,然后执行步骤 4 和 5。\n"
5 | },
6 | {
7 | "title": "如何使用 `@umijs/max` 替换 `umi` 命令",
8 | "md": "如果你已经安装并使用了 `@umijs/max`,可以使用 `max` 命令来替换 `umi` 命令。例如,使用 `max dev` 替换 `umi dev` 来启动开发服务器,使用 `max build` 替换 `umi build` 来构建项目。\n在 `package.json` 文件中,修改相应的脚本命令:\n```diff\n{\n \"scripts\": {\n- \"build\": \"umi build\",\n+ \"build\": \"max build\",\n- \"postinstall\": \"umi g tmp\",\n+ \"postinstall\": \"max setup\",\n- \"start\": \"umi dev\",\n+ \"start\": \"max dev\",\n }\n}\n```\n这样就可以使用 `max` 命令来代替相应的 `umi` 命令了。\n但是,需要注意的是,在 umi@4 中,一些项目前置操作被放到了 `setup` 命令中,例如 umi@3 中的 `umi g tmp` 等命令,需要使用 `max setup` 来替代。\n希望以上信息对你有帮助。\n"
9 | },
10 | {
11 | "title": "配置项 `fastRefresh` 的使用方法",
12 | "md": "在 `umi@3` 版本中,`fastRefresh` 配置项是一个对象,在 `umi@4` 版本中,`fastRefresh` 配置项改为直接配置为 `true` 来开启 Fast Refresh 功能。\n在 `umi@3` 中的配置示例:\n```typescript\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n fastRefresh: {},\n});\n```\n在 `umi@4` 中的配置示例:\n```typescript\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n fastRefresh: true,\n});\n```\n开启 `fastRefresh` 配置项后,可以实现在开发过程中的页面热更新功能,无需手动刷新页面即可查看最新的代码变更效果。\n"
13 | },
14 | {
15 | "title": "配置项 `dva` 的使用方法",
16 | "md": "在 `umi@3` 中,`dva` 配置项可以配置 `hmr` 参数来开启 Hot Module Replacement (HMR) 功能。但在 `umi@4` 中不再支持 `hmr` 参数。\n在 `umi@3` 中的配置示例:\n```typescript\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n dv{\n hmr: true,\n },\n});\n```\n在 `umi@4` 中的配置示例:\n```typescript\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n dv{},\n});\n```\n在 `umi@4` 中,不再需要配置 `hmr` 参数来开启 HMR 功能,因为 `umi@4` 默认支持 HMR,无需额外配置。\n"
17 | },
18 | {
19 | "title": "配置项 `webpack5` 的使用方法",
20 | "md": "在 `umi@4` 中,默认使用 webpack5 作为默认的构建工具。\n在 `umi@4` 中的配置示例:\n```typescript\nimport { defineConfig } from 'umi';\n\nexport default defineConfig({\n webpack5: {},\n});\n```\n通过配置 `webpack5: {}`,即可启用 webpack5 的构建能力。\n请注意,在 `umi@4` 中,默认即开启了 webpack5 的支持,因此不需要额外的配置来开启 webpack5。\n"
21 | },
22 | {
23 | "title": "Umi 4 中的路由相关使用差异",
24 | "md": "在 Umi 4 中,将 `react-router@5` 升级到了 `react-router@6`,因此在路由相关的一些 API 上存在一些使用上的差异。\n* 在 Umi 3 中,props 默认为空对象,以下属性不能直接从 props 中取出:\n\n * history\n * location\n * match\n\n* 使用路由相关的 API 时,需要从 `useHistory()`,`useLocation()` 或 `useRouteMatch()` hook 中获取相应的属性。\n请根据 Umi 4 的文档以及具体的代码实现进行修改和适配。\n"
25 | }
26 | ]
--------------------------------------------------------------------------------
/meta/umi/use-plugins.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "如何在普通的 Umi 应用中使用插件呢?",
4 | "md": "在普通的 Umi 应用中,默认是不附带任何插件的。如果你需要使用 Max 的功能,比如数据流、antd 等,你需要手动安装插件并将它们打开。\n首先,安装 @umijs/plugins 插件:\n```bash\npnpm add -D @umijs/plugins\n```\n然后,在配置文件 .umirc.ts 中开启 antd 插件:\n```ts\nexport default {\n plugins: ['@umijs/plugins/dist/antd'],\n antd: {},\n};\n```\nUmi 和 Max 的区别在于,Max 已经内置了很多常用插件,比如数据流(initial-state、model)、antd 等。这些插件都可以在 @umijs/plugins/dist/ 中找到并开启。\n如果你想进一步了解 Max 具备的功能和配置说明,请参考 Umi Max 章节。\n:::info{title=💡} 我是否应该选择 Max?使用 Max 并不代表你需要使用全部 Max 的功能。你可以根据自己的需求选择关闭一些插件。因此,当你需要使用 Max 的功能时,你可以选择创建一个 Max 项目。 :::\n"
5 | },
6 | {
7 | "title": "如何在项目中使用插件功能?",
8 | "md": "要在项目中快速使用插件的功能,可以按照以下步骤进行操作:\n1. 在项目的根目录创建一个名为 `plugin.ts` 的文件。\n2. 在 `plugin.ts` 文件中编写你的项目级插件代码。\n3. 保存并关闭 `plugin.ts` 文件,该文件将被自动作为插件加载。\n请注意,在使用插件功能之前,请确保你已经熟悉了相关的目录结构,可以参考章节 [目录结构](./directory-structure) 进行更详细的了解。\n"
9 | }
10 | ]
--------------------------------------------------------------------------------
/meta/umi/use-vue.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "什么是命名路由?",
4 | "md": "命名路由是指在定义路由时可以为每个路由提供一个唯一的名称,除了路由的路径外,可以通过该名称来进行路由跳转。\n"
5 | },
6 | {
7 | "title": "如何为路由提供名称?",
8 | "md": "可以在定义路由时,通过name属性为路由提供一个名称。例如:\n```ts\nexport default {\n routes: [\n {\n path: '/user/:username',\n name: 'user',\n component: 'index',\n },\n ],\n};\n```\n在上述例子中,为路径为`/user/:username`的路由提供了一个名称为`user`。\n"
9 | },
10 | {
11 | "title": "如何使用命名路由进行导航?",
12 | "md": "要使用命名路由进行导航,可以通过`router-link`组件的`to`属性传递一个对象来链接到一个命名的路由。例如:\n```html\n\n User\n \n```\n在上述例子中,通过`router-link`组件的`to`属性,使用`name`属性为`user`的路由,并传递`params`参数`{ username: 'erina' }`,来生成一个包含链接文本`User`的可点击的路由链接。\n"
13 | },
14 | {
15 | "title": "如何使用命名路由进行编程式导航?",
16 | "md": "使用命名路由进行编程式导航与使用命令式调用`router.push`方法一致。例如:\n```ts\nrouter.push({ name: 'user', params: { username: 'erina' } });\n```\n在上述例子中,通过调用`router.push`方法,传递一个包含`name`属性为`user`的路由和`params`参数`{ username: 'erina' }`,实现了导航到路径`/user/erina`的效果。\n"
17 | }
18 | ]
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@ant-design/doc",
3 | "version": "1.0.6",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "genApi": "node scripts/readApi.mjs && node scripts/docsToJson.mjs && node scripts/apiToMd.mjs && npm run prettier",
8 | "genChangeLog": "node scripts/readChange.mjs",
9 | "prettier": "prettier --write \"docs/**/**.{js,jsx,tsx,ts,less,md,yaml,json}\" --loglevel warn",
10 | "test": "echo \"Error: no test specified\" && exit 1",
11 | "prepublishOnly": "npm run genApi && npm run genChangeLog && npm run prettier"
12 | },
13 | "files": [
14 | "api",
15 | "docs"
16 | ],
17 | "repository": {
18 | "type": "git",
19 | "url": "https://github.com/ant-design/doc"
20 | },
21 | "keywords": [],
22 | "author": "",
23 | "license": "ISC",
24 | "devDependencies": {
25 | "@qdrant/js-client-rest": "^1.7.0",
26 | "@umijs/fabric": "^4.0.1",
27 | "glob": "^10.3.10",
28 | "openai": "^4.26.0",
29 | "prettier": "^3.2.4",
30 | "prettier-plugin-organize-imports": "^3.2.4",
31 | "prettier-plugin-packagejson": "^2.4.10",
32 | "remark": "^15.0.1",
33 | "remark-gfm": "^4.0.0",
34 | "remark-parse": "^11.0.0",
35 | "unified": "^11.0.4",
36 | "unist-util-visit": "^5.0.0"
37 | },
38 | "publishConfig": {
39 | "access": "public"
40 | },
41 | "authors": [
42 | "chenshuai2144 (https://github.com/chenshuai2144)"
43 | ]
44 | }
45 |
--------------------------------------------------------------------------------
/scripts/apiToMd.mjs:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 | import { fileURLToPath } from 'url';
4 |
5 | // 获取当前脚本所在目录路径
6 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
7 |
8 | const apiPath = path.join(__dirname, '..', 'api');
9 |
10 | fs.readdirSync(path.join(__dirname, '..', 'api')).forEach((jsonName) => {
11 | console.log('转化 => ' + jsonName);
12 | const json = JSON.parse(fs.readFileSync(path.join(apiPath, jsonName)));
13 | const packageName = path.basename(jsonName).split('.').at(0);
14 | const mdFile = json.map((item) => {
15 | const questionMd = `### ${packageName} 的 ${item.title} 有哪些配置?`;
16 | const subItemMd = [];
17 |
18 | if (item.md) {
19 | const childMd = item.properties
20 | ?.map((property) => {
21 | if (property.property?.length > 0) {
22 | return `**${item.title} ${property.title}** \n\n${property.md}\n${property.property
23 | .map((subItem) => {
24 | subItemMd.push(
25 | `### umi 如何使用 ${subItem.title}?\n\n${subItem.md}`,
26 | );
27 | return `#### ${subItem.title}\n${subItem.md}`;
28 | })
29 | .join('\n\n')}`;
30 | }
31 | return `**${item.title} ${property.title}** \n\n${property.md}`;
32 | })
33 | .join('');
34 |
35 | return [questionMd, childMd, ...subItemMd].join('\n');
36 | }
37 | const mdList = item.properties
38 | ?.map((row) => {
39 | if (row.property.length === 0) {
40 | return null;
41 | }
42 | const mdTitle = `### ${packageName} 的 ${row.title} 有哪些配置?`;
43 | const mdRow = `| ${Object.keys(row.property.at(0)).join(' | ')} |
44 | | ${Object.keys(row.property.at(0))
45 | .map(() => '---')
46 | .join(' | ')} |
47 | ${row.property
48 | .map((item) => {
49 | return `| ${Object.values(item)
50 | .map((apiItem) =>
51 | apiItem?.toString().replaceAll('|', '\\|').replaceAll('\\\\|', '\\|'),
52 | )
53 | .join(' | ')} |`;
54 | })
55 | .join('\n')}
56 | `;
57 |
58 | const propertyMd = row.property
59 | .map((item) => {
60 | const values = Object.values(item);
61 | return `### ${packageName} 中 ${row.title}的${values[0]}属性如何使用? \n\n${Object.keys(
62 | item,
63 | )
64 | .map((key, index) => {
65 | return `${key}: ${values[index]}`;
66 | })
67 | .join(' \n\n')}`;
68 | })
69 | .join('\n\n');
70 |
71 | return {
72 | md: [mdTitle, mdRow, propertyMd].join('\n\n'),
73 | tableMd: mdRow,
74 | title: row.title,
75 | };
76 | })
77 | .filter(Boolean);
78 |
79 | const answerMd = mdList
80 | ?.map((mdListItem) => {
81 | return `#### ${mdListItem.title} \n\n${mdListItem.tableMd}`;
82 | })
83 | .join('\n\n');
84 |
85 | const md = [questionMd, answerMd].filter(Boolean).join('\n\n');
86 |
87 | return [md, mdList?.map((mdListItem) => mdListItem.md).join('\n\n')].join(
88 | '\n\n',
89 | );
90 | });
91 |
92 | fs.writeFileSync(
93 | path.join(__dirname, '..', 'docs', packageName, 'api.md'),
94 | mdFile.join('\n\n'),
95 | );
96 | });
97 |
--------------------------------------------------------------------------------
/scripts/docsToJson.mjs:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 | import { remark } from 'remark';
4 | import parse from 'remark-parse';
5 | import { unified } from 'unified';
6 | import { fileURLToPath } from 'url';
7 | import { readMarkdownFiles } from './readApi.mjs';
8 |
9 | // 获取当前脚本所在目录路径
10 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
11 |
12 | const processor = unified().use(parse);
13 |
14 | /**
15 | * 解析Markdown文件并将其转换为JSON格式。
16 | * @param {string[]} fileList - 包含Markdown文件路径的数组。
17 | */
18 | const parseMDAndWrite = (fileList) => {
19 | fileList.forEach((fileName) => {
20 | const fileContent = fs.readFileSync(fileName, 'utf-8');
21 | const ast = processor.parse(fileContent);
22 | let apiJSON = [];
23 | ast.children.forEach((node) => {
24 | if (node.type === 'heading' && node.depth === 3) {
25 | apiJSON.push({
26 | title: remark
27 | .stringify(node)
28 | ?.replace(/\n/g, '')
29 | ?.replace('### ', '')
30 | ?.trim(),
31 | md: '',
32 | });
33 | } else {
34 | if (apiJSON.at(-1)) {
35 | let md = apiJSON.at(-1).md;
36 | md = md + remark.stringify(node);
37 | apiJSON.at(-1).md = md;
38 | }
39 | }
40 | });
41 | const metaPath = path.join(
42 | __dirname,
43 | '..',
44 | 'meta',
45 | fileName.split(path.sep).at(1),
46 | );
47 |
48 | if (metaPath) {
49 | fs.mkdirSync(metaPath, { recursive: true });
50 | }
51 |
52 | if (apiJSON.length > 0) {
53 | fs.writeFileSync(
54 | path.join(metaPath, path.basename(fileName).split('.').at(0) + '.json'),
55 | JSON.stringify(apiJSON, null, 2),
56 | );
57 | }
58 | });
59 | };
60 |
61 | parseMDAndWrite(readMarkdownFiles('./docs'));
62 |
--------------------------------------------------------------------------------
/scripts/genQA.mjs:
--------------------------------------------------------------------------------
1 | import OpenAI from 'openai';
2 | import { readMarkdownFiles } from './readApi.mjs';
3 | import fs from 'fs';
4 | import path from 'path';
5 | import { fileURLToPath } from 'url';
6 |
7 | // 创建 OpenAI 实例
8 | const openai = new OpenAI({
9 | apiKey: process.env.OPENAI_API_KEY,
10 | baseURL: 'https://api.openai-proxy.com/v1',
11 | });
12 |
13 | // 获取当前脚本所在目录路径
14 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
15 |
16 | // 读取当前目录下的 Markdown 文件,并过滤掉以 'docs/' 开头的文件
17 | const mdFileList = readMarkdownFiles('.').filter(
18 | (file) => !file.startsWith('docs/')
19 | );
20 |
21 | // 遍历 Markdown 文件列表
22 | for await (const file of mdFileList) {
23 | // 读取 Markdown 文件内容
24 | const mdContent = fs.readFileSync(file, 'utf-8');
25 | // 将 Markdown 内容按照 '# ' 进行分割
26 | const mdContentArray = mdContent.split('\n#');
27 | const mdFile = [];
28 | // 构建新文件路径
29 | const newFileName = path.join(__dirname, '..', 'docs', file);
30 | // 如果新文件已存在,则跳过当前文件的处理
31 | if (fs.existsSync(newFileName)) continue;
32 |
33 | let i = 0;
34 | // 遍历 Markdown 内容数组
35 | for await (const section of mdContentArray) {
36 | // 如果段落长度小于 150,则跳过当前段落的处理
37 | if (section.length < 150) continue;
38 | i++;
39 | console.log(
40 | '正在处理' + file + ' (' + i + '/' + mdContentArray.length + ')'
41 | );
42 |
43 | // 使用 OpenAI 的 chat completions API 生成 QA 文档
44 | const jsonContent = await openai.chat.completions
45 | .create({
46 | model: 'gpt-3.5-turbo-16k',
47 | temperature: 1,
48 | frequency_penalty: 0,
49 | presence_penalty: 0,
50 | max_tokens: 2000,
51 | stream: false,
52 | messages: [
53 | {
54 | role: 'system',
55 | content: `
56 | 你是一个前端开发者,你想要生成一个 QA,生成的效果如下:
57 |
58 | """
59 | 例子:
60 | ### Ant Design 5.x 的 CSS 变量模式如何使用
61 |
62 | Ant Design 5.x 的 CSS 变量模式是从版本 5.12.0 开始重新支持的功能。与 4.x 版本不同的是,这次 Ant Design 融合了 CSS-in-JS 的能力,并将所有 Design Token 纳入了 CSS 变量的管理范畴。这意味着在同一组件中,不同主题下的样式可以共享,从而减少样式体积。此外,切换主题时不再需要重新序列化样式,提升了主题切换的性能。如果你的应用依赖 Ant Design 的主题能力,强烈建议开启 CSS 变量模式。
63 | """
64 |
65 | 生成的文档要简洁精确,语义通顺,符合前端开发的基础,输出不要包含《Ant Design 5.x 的 CSS 变量模式如何使用》这个例子,要尽量包含更多的原始文本信息。`,
66 | },
67 | {
68 | role: 'user',
69 | content: `
70 | ${section}
71 | 基于以上信息生成 3 个 QA 文档
72 | `,
73 | },
74 | ],
75 | })
76 | .then((res) => {
77 | return res.choices[0].message.content;
78 | });
79 |
80 | console.log('生成成功');
81 |
82 | // 将生成的 QA 文档内容添加到数组中
83 | mdFile.push(jsonContent);
84 | // 创建新文件所在的目录(如果不存在)
85 | fs.mkdirSync(path.dirname(newFileName), {
86 | recursive: true,
87 | });
88 | // 将生成的 QA 文档内容写入新文件
89 | fs.writeFileSync(newFileName, mdFile.join('\n\n'));
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/scripts/jsonToEmbedding.mjs:
--------------------------------------------------------------------------------
1 | import { QdrantClient } from '@qdrant/js-client-rest';
2 | import fs from 'fs';
3 | import { glob } from 'glob';
4 | import OpenAI from 'openai';
5 | import path from 'path';
6 | import { fileURLToPath } from 'url';
7 | if (!process.env.OPENAI_API_KEY) {
8 | throw new Error('Missing env var from OpenAI');
9 | }
10 | const openai = new OpenAI({
11 | apiKey: process.env.OPENAI_API_KEY,
12 | });
13 |
14 | const client = new QdrantClient({
15 | url: process.env.QDRANT_API_URL,
16 | apiKey: process.env.QDRANT_API_KEY,
17 | });
18 |
19 | const genEmbedding = async (payload) => {
20 | const embedding = await openai.embeddings
21 | .create({
22 | input: payload.title,
23 | model: 'text-embedding-ada-002',
24 | })
25 | .then((res) => {
26 | return res.data.at(0)?.embedding;
27 | });
28 | return embedding;
29 | };
30 |
31 | // 获取当前脚本所在目录路径
32 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
33 | /**
34 | * 从目录中读取JSON文件并返回文件路径数组。
35 | * @param {string} directory - 要读取JSON文件的目录。
36 | * @returns {string[]} - 文件路径数组。
37 | */
38 | function readJsonFiles(directory) {
39 | const files = glob.sync('**/**/*.json', {
40 | cwd: directory,
41 | ignore: [
42 | '**/fixtures/**',
43 | '**/node_modules/**',
44 | '**/demo/**',
45 | '**/examples/**',
46 | '**/ant-design/docs/spec/**',
47 | '**/tests/**',
48 | '**/*$**/**',
49 | ],
50 | });
51 | return files.map((file) => path.join(directory, file));
52 | }
53 |
54 | const collectionName = 'test_collection';
55 |
56 | const jsonFileList = readJsonFiles(path.join(__dirname, '..', 'meta'));
57 |
58 | const initDb = async () => {
59 | // 获取已存在的集合列表
60 | let result = await client.getCollections();
61 |
62 | // 提取集合名称
63 | const collectionNames = result.collections.map(
64 | (collection) => collection.name,
65 | );
66 |
67 | // 如果集合已存在,则删除它
68 | if (collectionNames.includes(collectionName)) {
69 | await client.deleteCollection(collectionName);
70 | }
71 |
72 | // 创建新的集合
73 | await client.createCollection(collectionName, {
74 | vectors: {
75 | size: 1536,
76 | distance: 'Euclid',
77 | },
78 | optimizers_config: {
79 | default_segment_number: 2,
80 | },
81 | replication_factor: 2,
82 | });
83 | result = await client.getCollections();
84 |
85 | console.log('集合列表:', result.collections);
86 |
87 | // 创建 'text' 字段的索引
88 | await client.createPayloadIndex(collectionName, {
89 | field_name: 'text',
90 | field_schema: 'keyword',
91 | wait: true,
92 | });
93 |
94 | // 创建 'url' 字段的索引
95 | await client.createPayloadIndex(collectionName, {
96 | field_name: 'url',
97 | field_schema: 'keyword',
98 | wait: true,
99 | });
100 | };
101 |
102 | await initDb();
103 | let count = 0;
104 | for await (const file of jsonFileList) {
105 | count++;
106 | const json = JSON.parse(fs.readFileSync(file, 'utf-8'));
107 | console.log('正在处理', `(${count}/${jsonFileList.length}`);
108 | let index = 0;
109 | for await (const api of json) {
110 | index++;
111 | console.log('正在处理', `(${index}/${json.length}`);
112 | const vector = await genEmbedding(api);
113 | const mdVector = await genEmbedding({
114 | title: api.md,
115 | });
116 |
117 | await client.upsert(collectionName, {
118 | points: [
119 | {
120 | id: count * 100 + index * 10 + 1,
121 | vector,
122 | payload: {
123 | text: api.title + '\n' + api.md,
124 | url: file,
125 | },
126 | },
127 | {
128 | id: count * 100 + index * 10 + 2,
129 | vector: mdVector,
130 | payload: {
131 | text: api.title + '\n' + api.md,
132 | url: file,
133 | },
134 | },
135 | ],
136 | });
137 | }
138 | }
139 |
--------------------------------------------------------------------------------
/scripts/readChange.mjs:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 | import { remark } from 'remark';
4 | import remarkGfm from 'remark-gfm';
5 | import parse from 'remark-parse';
6 | import { unified } from 'unified';
7 | import { visit } from 'unist-util-visit';
8 | import { fileURLToPath } from 'url';
9 |
10 | // 获取当前脚本所在目录路径
11 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
12 |
13 | const processor = unified().use(parse).use(remarkGfm, { singleTilde: false });
14 |
15 | /**
16 | * 解析变更日志并生成CHANGELOG.md文件。
17 | * @param {string[]} fileList - 包含变更日志文件路径的数组。
18 | * @param {string} packageName - 包名。
19 | */
20 | const parseChangeLog = (fileList, packageName) => {
21 | fileList.forEach((file) => {
22 | const fileContent = fs.readFileSync(file, 'utf-8');
23 | // 解析Markdown为抽象语法树(AST)
24 | const ast = processor.parse(fileContent);
25 | // 提取表格数据
26 | const changelogData = [];
27 | visit(ast, (node) => {
28 | if (node.type === 'heading' && node.depth === 2) {
29 | const versionTitle = remark
30 | .stringify(node.children[0])
31 | .replace(/\n/g, '')
32 | .trim();
33 |
34 | changelogData.push({
35 | version: versionTitle,
36 | content: '',
37 | });
38 | return;
39 | }
40 | if (!changelogData.at(-1)) {
41 | return;
42 | }
43 | if (node.type === 'inlineCode') {
44 | const time = remark
45 | .stringify(node)
46 | .replace(/\n/g, '')
47 | .trim()
48 | .replace('###', '');
49 | if (/^\d{4}-\d{2}-\d{2}$/.test(time.replaceAll('`', ''))) {
50 | changelogData.at(-1).time = time;
51 | }
52 |
53 | return;
54 | }
55 | if (node.type === 'list') {
56 | changelogData.at(-1).content = remark.stringify(node);
57 | return;
58 | }
59 | });
60 |
61 | const changeMd = changelogData
62 | .filter((item) => item.content && item.time)
63 | .map((item) => {
64 | return `### 在 ${item.time} 更新的 \`${item.version}\` 版本更新了什么?
65 |
66 | ${item.content}
67 | `;
68 | })
69 | .join('\n');
70 |
71 | fs.writeFileSync(
72 | path.join(__dirname, '..', 'docs', packageName, 'CHANGELOG.md'),
73 | changeMd,
74 | );
75 | });
76 | };
77 |
78 | parseChangeLog(['pro-components/docs/changelog.en-US.md'], 'pro-components');
79 |
80 | parseChangeLog(['ant-design/CHANGELOG.zh-CN.md'], 'ant-design');
81 |
--------------------------------------------------------------------------------