--> GitHub地址javascript
旧石器时代,Web 开发并不会去刻意区分先后端,写后端的人以为写数据库跟写模板都是应该具有的技能。如今通常须要分先后端,由于大量前端框架和工具链的涌入(根源是需求复杂了),让前端能够跟后端独立开来。可是,不管是前端去写模板,亦或是彻底先后端分离去写 JSX,都脱离不了与后端进行数据交互。css
以上是本工具产生的动因,咱们暂且将先后端交互的数据分为模板数据(由后端直接填充)和异步数据(经过 HTTP 接口),工具的做用就是平滑地进行数据交互过渡,下降沟通成本。html
在开发前期,后端可能并无开始写或者没有写完,前端此时只能经过本地数据模拟实际数据进行布局和组件的调试,通常叫作 mock 数据。前端
待前端写的差很少了,后端可能也差很少了,那么此时须要联调,由于联调的过程极可能伴随着大量的修复工做,先后端杂糅在一块儿部署的代价过高,高效的方式就是经过代理的方式直接从模拟数据切到后端数据,这里叫 proxy。java
若是把 mock 和 proxy 结合起来,那么就叫 moky !webpack
项目的 GitHub 里面已经简单的说了下使用方法,不过我以为仍是有必要补充点额外的说明。git
首先,须要强调的是,moky 侧重点只有 mock 和 proxy,所以能够作到代码也只有 200 行左右,市场上已经有不少人作这方面工做了,而基本都不能知足个人需求。github
使用跟 webpack 很相似,全局安装 npm i moky -g
,只须要一个配置文件,而后直接运行在配置文件 moky.config.js
所在目录运行 moky
,或者经过参数指定配置文件路径 moky -c /path/to/xxx.js
web
可是,正确使用前通常须要先配置好 moky.config.js
,下面针对配置文件作一个罗嗦的介绍:数据库
// 这里之因此须要 path,是由于下面的文件路径都必须是绝对路径 var path = require('path'); module.exports = { // 本地监听端口,运行 moky 会起一个 server localPort: 3000, // 异步数据的 mock 目录路径 asyncMockPath: path.join(__dirname, 'mock'), // 同步数据的 mock 目录路径 viewsMockPath: path.join(__dirname, 'tplMock'), // 模板所在目录,若是你是彻底先后端分离,没有模板,那至少有个 index.html 吧 // 把这个 index.html 所在的目录看成模板目录便可 viewsPath: path.join(__dirname, 'views'), // 这个并无卵用,若是有 favicon 仍是设置下吧 faviconPath: path.join(__dirname, 'public', 'favicon.ico'), // 这里不要被 js 和 css 误导了,这里是设置静态资源的路由 // 注意,其优先级比较高哦,因此不要漏了/多了/跟其它冲突了 publicPaths: { '/css': path.join(__dirname, 'public', 'css'), '/js': path.join(__dirname, 'public', 'js'), }, // 模板引擎的设置,具体参考 koa-views,moky 已经内置了几个模板引擎,能够直接设置就用 // 注意两点:若是选择 freemarker 必定保证 JAVA_HOME 等设置是对的; // 若是是纯 HTML 页面,你随便选个模板引擎便可,推荐 nunjucks viewConfig: { extension: 'html', map: { html: 'nunjucks' }, }, // 这里为了解决不少 Web 容器采用的 Virtual Host 机制(一个 IP:PORT 经过域名对应多个服务) // 因为咱们本地启动的多是 http://localhost:3000,若是有 Virtual Host 机制则通不过的 // 若是设置了 hostName,在发送请求前程序会自动替换 Host 头为 hostName hostName: 'hacker-news.firebaseio.com', // 这里是proxy 映射表,在启动的时候若是是 moky -e dev,异步请求会自动走 dev 对应的 proxy // 若是没找到对应的,那么默认用本地的 mock 数据做为异步数据 proxyMaps: { dev: 'https://hacker-news.firebaseio.com', local: 'http://localhost:8080', }, // 这是页面路由的设置,这里的 key 是路由(URL 里见到的),value 是页面的相对路径 // 路径相对于 viewsPath , 不用加后缀,viewConfig.extension 指明了 urlMaps: { '/': 'index', '/page': 'page/index', }, }
最简单的试用就是全局安装 moky
,而后 clone 项目,进入 example 目录,直接运行 moky
先看下目录结构:
├── mock │ ├── get │ │ ├── test │ │ │ └── index.json │ │ └── v0 │ │ └── item │ │ └── 2921983.json.json │ └── post │ └── index.json ├── moky.config.js ├── public │ ├── css │ │ └── main.css │ ├── favicon.ico │ └── js │ └── main.js ├── tplMock │ ├── index.json │ └── page │ └── index.json └── views ├── index.html └── page └── index.html
直接运行 moky
会默认使用 mock 模式,数据流是这样的:
咱们浏览器打开 http://localhost:3000/page
路由会根据咱们的设置匹配一遍:静态资源 -> 页面 -> 异步接口,这里匹配到页面就中止了
程序会去 tplMock/page/index.json
下拿模板数据,而后填充渲染返回
此时页面里的静态资源的会被首先从 public 下路由
而后会有个异步接口 GET v0/item/2921983.json
,会最终被异步处理模块处理
由于咱们启动的时候是 mock 模式,因而会去 mock/get
文件夹找对应位置的 json 做为本地 mock 数据
若是咱们是 moky -e dev
启动的,那么 GET v0/item/2921983.json
会被从 proxyMaps.dev
反代
模板数据没法走 proxy 从远端获取
对第三方登陆/认证不友好