NodeJS系列(7)- Ant Design Pro 简介

发布时间 2023-08-02 11:16:05作者: 垄山小站


Ant Design Pro 是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案,致力于在设计规范和基础组件的基础上,继续向上构建,提炼出典型模板/业务组件/配套设计资源,进一步提升企业级中后台产品设计研发过程中的『用户』和『设计者』的体验。

Ant Design 是一套企业级 UI 设计语言和 React 组件库。作为西湖区最好的组件库,它极大的提升了中后台开发的效率,广受国内外开发者的喜爱。

Webpack 可以帮助我们完成一些任务。比如 js 压缩、css 压缩、编译模板文件等等,从而减少前端的工作量。当然,Webpack 功能很强大,能帮我们完成的工作远远不止这些。

umi 是一个 Webpack 之上的整合工具。 umi 相比于 Webpack 增加了运行时的能力,同时帮助我们配置了很多 Webpack 的预设。也减少了 Webpack 升级导致的问题。

Ant Design Pro: https://pro.ant.design/
Ant Design: https://ant.design/
Webpack: https://webpack.js.org/
umi:https://github.com/umijs/umi

 

1. 系统环境

    操作系统:CentOS 7.9 (x64)
    NodeJS: 16.20.0
    NPM: 8.19.4
    NVM: 0.39.2
    Ant Design Pro: 5.0.0


2. 创建 Ant Design Pro 项目

    安装 @ant-design/pro-cli 脚手架,命令如下:

        # 使用 -g 参数,表示该命令只需在本机上运行一次
        $ npm i @ant-design/pro-cli -g

            npm WARN deprecated readdir-scoped-modules@1.1.0: This functionality has been moved to @npmcli/fs
            npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs
            npm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs
            npm WARN deprecated date-format@0.0.0: 0.x is no longer supported. Please upgrade to 4.x or higher.
            npm WARN deprecated @stylelint/postcss-markdown@0.36.2: Use the original unforked package instead: postcss-markdown
            npm WARN deprecated @stylelint/postcss-css-in-js@0.37.3: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
            npm WARN deprecated har-validator@5.1.5: this library is no longer supported
            npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
            npm WARN deprecated streamroller@0.4.1: 0.x is no longer supported. Please upgrade to 3.x or higher.
            npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
            npm WARN deprecated log4js@1.1.1: 1.x is no longer supported. Please upgrade to 6.x or higher.
            npm WARN deprecated core-js@2.6.12: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.

            added 1166 packages in 29s

 

    使用 pro 命令创建 Ant Design Pro 项目,命令如下:

        $ pro create myapp

            ? ? 使用 umi@4 还是 umi@3 ? (Use arrow keys)
            ❯ umi@4
              umi@3

                注:这里选 umi@3

            > clone repo url: https://gitee.com/ant-design/ant-design-pro
            Cloning into 'myapp'...
            remote: Enumerating objects: 191, done.
            remote: Counting objects: 100% (191/191), done.
            remote: Compressing objects: 100% (163/163), done.
            remote: Total 191 (delta 39), reused 114 (delta 18), pack-reused 0
            Receiving objects: 100% (191/191), 309.24 KiB | 0 bytes/s, done.
            Resolving deltas: 100% (39/39), done.
            > ? clone success
            > Clean up...


    进入 myapp 项目目录安装依赖,命令如下:

        $ cd myapp && npm install

            ...

            > ant-design-pro@5.0.0 postinstall
            > max setup

            ? Hello PRO
            info  - [你知道吗?] 全局布局用 layout ,多层布局用 wrappers ,从文档了解更多路由的控制方法,详见 https://umijs.org/docs/guides/routes
            Using openapi Plugin
            info  - generate files
            info  - Preparing...

            > ant-design-pro@5.0.0 prepare
            > husky install

            fatal: Not a git repository (or any of the parent directories): .git

            added 2131 packages in 1m


