node-web-dev v1.2.9
node-web-dev
一、简介
一个用于在开发时前后端分离的工具,不需要启动后端网站服务,使用nodejs服务来mock请求,
进行视图渲染,ajax接口代理等,从而实现,整站mock。
举个栗子:
后端:java springmvc + (动态视图: freemarker) ----名称: websites
前端:javascript
前后端在合作时,通常有以下场景
前端项目单独分开,在开发时使用.html静态文件 + js开发功能,开发完毕后,将视图前端资源等丢给后端开发人员转换成动态视图
以上场景会有以下问题
1.视图存在两份 一份前端.html 另一份xx.动态视图,在调试样式时有时候难免会两边都需要顾全到,有时候容易造成不一致。
2.有些情况下,前端需要启动后端服务,来进行本地调试,这样对后端项目依赖性比较大。
3.如果要把视图分离出来,前端需要构建自己的站点,旧的模式迁到新的模式下,工作量比较大。
那么如果不想改变现有的框架模式,可以使用本模块进行mock
使用本模块的mock服务有以下优点
1.不需要调整现有框架,前端只需要把后端项目拉取到本地,通过配置就能实现mock方式浏览整站,并且独立开发
2.前后端可以并行开发,前端无需等待后端接口开发完毕,才能调试。
3.支持调用ajax接口时,代理到其他环境,例如:开发环境,测试环境等。
4.视图交给前端维护,便于管理 (不过部分后端动态视图前端学起来会有些成本,当然仅仅是针对这些特定场景定制,而不是通用所有人群)
二、安装
npm install node-web-dev --save-dev
三、环境要求
nodejs v6.2+ (目前使用es6语法所写,暂时不打算转换成es5)
jdk (在使用freemakre 需要依赖于jdk) 安装代价不大
四、都支持哪些动态视图编译?
目前仅支持freemarker的视图编译,后续部分会实现其他较为纯粹的动态视图
五、用例
var DynamicViewProjectDev = require('node-web-dev').DynamicViewProjectDev;
var options = {
server: {
"server": "../webapp/",
"files": ['../webapp/**/*.css', '../webapp/**/*.js'],
"index": "/",
},
proxy: {
target: 'http://10.21.11.161:8010',
viewTarget:'http://10.21.11.161:8020'
},
local: {
local: 'auto',
record:true,
localDir: path.join(__dirname, '../../../mock/')
},
projects: [
path.join(grunt.projectPath, '../account/src/main/webapp/WEB-INF/views/**/*.ftl'),
path.join(grunt.projectPath, '../search/src/main/resources/ftl/**/*.ftl'),
],
route: path.join(__dirname, '../../../routes/pc.route.js')
}
var dev = new DynamicViewProjectDev(options);
dev.on('dataWrap', (context) =>context.data.user={name:'ss',age:xxxx});
dev.startup();
六、参数解释
server 使用的是browser-sync服务
- server.server 前段静态资源网站服务器根目录 例如 "../webapp/"。
- server.files 要监听的文件或者目录,文件改变时,会自动同步通常用于css或者js 例如:'../webapp//*.css', '../webapp//*.js'。
- server.indexReplace 当进行代理访问时,默认将 "/" 使用indexReplace值访问代理服务器,不影响本地路由匹配
proxy
- proxy.target mock接口服务器地址,详细设置参照: http-proxy
- proxy.viewTarget 本地视图route( {view:'xxx'})的代理接口地址,默认可以不填写,不填写情况统一使用target(为什么会有此参数?有时候我们可能希望本地的视图使用mock的,其他接口数据使用的不同环境的,例如:开发,测试等)
local
- local.mode 本地mock模式 'online'--> 所有接口使用在线数据,'auto'-->优先从代理获取数据,当获取失败,使用本地路由定义的数据,'local'--> 所有接口都使用本地, 'existsLocal'--> 当在本地置有路由则使用本地的,否则使用在线的
- local.localDir 本地mock数据的存放目录
- local.record 是否自动同步mock数据到本地
projects 要监听的后端项目,通常用于指定在后端项目中视图改变时,自动刷新浏览器例如:'./websites/src/main/web-inf/views/*/.ftl'
route 本地mock使用的路由装载js或者json 例如: './routes/route.js'
module.exports =[
{
"url":"/",
"view": "site/home.ftl",
"dir": "websites",
"method":"GET",
"viewsDir": "./websites/src/main/web-inf/views"
},
{
"url":"/item/\\d+",
"view": "item/item-info.ftl",
"method":"GET",
"dir": "websites",
"viewsDir": "...."
},
{
"url":"/news/list",
"mock":"./mock/new-list.js",
"method":"POST",
"dir":"websites"
},
{
"url":"/do",
"method":"POST",
"view": "redirect:/item/999"
}]
七、事件
- onReady 当mock服务启动后触发
- onProxy 当mock请求代理服务器数据返回后触发
proxyHost: 代理host地址
req: 当前http请求对象 ClientRequest
res: 当前http请求对应的返回对象 IncomingMessage
(proxyHost, req, res)=>{
......
}
- onResponse 当mock请求代理服务器数据返回后触发
content: 返回的内容string
proxyRes 代理response
req: 当前http请求对象 ClientRequest
res: 当前http请求对应的返回对象 IncomingMessage
(content,proxyRes, req, res)=>{
......
}
- match 用于自定义匹配请求对应的路由,如果不指定,则默认根据route.js注册路由的url匹配
context: { route:默认匹配的路由,routeContainer: 路由容器}
pathname: 当前请求pathname
req: 当前http请求对象 ClientRequest
res: 当前http请求对应的返回对象 IncomingMessage
(context, pathname, req, res)=>{
//通过复写context.route来重新定义当前匹配到的路由
context.route ={
view:'sss.ftl',
dir:'xxx',
....
}
}
- error 当mock请求代理服务器出现异常时触发
error: 错误消息
req: 当前http请求对象 ClientRequest
res: 当前http请求对应的返回对象 IncomingMessage
(error, req, res)=>{
}
- dataWrap 用于自定义mock数据处理,当需要对mock接口返回的数据进行额外处理可以使用此事件
context: {data:...}
(context)=>{
context.data.other ={.....};
}
八、定制编译器
ES6:
var Compiler = require('node-web-dev').Compiler;
class JspCompiler extends Compiler{
constructor(){
super('.jsp');
}
compile(file,data,callback){
......
callback(error,results);
}
}
//注册到编译容器
Compiler.register(new JspCompiler());
九、开源许可
基于 MIT License 开源,使用代码只需说明来源,或者引用 license.txt 即可。
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago