node引入模块步骤,nodejs中的模块以及作用
本文带你了解CommonJs规范和节点的模块机制,并介绍节点实现CommonJs规范的基本过程。希望对你有帮助!
node.js速度课程简介:进入学习
在CommonJs规范提出之前,Javascript没有模块系统,这意味着我们很难开发大规模的应用程序,因为组织代码会很困难。
什么是CommonJs规范
首先,CommonJs不是Node独有的。CommonJS是一个模块规范,它定义了如何引用和导出模块。Nodejs只是实现了这个规范。CommonJS模块规范主要分为三个部分:模块引用、模块定义和模块标识。
模块引用
模块引用意味着我们可以通过require引入其他模块。
const { add }=require(。/add’);
const result=add(1,2);模块定义
文件是一个模块,模块中提供了两个变量,即模块和导出。Module是当前模块本身,exports是要导出的内容,exports是模块的一个属性,即exports是module.exports其他模块通过require导入的内容是module.exports的内容
//add.js
exports.add=(a,b)={
返回a b;
}模块标识
模块标识符是require中的内容,比如require(。/add’),模块标识符为。/添加。
CommonJS构建的这一套模块导入导出机制,使得用户可以方便地构建大型应用,而无需考虑变量污染。
Node的模块实现
Node实现了CommonJs规范,并添加了一些它需要的特性。为了实现CommonJs规范,Node主要做了以下三件事:
路径分析
文件位置
编译并执行
路径分析
执行require()时,require收到的参数是模块标识符,node通过模块标识符进行路径分析。路径分析的目的是通过模块标识符找到这个模块所在的路径。首先,node的模块分为两类,即核心模块和文件模块。核心模块是node自带的模块,文件模块是用户自己编写的模块。同时,文件模块又分为相对路径文件模块、绝对路径文件模块和非路径文件模块(如express)。
当节点找到一个文件模块时,它将编译、执行并缓存该模块。总的原则是用这个模块的完整路径作为键,编译后的内容作为值。第二次引入该模块时,不需要进行路径分析、文件定位、编译和执行这些步骤,编译后的内容可以直接从缓存中读取。
//缓存模块示意图:
const cachedModule={
/Usr/file/src/add.js: add.js编译内容,
Http : Node Node自带的HTTP模块的编译内容,
Express :非路径自定义文件模块express的编译内容
//.
}在搜索require导入的模块时,搜索模块的顺序是检查模块是否已经存在于缓存中。如果缓存中没有核心模块,则搜索文件模块。路径形式的文件模块很容易找到,根据相对或绝对路径可以得到完整的文件路径。找非路径形式的自定义文件模块会比较麻烦。节点将从node_modules文件夹中查找该文件。
node_modules目录在哪里?比如我们目前执行的文件是/Usr/file/index . js;
/**
*/Usr/file/index . js;
*/
const { add }=require( add );
const result=add(1,2);在本模块中,我们介绍了一个add模块,它不是核心模块,也不是路径形式的文件模块。那么这个时候怎么才能找到这个add模块呢?
该模块有一个paths属性,查找添加模块的路径在paths属性中。我们可以输入这个属性,看一看:
/**
*/Usr/file/index . js;
*/
console . log(module . path);我们可以通过执行文件目录中的node index.js来打印出路径的值。paths中的值是一个数组,如下所示:
[
/Usr/file/node_modules ,
/Usr/node_modules ,
/node_modules ,
]也就是说,Node将依次从上述目录中查找模块add。原理类似于原型链。从当前执行文件的同级目录的node_modules文件夹开始。如果没有找到node_modules目录或者没有这样的目录,继续搜索上级。
文件定位
路径分析和文件位置一起使用。文件标识符可以不带后缀,也可以是路径分析找到的目录或包。此时,需要一些额外的处理来定位特定的文件。
文件扩展名分析
const { add }=require(。/add’);例如,在上面的代码中,文件标识符没有扩展名。这时,节点会找出是否有。js,json和。依次节点文件。
目录和包分析
和上面的代码一样。你通过什么发现的。/add可能不是文件,而是目录或包(通过判断add文件夹中是否有package.json文件来判断是目录还是包)。此时,文件定位的步骤如下:
检查是否有package.json文件。将package.json中main字段的值作为文件读取,但不要作为文件在目录中查找index(依次查找index.js、index.json、index.node)。如果package.json中没有main字段,那么你也会把index作为一个文件,然后分析扩展名,找到对应后缀的文件。
模块编译
我们在开发中遇到的主要模块是json模块和js模块。
json模块编译
当我们需要一个json模块的时候,其实Node会帮助我们使用fs.readFilcSync读取相应的json文件来获取json字符串,然后调用json.parse来解析json对象,赋给module.exports,然后交给require。
js模块编译
例如,当我们需要一个js模块时
//index.js
const { add }=require(。/add’);//add.js
exports.add=(a,b)={
返回a b;
}这个时候发生了什么?为什么我们可以使用变量模块,直接在模块中导出和要求。这是因为Node在编译js模块的时候,把js模块的内容从头到尾打包了。
例如,在实际编译时,模块add.js将被打包成与此类似的结构:
(功能(要求、导出、模块){
exports.add=(a,b)={
返回a b;
}
返回模块. exports;
}) (require,module.exports,module),也就是我们写的js文件会打包成一个函数,我们写的只是这个函数里的内容,Node后续的打包过程对我们是隐藏的。该函数支持传入一些参数,包括require、exports和module。
当js文件被编译时,它将被执行。节点会将相应的参数传递给这个函数,然后执行它,并将module.exports值返回给require函数。
以上是节点实现CommonJs规范的基本流程。
更多关于node的信息,请访问:nodejs教程!以上是为了深入理解Node的模块机制,说说模块实现过程的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。