Node.js入门:前后端模块的异同
2014-05-18 17:36
627 查看
通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同。Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量。而浏览器端则通常是裸露的JavaScript代码片段。所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内。以下代码片段抽取自著名类库underscore的定义方式。
所以在设计前后端通用的JavaScript类库时,都有着以下类似的判断:
(function () { // Establish the root object, `window` in the browser, or `global` on the server. var root = this; var _ = function (obj) { return new wrapper(obj); }; if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = _; } exports._ = _; } else if (typeof define === 'function' && define.amd) { // Register as a named module with AMD. define('underscore', function () { return _; }); } else { root['_'] = _; } }).call(this);首先,它通过function定义构建了一个闭包,将this作为上下文对象直接call调用,以避免内部变量污染到全局作用域。续而通过判断exports是否存在来决定将局部变量_绑定给exports,并且根据define变量是否存在,作为处理在实现了AMD规范环境下的使用案例。仅只当处于浏览器的 环境中的时候,this指向的是全局对象(window对象),才将_变量赋在全局对象上,作为一个全局对象的方法导出,以供外部调用。
所以在设计前后端通用的JavaScript类库时,都有着以下类似的判断:
if (typeof exports !== "undefined") { exports.EventProxy = EventProxy; } else { this.EventProxy = EventProxy; }即,如果exports对象存在,则将局部变量挂载在exports对象上,如果不存在,则挂载在全局对象上。
相关文章推荐
- Node.js入门:前后端模块的异同
- Node.js入门:模块机制
- node.js入门(二) 模块 事件驱动
- Node.js 入门系列——寻找第三方模块
- nodejs debug 模块入门
- Node.js开发指南——第3章安装Node.js快速入门(四)模块和包
- Node.js的cluster模块——Web后端多进程服务
- Node入门四:node.js的部分核心模块
- Node.js进阶之核心模块https入门
- Node.js入门小记(二)node.js的模块管理
- node.js入门学习之url模块
- Node.js学习笔记【1】入门(服务器JS、函数式编程、阻塞与非阻塞、回调、事件、内部和外部模块)
- Node.js入门:模块机制
- Node.js的模块写法入门
- 突袭HTML5之WebSocket入门2 - 高效服务器Node.js
- Node.js后端框架设计构想
- 我为什么向后端工程师推荐Node.js
- node.js(二) 模块 事件驱动
- node.js入门
- 你应该知道的Node.js扩展模块——Hashish