热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node.js入门:前后端模块的异同

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同。Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量。而浏览器端则通常是裸露的JavaScript代码片段。所以为了解决前后端一致性的

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入Javascript文件的方式与Node.js不同。Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量。而浏览器端则通常是裸露的Javascript代码片段。所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内。以下代码片段抽取自著名类库underscore的定义方式。

(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对象上,如果不存在,则挂载在全局对象上。




推荐阅读
author-avatar
林振萍俊諭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有