Node.js通用模块的封装方法
在Node.js,模块的加载和执行包,使变量在模块文件不会污染全局变量和与他人冲突关闭。前端模块通常是我们的开发人员把模块代码放在壁橱中,以避免与其他人发生冲突。
如何封装Node.js和前端通用模块,我们可以参考Underscore.js实施。这是一个功能的Node.js和前端模块。
复制代码代码如下所示:
为下面的对象创建一个安全引用,以便在下面使用。
var =功能(obj){ _
如果(obj instanceof _)返回的对象;
如果(!(这是_))返回(obj)_;
这_wrapped =目标;
};
导出下划线的对象为
向后兼容旧的。如果我们在
浏览器添加 / /,为全局对象通过一个` _ `字符串标识符,
用于关闭编译器高级模式。
如果(typeof出口!= 'undefined){
如果(typeof模块!= = 'undefined'module。出口){
module.exports _出口= =;
}
_ = _出口;
{人}
_ = _根;
}
通过判断出口存在确定的局部变量_分配到出口(需要)与旧的API的兼容性,如果在浏览器中,通过一个字符串标识符_全局对象;完全封闭:
复制代码代码如下所示:
(函数(){())
基线安装
根在浏览器中建立对象窗口或服务器上的导出。
var =;
为下面的对象创建一个安全引用,以便在下面使用。
var =功能(obj){ _
如果(obj instanceof _)返回的对象;
如果(!(这是_))返回(obj)_;
这_wrapped =目标;
};
导出下划线的对象为
向后兼容旧的。如果我们在
浏览器添加 / /,为全局对象通过一个` _ `字符串标识符,
用于关闭编译器高级模式。
如果(typeof出口!= 'undefined){
如果(typeof模块!= = 'undefined'module。出口){
module.exports _出口= =;
}
_ = _出口;
{人}
_ = _根;
}
}:调用(此);
一封是通过函数定义和调用了,(这)是调用的函数被称为这个对象的内部变量在避免污染全球范围。在浏览器中,这指的是全局对象(窗口对象),该_变根。_在全局对象,外部调用。
罗冲,类似于Underscore.js,也采用了类似的计划,只与兼容的模块加载兼容AMD:
复制代码代码如下所示:
(函数(){())
作为安全参考 / *预ES5环境`定义` *。
VaR的定义;
用于确定值是否为语言类型对象的值。
无功objecttypes = { {
布尔:false,
函数:真的,
对象:真的,
数字:假,
字符串:false,
未定义:false
};
用作对全局对象的引用
var =根(objecttypes { typeof窗口}窗口)| |这;
检测自由变量导出
无功freeexports = objecttypes {类型}出口出口!exports.nodetype出口;
检测自由变量模块
var = objecttypes {类型}自由模模块模块!module.nodetype模块;
检测流行推广` CommonJS模块。出口` / * * /
无功moduleexports =自由模freemodule.exports = freeexports freeexports;
-------------------------------------------------------------------------- / * * /
暴露/破折号
_(var = runincontext);
建立 / / AMD的一些优化,如r.js,检查状态如下:
如果(typeof define'function'typeof define.amd define.amd = = = = 'object){
即使在AMD加载程序出现时,也可以将Lo破折号暴露到全局对象中
Case Lo Dash是由第三方脚本注入的,不是有意的。
作为模块加载。可以在Lo破折号中恢复全局赋值。
模块(`任何) /的方法。
_ = _根;
作为一个匿名模块,可以通过路径映射来定义它,它可以是
作为下划线模块引用
定义(函数(){())
返回_;
});
}
在定义中检查导出后,一个构建优化器添加一个导出对象
如果(freeexports自由模){
Node.js或ringojs / /
如果(moduleexports){
(freemodule.exports = = _ _ _);
}
独角犀牛需要 / /
{其他
freeexports _ = _;
}
}
{其他
浏览器或犀牛
_ = _根;
}
}调用(这个);
看一下js的包关闭的主要代码:
复制代码代码如下所示:
函数(未定义){
VaR的时刻;
Nodejs / /检查为
Var hasModule(typeof =模块= = 'undefined'module。出口!);
/ ************************************
暴露的时刻
************************************ /
功能全球(反对){
VaR警告= false,local_moment =时刻;
/ *全球*德:假
如果(typeof德!= 'undefined){
返回;
}
'这意味着'窗口'在这里浏览器,或'全球'在服务器上
用一个字符串标识符将时刻作为一个全局对象添加,
用于关闭编译器高级模式
如果(反对){
this.moment =函数(){
如果(!警告控制台控制台。警告){
警告=真实;
Console.warn(
通过全局范围访问时间+
不,和将被删除,在即将到来的+
释放;
}
返回local_moment.apply(null,参数);
};
{人}
这一'moment} = {;
}
}
模块定义 / / CommonJS
如果(hasmodule){
module.exports =时刻;
全球(真的);
} else if(typeof定义为功能的定义。AMD){
定义(时刻
如果(模块配置(NoGlobal)!= TRUE){
用户提供的 / /如果noglobal他意识到全球
全球(模块(配置)。noglobal =未定义);
}
返回的时刻;
});
{人}
全球();
}
}:调用(此);
正如你可以看到从上面的例子中,下面的逻辑可以用来封装Node.js和前端通用模块:
复制代码代码如下所示:
如果(typeof出口!=未定义的){
导出;
{人}
这个,***;
}
也就是说,如果导出对象存在,本地变量加载在导出对象上,如果它不存在,则将它加载到全局对象上。如果添加了ADM规范的兼容性,则再加一句话:
复制代码如下:如果(typeof定义为功能的定义。AMD){ }