![Vue.js+Node.js全栈开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/214/36862214/b_36862214.jpg)
上QQ阅读APP看书,第一时间看更新
4.2 模块加载原理与加载方式
Node.js中的模块可以分为原生模块和文件模块。在Node.js中可以通过require方法导入模块、exports方法导出模块。
提示
本节多用“方法”(Method)一词而非“函数”。
4.2.1 require导入模块
对于原生模块(如http),只需要使用require('http')导入这个模块并将其赋值给一个变量,即可使用这个模块导出的属性、方法(即函数)。
【代码4-1】
![](https://epubservercos.yuewen.com/2356CA/19549640601519906/epubprivate/OEBPS/Images/Figure-P91_31335.jpg?sign=1739255004-RTzcsiVM2Z25kRfX973k7bnE0dvTFjsV-0-8f4d44cdde4e6ccc26d45786a23b0be9)
对于文件模块,可以使用“./”前缀来指代当前路径,从而使用相对路径来加载模块。加载模块时,可以省略.js扩展名。例如,在同级的文件夹node中有一个名为myModule.js的文件模块,可以这样导入:
const myModule = require('./node/myModule');
在4.1节中利用NPM下载了underscore模块,那么在node_modules文件夹的同级目录可以这样加载:
const underscore = require('./underscore');
这是因为Node.js内部会自动查找加载node_modules文件夹下的模块。
这里有必要了解一下Node.js尝试路径的顺序。例如,某个模块的绝对路径是home/hello/hello.js,在该模块中导入其他模块,写法为require("me/first"),则Node.js会依次尝试使用路径:
/home/hello/node_modules/me/first /home/node_modules/me/first node_modules/me/first
4.2.2 exports导出模块
一个模块中的变量和方法只能用于这个模块,如果想要与其他模块共享一些方法、属性等,就可以用exports导出一个对象。这个对象可以包含想要与其他模块共享的方法和属性等。
假设一个模块中有两个想要与其他模块共享的方法,一个用于数组去重,一个用于计算数组之和,可以像下面这样导出:
【代码4-2】
![](https://epubservercos.yuewen.com/2356CA/19549640601519906/epubprivate/OEBPS/Images/Figure-P92_31337.jpg?sign=1739255004-xmZ3IeZbeMXYHCZddauKB3LBMA7ohWJP-0-b9cf779b9663f5e798dfa9452f52c9c4)
假设将这个模块保存为exports.js,同级目录下通过require使用该模块,代码如下:
【代码4-3】
![](https://epubservercos.yuewen.com/2356CA/19549640601519906/epubprivate/OEBPS/Images/Figure-P92_31338.jpg?sign=1739255004-dVzLzI2EePBKZWtccjXT5Le1eHaM4ULc-0-683ca1f15d8f25d03e34b056ceff0c57)
运行这段代码后,可以在控制台看到输出数组[1, 2, 3]和数字11,说明模块导入成功,如图4.8所示。
![](https://epubservercos.yuewen.com/2356CA/19549640601519906/epubprivate/OEBPS/Images/Figure-P92_5846.jpg?sign=1739255004-uo4unPrmOADgDXyhDhqRP2nArl4NxhWk-0-46b7185e24f2eb2dba662811c4e6e5de)
图4.8 导入模块