3. myapp 项目

    1) 启动项目

        进入 myapp 目录,运行如下命令:

            $ npm cache clean --force

            $ npm run start   # 或 npm run dev

                > ant-design-pro@5.0.0 start
                > cross-env UMI_ENV=dev max dev

                ? Hello PRO
                info  - [你知道吗?] 如果你需要使用 Tailwind CSS, max g tailwindcss 就可以一键完成配置,详见 https://umijs.org/docs/guides/generator#tailwind-css-配置生成器
                Using openapi Plugin
                info  - Umi v4.0.3
                info  - Preparing...
                warn  - GET /api/rule is duplicated in mock/requestRecord.mock.js and mock/listTableList.ts
                warn  - GET /api/currentUser is duplicated in mock/user.ts and mock/requestRecord.mock.js
                warn  - POST /api/login/account is duplicated in mock/user.ts and mock/requestRecord.mock.js
                warn  - POST /api/login/outLogin is duplicated in mock/user.ts and mock/requestRecord.mock.js
                        ╔════════════════════════════════════════════════════╗
                        ║ App listening at:                                  ║
                        ║  >   Local: http://localhost:8000                  ║
                ready - ║  > Network: http://192.168.1.5:8000                ║
                        ║                                                    ║
                        ║ Now you can open browser with the above addresses↑ ║
                        ╚════════════════════════════════════════════════════╝
                event - [Webpack] Compiled in 3700 ms (494 modules)
                info  - [MFSU] buildDeps since cacheDependency has changed
                wait  - [Webpack] Compiling...
                event - [Webpack] Compiled in 175 ms (468 modules)
                wait  - [Webpack] Compiling...
                event - [Webpack] Compiled in 141 ms (468 modules)
                event - [Webpack] Compiled in 17776 ms (10679 modules)
                info  - [MFSU] write cache
                info  - [MFSU] buildDepsAgain
                info  - [MFSU] skip buildDeps

        使用浏览器访问 http://192.168.1.5:8000,本机上可以访问 http://localhost:8000 。

    2) 目录结构

        整个项目的目录结构:

            ├── config                   # umi 配置,包含路由,构建等配置
            │   ├── config.dev.js 
            │   ├── config.js 
            │   ├── defaultSettings.js 
            │   └── routes.js 
            ├── mock                     # 本地模拟数据
            ├── public
            │   └── favicon.png          # Favicon
            ├── src
            │   ├── assets               # 本地静态资源
            │   ├── components           # 业务通用组件
            │   ├── e2e                  # 集成测试用例
            │   ├── layouts              # 通用布局
            │   ├── models               # 全局 dva model
            │   ├── pages                # 业务页面入口和常用模板
            │   ├── services             # 后台接口服务
            │   ├── utils                # 工具库
            │   ├── locales              # 国际化资源
            │   ├── global.less          # 全局样式
            │   └── global.jsx           # 全局 JS
            ├── tests                    # 测试工具
            ├── README.md
            └── package.json


            注: Ant Pro 支持 JavaScript 版和 TypeScript 版,本文以 JavaScript 版为例。

        推荐的页面代码结构:

            src
            ├── components
            └── pages
                ├── Welcome        // 路由组件下不应该再包含其他路由组件,基于这个约定就能清楚的区分路由组件和非路由组件了
                │   ├── components // 对于复杂的页面可以再自己做更深层次的组织,但建议不要超过三层
                │   ├── Form.jsx
                │   ├── index.jsx  // 页面组件的代码
                │   └── index.less // 页面样式
                ├── Order          // 路由组件下不应该再包含其他路由组件,基于这个约定就能清楚的区分路由组件和非路由组件了
                │   ├── index.jsx
                │   └── index.less
                ├── User
                │   ├── components // group 下公用的组件集合
                │   ├── Login      // group 下的页面 Login
                │   ├── Register   // group 下的页面 Register
                │   └── util.js    // 这里可以有一些共用方法之类,不做推荐和约束,看业务场景自行做组织
                └── *              // 其它页面组件代码


        相关文件扩展名,含义如下:
        
            .ts 表示是一个 TypeScript 文件;
            .js 表示是一个 JavaScript 文件;
            .jsx 表示是一个 JavaScript XML 文件,可以理解为 React 提供的语法糖,可以让编译器更方便快速的选择编译方式;
            .less 表示是一个 CSS 的预编译文件,可以让 CSS 的书写变为动态,甚至写函数;

        为了让项目代码组织更加规范,让开发能够更方便的定位到相关页面组件代码,Ant Design Pro 定义了一套规范,该规范当前只作为推荐的指导,并非强制。

        所有路由组件(会配置在路由配置中的组件)我们推荐以大驼峰命名打平到 pages 下面第一级(复杂的项目可以增加 group 层级,在 group 下放置 pages)。不建议在路由组件内部再嵌套路由组件 - 不方便分辨一个组件是否是路由组件,而且不方便快速从全局定位到路由组件。

        推荐尽可能的拆分路由组件为更细粒度的组件,对于多个页面可能会用到的组件推荐放到 src/components 中,对于只是被单个页面依赖的(区块)组件,推荐就近维护到路由组件文件夹下即可。

        通过 config\defaultSettings.ts 来控制标题和 Logo,这部分功能来自 ProLayout 的功能。可以在预览界面 中拷贝设置覆盖到 config\defaultSettings.ts 中来修改配置。

 

