前端模拟数据的技术方案(三)

读取模拟服务器的静态数据,读取模拟服务器动态数据。

和技术方案(二)的主要区别在于:接口路由key和数据key都用字符串,不用变量,减少赋值,和对变量集合的处理,好处是路由规则更多元化,需要什么,手动添加;写了一个公用的注册模块的方法,用于搜集数据和路由,需要什么模块,只需要修改modules.js一个文件。

一、准备工作

1、参考文档

json-server官网

mockjs官网

2、安装包

# 安装json-server服务
npm install json-server --save-dev  

# 安装nodemon,修改配置无需重启服务 npm install nodemon --save-dev
# 安装批量生成数据 npm install mockjs --save-dev

3、mock目录结构

├── dynamic
│   │   ├── config.js
│   │   ├── modules.js 注册模块
│   │   ├── registerModule.js 库文件
│   │   └── server.js 服务器
└── static
│       ├── config.js
│       ├── modules.js
│       ├── registerModule.js
│       └── server.js

4、给package.json添加配置

"scripts": {
   "server": "cd mock/static && nodemon server.js",
   "dserver": "cd mock/dynamic && nodemon server.js"
}

5、webpack配置(代理,接口路由匹配)

// 本地开发 Server 配置
const DEV_SERVER_CONFIG = {
    historyApiFallback: true,
    hot: true,
    inline: true,
    progress: true,
    host: '127.0.0.1', open: true, overlay: true, proxy: { '/api/*': { // 静态 target: 'http://127.0.0.1:3005', secure: true, changeOrigin: true }, /*'/api/*': { // 动态 target: 'http://127.0.0.1:3003', secure: true, changeOrigin: true }*/ } };

二、模拟从服务器读取数据-静态数据

1、文件调用依赖结构图

2、mock配置文件

// config.js

module.exports = {
    SERVER: '127.0.0.1',
    //定义端口号
    PORT: 3005
};
// registerModule.js
let datas = [];
let routes = [];
var dataObj = {};
var routeObj = {};

function registerModule(mods = []) {
for (let item of mods) {
  datas.push(item.datas);
  routes.push(item.routes);
}
dataObj = Object.assign(...datas);
routeObj = Object.assign(...routes);
console.log({ dataObj, routeObj });
return { dataObj, routeObj };
};

module.exports = function(mods) {
return registerModule(mods);
};
// modules.js
let registerModule = require('./registerModule.js');
// 添加模块
let demoA = require('../../demos/staticDataA/fakeData/index.js');
let demoB = require('../../demos/staticDataB/fakeData/index.js');
let demoC = require('../../demos/diffRequest/fakeData/index.js');

module.exports = registerModule([demoA, demoB, demoC]);
// server.js
const config = require('./config.js');
const jsonServer = require('json-server');
let registerModule = require('./modules.js');
const rules = registerModule.routeObj;
const dbfile = registerModule.dataObj;
const ip = config.SERVER;
const port = config.PORT;

const server = jsonServer.create();
const router = jsonServer.router(dbfile);
const rewriter = jsonServer.rewriter(rules);
const middlewares = jsonServer.defaults();

server.use(jsonServer.bodyParser);
server.use(middlewares);

// 添加响应头
server.use((req, res, next) => {
res.header('X-Server', 'jsonServer-mockjs');

if (req.method === 'POST') {
// req.method = 'GET';
}
next();
});

server.use(rewriter);
server.use(router);

server.listen({
host: ip,
port: port
}, function() {
    console.log(`JSON Server is running in http://${ip}:${port}`);
});

3、页面模块

// 目录树
│   ├── staticDataA
│   │   ├── fakeData
│   │   │   ├── data
│   │   │   │   ├── deleteItem.js
│   │   │   │   └── getList.js
│   │   │   ├── datas.js
│   │   │   ├── index.js
│   │   │   └── routes.js
│   │   └── staticDataA.jsx
│   └── staticDataB
│   ├── fakeData
│   │   ├── data
│   │   │   ├── getBookList.js
│   │   │   └── updateItem.js
│   │   ├── datas.js
│   │   ├── index.js
│   │   └── routes.js
│   └── staticDataB.jsx
// getList.js
module.exports = {
'success': true,
'data': [{
'id': '001',
'name': 'banana'
},
{
'id': '002',
'name': 'orange'
},
{
'id': '003',
'name': 'apple'
}
]
};
// index.js
let datas = require('./datas');
let routes = require('./routes');
module.exports = {
datas,
routes
};
// datas.js
module.exports = {
'getList': require('./data/getList.js'),
'deleteItem': require('./data/deleteItem.js')
};
module.exports = {
    '/api/list*': '/getList',
    '/api/delete*': '/deleteItem',
    '/api/list\\?id=:id': '/getList/:id',
    '/api/list/:id': '/getList?id=:id'
};

4、启动页面和服务(记得切换webpack的代理配置)

# 启动服务
npm run server
npm run dev
打开浏览器,在地址栏中输入http://localhost:3005/

三、模拟从服务器读取数据-动态数据 

1、mock配置文件

// config.js
module.exports = {
  SERVER:"127.0.0.1",  
  //定义端口号
  PORT: 3003
};
// registerModule.js
let datas = [];
let routes = [];
var dataObj = {};
var routeObj = {};

function registerModule(mods = []) {
for (let item of mods) {
  datas.push(item.datas);
  routes.push(item.routes);
}
dataObj = Object.assign(...datas);
routeObj = Object.assign(...routes);
console.log({ dataObj, routeObj });
return { dataObj, routeObj };
};

module.exports = function(mods) {
return registerModule(mods);
};
// modules.js
let registerModule = require('./registerModule.js');
// 添加模块
let demoA = require('../../demos/dynamicDataA/fakeData/index.js');
let demoB = require('../../demos/dynamicDataB/fakeData/index.js');

module.exports = registerModule([demoA, demoB]);
// server.js
const config = require('./config.js');
const jsonServer = require('json-server');
let registerModule = require('./modules.js');
const rules = registerModule.routeObj;
const dbfile = registerModule.dataObj;
const ip = config.SERVER;
const port = config.PORT;

const server = jsonServer.create();
const router = jsonServer.router(dbfile);
const rewriter = jsonServer.rewriter(rules);
const middlewares = jsonServer.defaults();

server.use(jsonServer.bodyParser);
server.use(middlewares);

// 添加响应头
server.use((req, res, next) => {
res.header('X-Server', 'jsonServer-mockjs');

if (req.method === 'POST') {
// req.method = 'GET';
}
next();
});

server.use(rewriter);
server.use(router);

server.listen({
host: ip,
port: port
}, function() {
    console.log(`JSON Server is running in http://${ip}:${port}`);
});

2、页面模块

// 目录树
│   ├── dynamicDataA
│   │   ├── dynamicDataA.jsx
│   │   └── fakeData
│   │   ├── data
│   │   │   └── getNewsA.js
│   │   ├── datas.js
│   │   ├── index.js
│   │   └── routes.js
│   ├── dynamicDataB
│   │   ├── dynamicDataB.jsx
│   │   ├── fakeData
│   │   │   ├── data
│   │   │   │   └── getNewsB.js
│   │   │   ├── datas.js
│   │   │   ├── index.js
│   │   │   └── routes.js
// getNewsA.js

let Mock = require('mockjs');
let Random = Mock.Random;

module.exports = function() {
    var data = {
        news: []
    };

    for (var i = 0; i < 10; i++) { var content = Random.cparagraph(0, 10); data.news.push({ id: i, title: Random.cword(8, 20), desc: content.substr(0, 40) }); } return { 'success': true, 'data': data }; }();
// index.js
let datas = require('./datas');
let routes = require('./routes');
module.exports = {
datas,
routes
};
// routes.js
module.exports = {
'/api/getNewsA*': '/getNewsA',
'/api/getNewsA\\?id=:id': '/getNewsA/:id',
'/api/getNewsA/:id': '/getNewsA?id=:id'
};
// datas.js
module.exports = {
    'getNewsA': require('./data/getNewsA.js')
};

3、启动服务和页面

# 启动服务
npm run dserver
npm run dev
打开浏览器,在地址栏中输入http://localhost:3003/

四、规范制度

本着少踩坑的原则,下面约束一些fakeData中的开发规范。

1、mock多模块,文件命名应该不一致。

比如A模块是staticDataA/fakeData/data/getList.js,B模块是staticDataB/fakeData/data/getBookList.js。

2、不同模块,key命名要不同。

比如A模块是demos/staticDataA/fakeData/index.js,key有getList和deleteItem。

比如B模块是demos/staticDataB/fakeData/index.js,key有getBookList和updateItem。

3、同一模块,key命名要一致。

比如A模块的staticDataA/fakeData/datas.js文件的key为getList,staticDataA/fakeData/routes.js文件的value值为getList,也就是说数据key和路由value需要保持一致。

转载于:https://www.cnblogs.com/camille666/p/fe_fake_data_server_register_module.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值