首页 > 技术文章 > umi+dva+antd+axios搭建项目,跨域代理问题

liuqin-always 2020-07-03 15:43 原文

  项目背景:以前学过一些react,但是没有实际写过项目,只了解一些基础的用法,这次正好空闲有时间将一个后台系统改写为react的,来实际操作一下react。深感直接用react写会很累,所以结合现代的流行的框架umi、dva、antd来写。这样写起来也比较轻松,也有成就感。下面开始记录项目搭建的一些过程。

  一、项目搭建:umi的官网上有说怎么新建一个项目,但是对于我这次的项目搭建不是很合适,于是采用的另一种搭建方式:

1.mkdir myapp && cd myapp

2.npm create umi

3.执行上一步之后,界面出现以下选择

? 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.

4. ? Do you want to use typescript? (y/N)
5. ? What functionality do you want to enable? (Press <space> to select, <a> to toggle all, <i> to invert selection) ❯◯ antd ◯ dva ◯ code splitting ◯ dll
最后一步选择antd和dva,选择后生成了一个文件夹:create,然后进入这个文件夹,使用npm install安装依赖
安装完成之后,启动项目:npm start。此时如果提示报错,可能是umi-plugin-react没有配置好,我重新安装了最新的依赖:"@umijs/preset-react": "^1",然后再删除了原有的.umirc.js配置文件,新建config文件夹,
在下面建立config.js文件,在里面配置:
 1 export default {
 2   base: '/',
 3   plugins: [
 4     ['umi-plugin-react', { // 主要是这个配置,我曾按照最新的方式直接配置 antd:{}和dva:{}结果还是报错,这样就不报错了。
 5       antd: true,
 6       dva: {
 7         hmr: true
 8       },
 9       dynamicImport: {
10         webpackChunkName: false,
11         // loadingComponent: './components/PageLoading/index'
12       },
13       locale: {
14         enable: true, // default false
15         default: 'zh-CN', // default zh-CN
16         baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default
17       }
18       // ...(!process.env.TEST && os.platform() === 'darwin'
19       //   ? {
20       //     dll: true,
21       //     hardSource: true,
22       //   }
23       //   : {}),
24     }],
25     // ['umi-plugin-ecma5-validator', {}],
26   ]
27 }

这一系列配置完成之后,启动项目就看到默认的启动页了。

二、dva的使用

  dva官方介绍:dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。在umi中使用dva很简单,在安装了dva之后,在src目录下直接新建models文件夹,下面新建app.js,这个文件则是全局的可以在里面配置全局的一些方法。具体看官网和自己的实际需求。然后单独的每个页面的model则可以直接配置在单独的文件夹下,如login文件夹下有:index.js、index.less、model.js,这样在index.js里直接引入dva的connect,不必引入model,框架会自动识别到,然后再导出组件的时候挂载,如下所示:

export default connect(({ login }) => ({ login }))(Login)

这样在组件里的props里就可以拿到我们管理的数据了。model.js里的具体写法参看官网。

三、antd的使用,在安装之后,进行了第一步里的配置之后,则在各个组件里直接引入就可以了,推荐按需引入,如下:

import { Form, Input, Button, Divider, Icon } from 'antd';

四、axios使用和跨域相关问题

终于进入到今天的关键问题了,网上搜了好多关于react里使用axios解决跨域的问题,基本都是说两种方案:

1.在package.json里配置proxy,以对象的方式,记得加双引号。并说明这种方式只适合一个代理的接口。

2.使用http-proxy-middleware,首先安装这个插件,然后在src下面新建setupProxy.js文件,里面配置内容就不多说了,网上一搜一大把。

然而这两种方式我用了都没有任何效果,我觉得是因为我在umi里用的原因,然后突然看到一位小伙伴是在.umirc.js文件下直接配置的proxy,于是我在我的config.js里做了proxy代理,然后点击登录,我的天,简直了,直接就代理成功了,哈哈哈,终于成功了,没想到umi的配置这么简单,我突然很想说一句:umi真香啊!

当然,以上的这些经验主要是由于我没有深入理解这些框架导致的,如果大家比较熟悉这些框架可能不会出现这些问题。总而言之,言而总之,终于可以正常开发了,接下来就是权限方面的难题了。后面再更新。。。

推荐阅读