来源:自学PHP网 时间:2014-12-14 21:15 作者: 阅读:次
[导读] Node在整个环境中最重要的工作之一就是代理这些业务接口,以方便前端(Node端和浏览器端)整合数据做页面渲染。如何做好代理工作,使得前后端开发分离之后,仍然可以在流程上无缝衔...
前言 使用Node做前后端分离的开发模式带来了一些性能及开发流程上的优势, 但同时也面临不少挑战。在淘宝复杂的业务及技术架构下,后端必须依赖Java搭建基础架构,同时提供相关业务接口供前端使用。Node在整个环境中最重要的工作之一就是代理这些业务接口,以方便前端(Node端和浏览器端)整合数据做页面渲染。如何做好代理工作,使得前后端开发分离之后,仍然可以在流程上无缝衔接,是我们需要考虑的问题。本文将就该问题做相关探讨,并提出解决方案。 由于后端提供的接口方式可能多种多样,同时开发人员在编写Node端代码访问这些接口的方式也有可能多种多样。如果我们在接口访问方式及使用上不做统一架构处理,则会带来以下一些问题: 1. 每一个开发人员使用各自的代码风格编写接口访问代码,造成工程目录及编码风格混乱,维护相对困难。 1. 不同的开发者对于接口访问代码编写方式统一,含义清晰,降低维护难度。 ModelProxy工作原理图及相关开发过程图览 在上图中,开发者首先需要将工程项目中所有依赖的后端接口描述,按照指定的json格式,写入interface.json配置文件。必要时,需要对每个接口编写一个规则文件,也即图中interface rules部分。该规则文件用于在开发阶段mock数据或者在联调阶段使用River工具集去验证接口。规则文件的内容取决于采用哪一种mock引擎(比如 mockjs, river-mock 等等)。配置完成之后,即可在代码中按照自己的需求创建自己的业务model。 下面是一个简单的例子: 【例一】 第一步 在工程目录中创建接口配置文件interface.json, 并在其中添加主搜接口json定义 复制代码 代码如下: { "title": "pad淘宝项目数据接口集合定义", "version": "1.0.0", "engine": "mockjs", "rulebase": "./interfaceRules/", "status": "online", "interfaces": [ { "name": "主搜索接口", "id": "Search.getItems", "urls": { "online": "http://s.m.taobao.com/client/search.do" } } ] } 第二步 在代码中创建并使用model 复制代码 代码如下: // 引入模块 var ModelProxy = require( 'modelproxy' ); // 全局初始化引入接口配置文件 (注意:初始化工作有且只有一次) // 创建model 更多创建模式请参后文 // 使用model, 注意: 调用方法所需要的参数即为实际接口所需要的参数。 ModelProxy的功能丰富性在于它支持各种形式的profile以创建需要业务model: 使用接口ID创建>生成的对象会取ID最后'.'号后面的单词作为方法名 复制代码 代码如下: ModelProxy.create( 'Search.getItem' ); 使用键值JSON对象>自定义方法名: 接口ID 复制代码 代码如下: ModelProxy.create( { getName: 'Session.getUserName', getMyCarts: 'Cart.getCarts' } ); 使用数组形式>取最后 . 号后面的单词作为方法名 复制代码 代码如下: ModelProxy.create( [ 'Cart.getItem', 'Search.getItem', 'Search.suggest', 'Session.User.getName' ] ); 前缀形式>所有满足前缀的接口ID会被引入对象,并取其后半部分作为方法名 复制代码 代码如下: ModelProxy.create( 'Search.*' ); 同时,使用这些Model,你可以很轻易地实现合并请求或者依赖请求,并做相关模板渲染 【例二】 合并请求 复制代码 代码如下: var model = new ModelProxy( 'Search.*' ); // 合并请求 (下面调用的model方法除done之外,皆为配置接口id时指定) 【例三】 依赖请求 复制代码 代码如下: var model = new ModelProxy( { getUser: 'Session.getUser', getMyOrderList: 'Order.getOrder' } ); // 先获得用户id,然后再根据id号获得订单列表 model.getUser( { sid: 'fdkaldjfgsakls0322yf8' } ) .done( function( data ) { var uid = data.uid; // 二次数据请求依赖第一次取得的id号 this.getMyOrderList( { id: uid } ) .done( function( data ) { console.log( data ); } ); } ); 此外ModelProxy不仅在Node端可以使用,也可以在浏览器端使用。只需要在页面中引入官方包提供的modelproxy-client.js即可。 复制代码 代码如下: <!-- 引入modelproxy模块,该模块本身是由KISSY封装的标准模块--> <script src="modelproxy-client.js" ></script> <script type="text/javascript"> KISSY.use( "modelproxy", function( S, ModelProxy ) { // !配置基础路径,该路径与第二步中配置的拦截路径一致! // 且全局配置有且只有一次! ModelProxy.configBase( '/model/' ); // 创建model 同时,ModelProxy可以配合Midway另一核心组件Midway-XTPL一起使用,实现数据和模板以及相关渲染过程在浏览器端和服务器端的全共享。关于ModelProxy的详细教程及文档请移步https://github.com/purejs/modelproxy 总结 ModelProxy以一种配置化的轻量级框架存在,提供友好的接口model组装及使用方式,同时很好的解决前后端开发模式分离中的接口使用规范问题。在整个项目开发过程中,接口始终只需要定义描述一次,前端开发人员即可引用,同时使用River工具自动生成文档,形成与后端开发人员的契约,并做相关自动化测试,极大地优化了整个软件工程开发过程。 【注】River 是阿里集团研发的前后端统一接口规范及相关工具集合的统称 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com