手机版

跟我学Nodejs (3)-Node.js模块

时间:2021-11-07 来源:互联网 编辑:宝哥软件园 浏览:

介绍和信息通过Node.js的官方API,我们可以看到Node.js本身提供了很多核心模块http://nodejs.org/api/,这些核心模块被编译成二进制文件,可以通过require('模块名')获得;核心模块的加载优先级最高(当有与核心模块同名的模块时会体现出来)(这次主要叫自定义模块)。还有一类模块叫文件模块,可以是JavaScript代码文件(。js作为文件后缀),json格式文本文件(。JSON作为文件后缀),或者编辑后的C/C文件(. Node.js文件后缀)。模块访问模式是通过require('/文件名。后缀')要求('。/文件名。后缀')requrie('./文件名。后缀'),文件后缀可以省略。以“/”开头意味着以绝对路径加载,以“”开头。/“并以”开头./'表示以相对路径加载,同时以'开头。/'表示同一级别目录中的文件。上面提到的文件后缀可以省略。nodejs试图加载的优先级js文件json文件Node文件以计数器为例创建了一个自定义模块

复制的代码如下: var output val=0;//输出值var增量=1;//increment/*设置输出值*/function seoutputval(val){ outputval=val;}/*设置增量*/函数设置增量(increment val){ increment=increment val;}/* output */function printnextcount(){ output val=increment;console . log(OutPutVal);}函数printOutputVal(){ console . log(OutputVal);} exports . SeoutputVal=SeoutputVal;exports . setIncrement=setIncrement;module . exports . printNextCount=printNextCount;在自定义模块示例的源代码示例中,重点是导出和module.exports为外部访问提供接口。让我们称之为看效果。调用自定义模块

复制的代码如下:/* A Node.js文件是一个模块,可以是Javascript代码,也可以是JSON,也可以是编译后的C/C扩展。两个重要的对象:require是从外部获取模块导出并公开模块接口*/var counter=require('。/1 _ modules _ custom _ counter’);Console.log('第一次调用模块[1 _ modules _ custom _ counter]');counter . SeoutputVal(10);//设置counter.setIncrement (10)从10开始计数;//将增量设置为10 counter . printnextcount();counter . printnextcount();counter . printnextcount();counter . printnextcount();/*要求对同一模块的多次调用不会重复加载*/var counter=require('。/1 _ modules _ custom _ counter’);Console.log('第二次调用模块[1 _ modules _ custom _ counter]');counter . printnextcount();您可以发现通过导出和模块公开的方法。当您运行自定义模式调用源代码时,可以访问导出!从示例中可以看出,我通过require('获得了该模块两次。/1 _ modules _ custom _ counter '),但是在第二次引用后调用printNextCount()方法真的是从60开始~ ~ ~因为node.js通过requirerequire多次调用同一个模块,不会重复加载。Node.js会根据文件名缓存所有加载的文件模块,所以不会重新加载。注意:文件名缓存是指实际的文件名,不会被识别为不同的文件,因为传入的路径形式不同。我创建的1_modules_custom_counter文件中有一个printOutputVal()方法。它不通过导出或模块导出提供公共访问方法。如果直接访问它并在1_modules_load文件中运行,会发生什么?答案是:typeerror: object # object没有方法“printoutputval”导出和module.exports,经过上面的例子,exports和module.exports公开的方法都可以访问!既然两者都能达到效果,那肯定是有区别的~ ~ ~我们用一个例子来看看吧!

复制代码如下:var计数器=0;exports . printnextcount=function(){ counter=2;console.log(计数器);} var isEq=(exports===module . exports);console . log(ISeq);2_modules_diff_exports.js文件源代码,新建一个2_modules_diff_exports_load.js文件并调用它

复制代码如下: varcounter=require('。/2 _ modules _ diff _ exports’);counter . printnextcount();调用后的执行结果如上所示。我在文件2_modules_diff_exports_load.js中输出isEq的值(vari seq=(exports===module . exports);),返回的真PS:备注是三个等号,如果不清楚,自己查资料!不要急于下结论,将这两个JS文件分别更改为module.exports对应的代码。复制代码如下://修改后的2_modules_diff_exports.js源代码如下:var counter=0;module . exports=function(){ counter=10;this . printnextcount=function(){ console . log(计数器);} } var isEq=(exports===module . exports);console . log(ISeq);复制的代码如下://修改后的2_modules_diff_exports_load.js文件的源代码如下:varcounter=require('。/2 _ modules _ diff _ exports’);var Counter obj=new Counter();counterobj . printnextcount();

调用后的执行结果如上所示。我在文件2_modules_diff_exports_load.js中输出isEq的值(vari seq=(exports===module . exports);)并返回false,这与之前的结果不一致!PS:不要使用counter . printnextcount();去参观,你只会得到一个虚假的提示。API提供了一个解释,http://nodejs.org/api/.modules.html注意,exports是对module.exports的引用,使其仅适用于增强。如果是导出单个项,比如Constructor,就要用到module.exports直接导出,而不是exports只是module.exports的一个地址引用,Nodejs只会导出module.exports的指向,如果exports的指向发生变化,只是导出不再指向module.exports,所以不会导出引用其他理解,比如:http://www . hacksparrow.com/node-js-exports-vs-module-exports . html http://Zihua . Li/2012通过导出收集的所有属性和方法都分配给模块。当然,这是以module.exports本身没有任何属性或方法为前提的。如果module.exports已经有了一些属性和方法,那么通过导出收集的信息将被忽略。Exports和module.exports涵盖了以上内容,基本了解了exports和module.exports之间的关系和区别,但是如果同时存在exports和module.exports对于printNextCount()方法,会是什么结果呢?

通话结果

从结果可以看出,没有错误报告,这意味着可以这样定义,但最终,module.exportss覆盖了export。虽然结果不会报错,但如果这样使用,在开发中难免会出现一些问题,所以1。最好不要定义模块。导出和导出2。NodeJs分别为。开发人员建议导出的对象应该使用module.exports,很多方法和变量都是导出的。API中提供了其他方法,我就不赘述了。基于上面的例子,我知道module.id自己返回字符串类型的模块标识符。通常,完全解析的文件名module.filename返回字符串类型,完全解析的文件名module.loaded返回bool类型,指示module.parent是否返回引用该模块的模块,module.children返回该模块引用的所有模块对象的数组。

版权声明:跟我学Nodejs (3)-Node.js模块是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。