美文网首页web前端React
Umi + ant Design Pro最简单的入门教程(一)初

Umi + ant Design Pro最简单的入门教程(一)初

作者: 侬姝沁儿 | 来源:发表于2019-12-14 14:00 被阅读0次

    前言

    umi,中文可发音为乌米,是一个可插拔的企业级 react 应用框架。这个库入门的门槛比较高,umi是这个样子的,umi = react + redux + react-router + ts + dva + umi脚手架 + ant Design Pro + ant Design UI + umi-block。如果你没有丰富的react基础你来学习他或者是看懂它,那将是很困难的一件事,本博客则是尽量把用户当做小白进行入门,如果你依然觉得困难,那么抱歉本人只能做到这样了。轻喷...

    这里是它的官网:https://umijs.org/zh/.

    在开始之前,你一定要有react的基础,不然你来了只是白来,因为即使项目跑起来了,你也看不懂代码。我猜你需要这个:react入门-React + webpack 开发单页面应用

    相关链接:
    umi
    ant-design-pro
    ant-design-pro github
    pro-blocks
    umi-blocks

    快速上手

    环境准备

    首先得有 node,并确保 node 版本是 8.10 或以上。(mac 下推荐使用 nvm 来管理 node 版本)

    $ node -v
    8.1x
    

    使用 npm

    其官网建议使用的是yarn,但是本人用的是npm,所以全程npm,你需要适应我。

    npm -v
    

    全局安装 umi,并确保版本是 2.0.0 或以上。

    $ npm global add umi
    $ umi -v
    2.0.0
    

    创建 umi 项目

    首先,找个地方建个空目录

    $ mkdir my-umi-app && cd my-umi-app
    

    然后使用 npm create umi 脚手架,创建模板:

    $ npm create umi
    # Choose ant-design-pro:
     Select the boilerplate type (Use arrow keys)
    ❯ ant-design-pro - Create project with an layout-only ant-design-pro boilerplate, use together with umi block.
     app  - Create project with a simple boilerplate, support typescript.
     block  - Create a umi block.
     library  - Create a library with umi.
     plugin - Create a umi plugin.
    

    选择 ant-design-pro,是的,你没有猜错,我们并不按照套路来。

    为何选择这个是有原因的,按照官网搭建出来的内容,相对我们要使用的项目还有很远的路要走,这个过程是持久且没有意义的,ant-design-pro则为我们提供了一个模板,我们在这个模板上进行开发。

    问询 ? Which language do you want to use?,我们选择JavaScript,这是为了降低入门的门槛,所以这里决定使用js,如果你是大佬请忽视这个动作。

    $ npm install  # 安装依赖,时间比较久
    $ npm start  # visit http://localhost:8000
    

    跑起来是这个样子的。你可以简单看看。

    demo

    你的项目目录是这个样子的:

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

    可用的脚本

    npm start # 运行这个脚本会启动服务,自动打开默认浏览器展示你的页面。当你重新编辑代码后,页面还会自动刷新。
    npm run build # 运行这个脚本将会编译你的项目,你可以在项目中的 dist 目录中找到编译后的文件用于部署。
    npm run lint # 通过这个脚本来查看你的代码有哪些问题
    npm test # 这个脚本会执行一系列测试,包括 e2e 测试。
    npm run i18n-remove # 这个脚本将会尝试删除项目中所有的 i18n 代码,对于复杂的运行时代码,表现并不好,慎用。
    

    你需要去这里简单看看有哪些脚本可以使用:可用的脚本

    主要目录和文件介绍

    config 目录

    ├── config  # umi 配置,包含路由,构建等配置
    │  ├── config  # 配置文件:包含路由、样式、proxy等
    │  ├── defaultSettings # 默认设置:包括标题title、navTheme等
    │  ├── plugin.config # webpack的Plugin配置
    │  ├── themePluginConfig # 风格主题的配置
    

    src 目录

    src/components组件目录

    src/components/Authorized组件

    授权组件,路由权限的管理。

    关系:
    index.jsx -> Authorized(内容权限管理) -> CheckPermissions
              -> renderAuthorize(内容渲染)
              -> Secured(判断是否拥有权限访问此 view 权限) -> CheckPermissions
              -> CheckPermissions(通用权限检查方法) -> PromiseRender(promise渲染)
    
    src/components/GlobalHeader组件

    基础布局的头部,包含搜索、用户头像、语言切换。

    ├── src/components
    ├── ...
    ├── GlobalHeader  # 基础布局的头部
    │  ├── AvatarDropdown  # 用户头像下拉菜单
    │  ├── NoticeIconView  # 通知图标和通知消息视图
    │  ├── plugin.config # webpack的Plugin配置
    │  ├── RightContent  # 基础布局的头部核心:包含搜索、头像、语言选择
    
    src/components/... 其他组件

    HeaderDropdown:头部下拉菜单,用于用户头像、搜索等。
    HeaderSearch:头部搜索组件。
    NoticeIcon:头部通知组件。
    PageLoading:加载组件。
    SelectLang:语言切换组件。

    src/layouts布局

    src/layouts/BasicLayout布局

    基础默认布局,菜单、顶部、内容、页脚。包含logo、菜单、面包屑等。

    ant-design-pro的布局:

    ant-design-pro的布局
    src/layouts/SecurityLayout布局

    安全布局,负责验证是否登录和登录后跳转加载,我们可以在这里写自己的登录认证规则。

    src/layouts/... 其他布局

    UserLayout: 用户布局,用于登录页。
    BlankLayout: 空白布局,用于打印页面等不需要布局的页面。

    src/locales

    国际化资源语言,包含四种语言:简体中文、繁体中文、英语、葡萄牙语,如果使用国际化请注意它对诸如:菜单、消息提示等影响。如果你是国内用户,那么你可以忽略它。

    src/models

    全局 dva model

    在 Ant Design Pro 中,一个完整的前端 UI 交互到服务端处理流程是这样的:

    1.UI 组件交互操作;
    2.调用 model 的 effect;
    3.调用统一管理的 service 请求函数;
    4.使用封装的 request.ts 发送请求;
    5.获取服务端返回;
    6.然后调用 reducer 改变 state;
    7.更新 model。

    至于dva是什么?请看这里:dva.js

    这里我们只需要知道它里面的文件内容如下即可:

    // model
    {
      namespace: String, // 命名空间
      state: Object, // 状态
      reducer: Object, // 同步更新 state
      effects: Object, // 副作用:处理异步逻辑
      subscriptions: Object // 订阅数据源
    }
    

    这些文件被引用在src/pages/.umi/dva中。

    我们以 models/global 为例:

    namespace: 'global' 说明以下此处的dva命名空间为 global,即你调用的时候需要采用 global.XXX 的形式

    其中的 state: {} 是存放状态的,也就是数据。

    reducers 是用来更新 state 的,但是他只能是同步的。所以我们需要 effects 来进行异步更新。

    即:

    state: {
    collapsed: false,
    notices: [],
    }, // 存放状态和数据
    
      reducers: { // 用来同步设置state
        changeLayoutCollapsed(
          state = {
            notices: [],
            collapsed: true,
          },
          { payload },
        ) {
          return { ...state, collapsed: payload };
        },
    
        saveNotices(state, { payload }) {
          return {
            collapsed: false,
            ...state,
            notices: payload,
          };
        },
        // ...
     }
    
      effects: { // 异步更新state,通过调用同步的reducers实现
        *fetchNotices(_, { call, put, select }) {
          const data = yield call(queryNotices);
          yield put({
            type: 'saveNotices',
            payload: data,
          });
          const unreadCount = yield select(
            state => state.global.notices.filter(item => !item.read).length,
          );
          yield put({
            type: 'user/changeNotifyCount',
            payload: {
              totalCount: data.length,
              unreadCount,
            },
          });
        },
        // ...
     }
    

    src/pages

    业务页面和常用模板

    src/pages/document.ejs 默认html模板,umi 约定如果这个文件存在,会作为默认模板,内容上需要保证有 <div id="root"></div>,模板里可通过 context 来获取到 umi 提供的变量。

    user user业务逻辑内容,里面包含login登录模块,如果你需要更换登录页,请在这里处理。

    通过 umi block add [block url] --path=[target path] 添加的区块,将会被放置在pages目录下。至于这个命令是做什么的,我们目前先不做理会。后面我会详细说明。

    src/services

    服务请求层,在 Ant Design Pro 中,后台接口服务需要写在services文件下。当然你也可以不那么做。

    例如登录的请求:

    import request from '@/utils/request';
    export async function fakeAccountLogin(params) {
      return request('/api/login/account', {
        method: 'POST',
        data: params,
      });
    }
    export async function getFakeCaptcha(mobile) {
      return request(`/api/login/captcha?mobile=${mobile}`);
    }
    

    不需要国际化

    大多数国内用户是不需要国际化这种东西的,一次我们需要移除它。

    首先,使用umi自带的移除国际化的脚本。

    npm run i18n-remove
    

    这时已经从系统级别移除了国际化的内容,但是依然剩余了很多没有用的文件和代码,需要我们手动进行处理。

    再手动删除 src/components/SelectLangsrc/localessrc/pages/user/login/locales 文件夹。

    再从 src/components/GlobalHeader/RightContentsrc/layouts/UserLayout 文件中移除关于 src/components/SelectLang 组件的引用。如下图:

    src/components/GlobalHeader/RightContent src/layouts/UserLayout

    再从 src/layouts/UserLayout.less 中移除lang的样式:

    src/layouts/UserLayout.less

    完成后,我们的初始化就结束了。

    这是我构建完后的github项目:https://github.com/nongshuqiner/my-AD-pro-init-template

    结语

    至此,一个初始可用的基于ant-design-pro的umi项目就构建且说明完成了,接下来就是根据这个umi项目去实战umi官网上的指南了。

    提示:后面还有精彩敬请期待,请大家关注我的专题:web前端。如有意见可以进行评论,每一条评论我都会认真对待。

    相关文章

      网友评论

        本文标题:Umi + ant Design Pro最简单的入门教程(一)初

        本文链接:https://www.haomeiwen.com/subject/kvvcnctx.html