@[toc]
一、什么是react
React12 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC框架,都不满意,就决定自己写一套,用来架设Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
由于 React的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。
这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用写 Web App 的方式去写 Native App。如果能够实现,整个互联网行业都会被颠覆,因为同一组人只需要写一次 UI ,就能同时运行在服务器、浏览器和手机。
React主要用于构建UI。你可以在React里传递多种类型的参数,如声明代码,帮助你渲染出UI、也可以是静态的HTML DOM元素、也可以传递动态变量、甚至是可交互的应用组件。
特点:
1.声明式设计:React采用声明范式,可以轻松描述应用。
2.高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
3.灵活:React可以与已知的库或框架很好地配合。
二、什么是dva
dva 3首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。
特性
- 易学易用,仅有 6 个 api,对 redux 用户尤其友好,配合 umi 使用后更是降低为 0 API
- elm 概念,通过 reducers, effects 和 subscriptions 组织 model
- 插件机制,比如 dva-loading 可以自动处理 loading 状态,不用一遍遍地写 showLoading 和 hideLoading
- 支持 HMR(热加载),基于 babel-plugin-dva-hmr实现 components、routes 和 models 的 HMR
简单来说dva就是这个团队觉得redux+redux-sage这一套数据流太麻烦,将这些整合封装成了一个最佳体验模式(也就是最方便开发使用)提供开发者使用
三、什么是umi
Umi 4,中文可发音为乌米,是可扩展的企业级前端应用框架。Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。然后配以生命周期完善的插件体系,覆盖从源码到构建产物的每个生命周期,支持各种功能扩展和业务需求。
Umi 是蚂蚁金服的底层前端框架,已直接或间接地服务了 3000+ 应用,包括 java、node、H5 无线、离线(Hybrid)应用、纯前端 assets 应用、CMS 应用等。他已经很好地服务了我们的内部用户,同时希望他也能服务好外部用户。
它主要具备以下功能:
- 🎉 可扩展,Umi 实现了完整的生命周期,并使其插件化,Umi 内部功能也全由插件完成。此外还支持插件和插件集,以满足功能和垂直域的分层需求。
- 📦 开箱即用,Umi 内置了路由、构建、部署、测试等,仅需一个依赖即可上手开发。并且还提供针对 React 的集成插件集,内涵丰富的功能,可满足日常 80% 的开发需求。
- 🐠 企业级,经蚂蚁内部 3000+ 项目以及阿里、优酷、网易、飞猪、口碑等公司项目的验证,值得信赖。
- 🚀 大量自研,包含微前端、组件打包、文档工具、请求库、hooks 库、数据流等,满足日常项目的周边需求。
- 🌴 完备路由,同时支持配置式路由和约定式路由,同时保持功能的完备性,比如动态路由、嵌套路由、权限路由等等。
- 🚄 面向未来,在满足需求的同时,我们也不会停止对新技术的探索。比如 dll 提速、modern mode、webpack@5、自动化化 external、bundler less 等等。
什么时候不用 umi?
如果你,
- 需要支持 IE 8 或更低版本的浏览器
- 需要支持 React 16.8.0 以下的 React
- 需要跑在 Node 10 以下的环境中
- 有很强的 webpack 自定义需求和主观意愿
- 需要选择不同的路由方案
Umi 可能不适合你。
四、什么是antd
antd [5]是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。
特性
支持环境
- 现代浏览器和 IE11 及以上(需要 polyfills)。
- 支持服务端渲染。
- Electron
六、开始使用脚手架创建项目
首先保证电脑上有node环境,这个就不说了
本教程使用yarn也是umi推荐的依赖管理工具
1. 第一步安装umi全局依赖
$yarn global add umi
$umi -v
umi@3.0.9
成功安装umi依赖
umi升级成3.0了,手脚架创建项目与以前不一样了
2. 新建一个文件夹,并在终端打开,并创建项目
$ mkdir myapp && cd myapp
$ yarn create @umijs/umi-app
此时手脚架在该文件夹下会创建这些文件
Copy: .editorconfig
Write: .gitignore
Copy: .prettierignore
Copy: .prettierrc
Write: .umirc.ts
Copy: mock/.gitkeep
Write: package.json
Copy: README.md
Copy: src/pages/index.less
Copy: src/pages/index.tsx
Copy: tsconfig.json
Copy: typings.d.ts
需要查看隐藏文件才能看到”.”开头的文件,ubuntu查看隐藏文件快捷键为ctrl+h,macOs好像是command+shift+.忘记了。
3.使用yarn安装依赖
$ yarn
yarn install v1.21.1
[1/4] 🔍 Resolving packages...
success Already up-to-date.
✨ Done in 0.71s.
启动项目
$ yarn start
Starting the development server…
✔ Webpack Compiled successfully in 17.84s
DONE Compiled successfully in 17842ms
8:06:31 PM
App running at:
4.在浏览器里打开 http://localhost:8000/,能看到以下界面:
此时,你的umi项目的目录是这样的:
- mock文件夹是用来写前端mock数据的,此目录下所有 js 和 ts 文件会被解析为 mock 文件。
- node_modules是项目所有依赖的包
- src
- .umi是临时文件目录,比如入口文件、路由等,都会被临时生成到这里。不要提交 .umi 目录到 git 仓库,他们会在 umi dev 和 umi build 时被删除并重新生成。
- pages目录所有路由组件存放在这里。
- .editorconfig 编辑器的设置
- .gitignore 使用git时不需要git维护的内容设置
- prettierignore package.json中有插件prettier,这是prettier代码美化工具不需要关系的文件设置
- prettierrc prettier代码美化规则
- .umirc.ts umi框架的配置
- package.json 包含插件和插件集,以 @umijs/preset-、@umijs/plugin-、umi-preset- 和 umi-plugin- 开头的依赖会被自动注册为插件或插件集。
- readme不说了
- tsconfig.json 指定ts编译的一些参数信息
- typings.d.ts 变量一系列的申明文件
umi的配置项:
打开**.umirc.ts**文件
看到的配置是这样的,defineConfig是umi的一个函数,应该是预留的目前没什么用,直接return了这个传入的对象,我们来改造一下,跟踪到definConfig函数中我们看到:
ts定义传入的对象类型为Iconfig,返回类型为Iconfig,在源码中是直接return了。所以我们为了更好的理解,我们将.umirc.ts改写为这样
这个和原来的没有区别,更好理解而已。
接下来我们跟踪到IConfig中,看配置属性:
这些属性自己去根据umi官网上的配置项说明,根据自己需求自由添加,地址是https://umijs.org/zh-CN/config,不多说了。
七、开始编写页面
router提取
在根目录创建config文件夹,创建router.comfig.ts文件
插入代码:
发现没有umi-types依赖包,yarn在开发环境中,生产环境不需要的
$yarn add umi-types --dev
将.umirc.ts中改成引用router
这么做防止以后router 过多,拆封成一个文件单独管理
项目的拓展工作
在SRC文件夹下创建多个文件夹,拆分组件、model、工具类等,再添加global.less文件全局使用的样式。
创建完后项目目录结构是这样的:
编写页面demo
1.我们先将umi中的页面的demo复制粘贴进来看看效果
打开pages下的index.tsx文件
将代码替换,我将我个人理解的注释都写在代码里面了
现在代码是报错的,别着急,再在index.ts同级目录下创建model.ts数据流控制文件,将代码复制进去,我这种CV工程师常干的事情,model自己去看dva官网的教程,写的很清楚了,通常一个页面一个model
以上代码都是umi官网的demo中复制来的不是本人写的
再看看页面,左上角是不是出现了hello skedush in model的字样,其中skedush in model是在model的state中的name传入当前组件展示的
修改组件使用class形式
打开index.tsx
这组件已经不是function component了,所以在react导入PureComponent,我直接在代码里注释,看的更清楚一些
页面展示
两个name一个是在model的state的,一个是在当前组件的state中的。
引用antd组件并操作state与model
在终端执行命令安装antd
$ yarn add antd
修改index.tsx,以及在model中添加Effect
index.tsx:
在头部引用antd中的button组件,在render将组件渲染,并绑定onclick事件,事件使用箭头函数,默认bind了当前的组件。
注意修改了model之后需要刷新页面,model才会生效,有时候会自动刷新,有时候并不会自动刷新,修改之后model.ts为:
此时页面展示是这样,点击按钮会产生相应的变化 |
---|
|
修改antd组件的样式
使用cssModule方式修改
1.在index.tsx中引入index.less,首先保证index.tsx同级目录中有index.less这个文件,没有自行创建;Ï
2.在给button增加className属性,cssmodule方式使用如下
3.在index.less中增加样式
鼠标悬浮:
注意是是要是引用了antd pro,这么修改button的样式无效,因为antd pro的样式有毒的。
得这么改,不过大多antd的组件样式基本都得这么改:
index.tsx:
index.less
现在再看页面效果是一样的
捕捉antd组件样式名
防止一些同学这个都不知道,我还是说一下吧,Chrome浏览器为例子,不用Chrome的前端就别学了,按f12
mac和windows都一样。或者之间ctrl+shift+c (command+shift+c)
ubuntu的话就不说了,我不配讲ubuntu大佬。
使用global.less
我们之前创建了global.less这个文件,这个是全局的样式,umi会默认将该文件的样式覆盖到全局,利用global.less修改第二个按钮的样式,woc这里改了半天,因为umi升级到3.0之后global.less有点区别了
编辑global.less:
编辑index.tsx的第二个button:
查看页面
使用axios发起网络请求
编写mock
在mock中创建文件
mockDemo.ts:
保存完之后mock会自动加载,在终端会出现,失败会有失败提醒
封装request
简单封装request,在utils文件夹中创建request.ts,这里要用到axios和lodash的库,先yarn add一下
$yarn add axios lodash
request.ts:
在model中使用网络请求
打开model.ts
引入编写的request.js
再修改model中的changeState方法
将以上代码添加替换掉model.ts中对应的地方
修改index.tsx的按钮onclick的事件,发起请求,以及将model中的state再次渲染到页面中
index.tsx
修改onClick2这个方法:
页面效果:
前面的skedush in model是在model的state中取得的,请求改变了model的数据,传入的props改变页面自动会渲染
点击按钮发起的请求
网络请求的response
model中res的输出,因为我们在request中封装了请求的返回值
开发到这里,单个页面基本的流程已经完成了,写下来快速开发第二个页面。
八、快速开发第二个页面
- 在pages下创建Dashboard文件夹,接着再Dashboard中创建Home与NewPage文件夹
- 将原本在pages下的index.tsx,index.less,model.ts移动到Home文件夹下,在NewPage中创建index.tsx,index.less,model.ts三个文件创建完后你的目录是这样的:
-
修改config中router.config.ts路由配置文件
- 现在进入http://localhost:8000/new路由下是空白的,因为我们没有写任何东西,打开NewPage下的index.tsx添加如下代码:
- 在mock文件夹下创建newPage.ts模拟数据请求数据:
- NewPage下的model.ts:
- 现在让我们看看页面的效果
本场chat结束,这个只是一个简单使用umi框架的教程,真正应用到开发中还需要封装很多通用的工具类、api、装饰器等,还有最关键通用组件的封装。下一篇我将介绍如何封装一些通用的库,与通用组件的封装,以及页面级组件的封装,令开发变的更加简单,打造一款属于自己的企业级框架。