4. 新增页面

    1) 新增 js、less 文件

        在 src / pages 下创建 *.js,*.less 文件。如果有多个相关页面,可以创建一个新文件夹来放置相关文件。

        创建 src/pages/NewPages.js 文件,内容如下:

            export default () => {
                return <div>New Page</div>;
            };

        样式文件默认使用 CSS Modules,如果需要,可以导入 antd less 变量 在文件的头部:

            @import '~antd/lib/style/themes/default.less';

        这样可以轻松获取 antd 样式变量并在文件中使用它们,这可以保持保持页面的一致性,并有助于实现自定义主题。

    2) 新增布局

        在脚手架中我们通过嵌套路由来实现布局模板。routes.js 是一个数组,其中第一级数据就是我们的布局,如果你需要新增布局可以再直接增加一个新的一级数据。

        layouts 文件时一个约定,layout 都应该放入其中。v5 没有了内置的布局,所以没有这个文件夹,如果你的项目中没有手动创建即可。

            export default [
                // user
                {
                    path: '/user',
                    component: '../layouts/UserLayout',
                    routes:[...]
                },
                // app
                {
                    path: '/',
                    component: '../layouts/BasicLayout',
                    routes:[...]
                },
                // new
                {
                    path: '/new',
                    component: '../layouts/new_page',
                    routes:[...]
                },
            ]


    3) 将文件加入菜单和路由

        默认布局中的菜单根据 routes.js 中的路由生成的,所以我们可以配置路由,菜单也会产生。routes.js 格式如下:

            export default [
                {
                    path: '/user',
                    component: '../layouts/UserLayout',
                    routes: [{
                            path: 'https://pro.ant.design/docs/getting-started-cn',
                            target: '_blank', // 点击新窗口打开
                            name: '文档',
                        },
                        {
                            // 访问路由,以 / 开头为绝对路径
                            path: '/user/login',
                            // ./Page ->src/pages/Login
                            component: './NewPage',
                        },
                        {
                            // 访问路由,如果不是以 / 开头会拼接父路由
                            // reg -> /user/reg
                            path: 'reg',
                            // ./Page ->src/pages/Reg
                            component: '../layouts/NewPage2',
                        },
                    ],
                },
            ];


        路由配置完成后,访问页面即可看到效果,如果需要在菜单中显示,需要配置 name,icon,hideChildrenInMenu 等来辅助生成菜单。具体参数如下:

            name: string 配置菜单的 name,如果配置了国际化,name 为国际化的 key。
            icon: string 配置菜单的图标,默认使用 antd 的 icon 名,默认不适用二级菜单的 icon。
            access: string 权限配置,需要预先配置权限
            hideChildrenInMenu: true 用于隐藏不需要在菜单中展示的子路由。
            hideInMenu: true 可以在菜单中不展示这个路由,包括子路由。
            hideInBreadcrumb: true 可以在面包屑中不展示这个路由,包括子路由。
            headerRender: false 当前路由不展示顶栏
            footerRender: false 当前路由不展示页脚
            menuRender: false 当前路由不展示菜单
            menuHeaderRender: false 当前路由不展示菜单顶栏
            parentKeys: string[] 当此节点被选中的时候也会选中 parentKeys 的节点
            flatMenu:子项往上提,只是不展示父菜单

    4) 在菜单中使用 iconFont

        要使用 iconFont 的图标必须满足两个条件

            (1) 传入一个 iconFont 的 url 链接
            (2) icon 命名必须以 icon-开头

        在 src/app.jsx 中的配置:

            export const layout: RunTimeLayoutConfig = ({ initialState }) => {
                return {
                    iconfontUrl: '//at.alicdn.com/t/XXX.js',
                };
            };