React + dva+ antd+ less+ mock 搭建前端项目

1.安装环境

cnpm i create-react-app -g //全局安装
create-react-app project
cd project 
npm start
npm run eject // 打开webpack配置

2.安装dva,并在src下创建目录models、pages、routes、utils、servieces
pages文件夹下分别建a.js,b.js

cnpm i dva --save //安装dva
cnpm i history --save

a.js

import React, { Component } from 'react';
import { Link } from 'dva/router';
import {connect} from 'dva';
class AAA extends Component {
 render() {
   return (
     <div>
       <p className={pagea.p}
       >
         AAA页
       </p>
       <Link to={'/aaa/bbb'}>
           去BBB页面
        </Link>

     </div>
   );
 }
}

export default connect(({ aaa }) => ({
 aaa,
}))(AAA);

model新建a.js、b.js,
a.js

export default {
    namespace: 'aaa',
    state: {
      name:'这是aaa的model'
    },
    subscriptions: {},
    effects: {},
    reducers: {},
  };

3.routes中新建config.js,index.js
config.js录入路由信息

const menuGlobal=[
    {
        id:'aaa',
        pid:'0',
        name:'aaa页',
        icon:'user',
        path: '/aaa',
        models: () => [import('../models/a')], //models可多个
        component: () => import('../pages/a'),
    }, 
    {
        id:'bbb',
        pid:'0',
        name:'bbb页',
        icon:'user',
        path: '/aaa/bbb',
        models: () => [import('../models/b')], //models可多个
        component: () => import('../pages/b'),
    }, 
  ];
export default {
    menuGlobal
}

index.js

import config from './config';
export {
    config
}

4.src目录下创建router.js路由控制文件

import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import dynamic from 'dva/dynamic'
import {config} from './routes'
const { menuGlobal } = config
function RouterConfig({ history, app }) {
  return (
    <Router history={history}>
      <Switch>
        {
          menuGlobal.map(({path,...dynamics},index)=>(
            <Route
              key={index} 
              path={path} 
              exact 
              component={dynamic({
                app,
                ...dynamics
              })} 
            />
          ))
        }
      </Switch>
    </Router>
  );
}
export default RouterConfig;

5.修改src文件下夹下index.js

import dva from 'dva';
import './index.less';
import createHistory from 'history/createBrowserHistory'
//  console.log('history', history);
// 1. Initialize
const app = dva({
    history:createHistory()
});
 
// 2. Plugins
// app.use({});
 
// 3. Model
app.model(require('./models/app').default);
 
// 4. Router
app.router(require('./router').default);
 
// 5. Start
app.start('#root');

至此,实现了路由间的跳转与model的连接


image.png

因项目需求,并没有使用最新的antd 4 的版本,所以安装的时候指定了版本

cnpm i antd@3.26.15 --save
cnpm i babel-plugin-import --save
cnpm i less less-loader --save

6.配置less
在package.json中对babel添加plugin 配置

"plugins": [
      [
        "import",
        {
          "libraryName": "antd",
          "style": "css"
        }
      ]
    ]

另外在webpack.config.js中配置less


image.png

在下面添加下面两行代码,然后找到oneOf,在cssRegex的配置下面添加less配置

 {
              test: lessRegex,
              exclude: lessModuleRegex,
              use: getStyleLoaders(
                {
                importLoaders: 1,
                sourceMap: isEnvProduction && shouldUseSourceMap,
              },'less-loader'),
              // Don't consider CSS imports dead code even if the
              // containing package claims to have no side effects.
              // Remove this when webpack adds a warning or an error for this.
              // See https://github.com/webpack/webpack/issues/6571
              sideEffects: true,
            },
            {
              test: lessModuleRegex,
              use: getStyleLoaders({
                importLoaders: 1,
                sourceMap: isEnvProduction && shouldUseSourceMap,
                modules: true,  
                modules: {
                  getLocalIdent: getCSSModuleLocalIdent,
                },
              }, 'less-loader'),
            },

大概位于470--530行
然后在pages下新建a.less

@color: #f00;
.p{
   color: @color
}

修改page a.js代码,引入less


image.png

我使用的是modules,所以文件名为a.moduls.less
至此,页面刷新,


image.png
  1. 配置mock
cnpm i webpack-api-mocker --save-dev

在webpackDevServer.config.js中添加配置

const apiMocker = require('webpack-api-mocker');
...
before(app, server) {
      if (fs.existsSync(paths.proxySetup)) {
        require(paths.proxySetup)(app);
      }
      apiMocker(app, path.resolve(__dirname, '../mock/index.js'))
    },

src同级建mock文件夹 ,编写 /mock/index.js

module.exports = {
      [`GET /react/user`]: (req, res) => {
        let result = {
            status: 200,
            message: "succese",
            data: [100000000]
        }
          if (res && res.json) {
            res.json(result);
          } else {
            return result;
          }
      }
      }

另外,在组件中使用@符号时需进行babel配置

cnpm i @babel/plugin-proposal-decorators  babel-plugin-transform-decorators-legacy --save -dev

更改package.json 或.babelrc文件

"babel": {
    "presets": [
      "react-app"
    ],
    "plugins": [
      [
        "import",
        {
          "libraryName": "antd",
          "style": "css"
        }
      ],
      [
        "@babel/plugin-proposal-decorators",
        {
          "legacy": true
        }
      ],
      [
        "@babel/plugin-proposal-class-properties",
        {
          "loose": true
        }
      ]
    ]
  }

至此,完成了react 项目的基本配置。从头来一遍,是希望自己对某些配置更熟悉
好记性不如烂笔头,记录一下。
原文出处: https://blog.csdn.net/xw505501936/article/details/80621740

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352