前言
在正常的 Node.js 开发中,模块化是一个至关重要的概念。Node.js采用的是CommonJS模块规范,我们在平常引入时,是否注意模块引入的策略。在本文中,主要说明Node.js中的模块化加载机制,包括CommonJS模块的加载规则、内置模块的使用方式以及第三方模块的引入方法。
1. CommonJS 模块规范
CommonJS是一种用于组织代码结构的规范,它定义了模块的导入(require)和导出(exports)方式。在Node.js中,我们可以使用require函数来引入其他模块,并使用exports对象来导出当前模块的功能。
例如:
javascript
// 导入模块
const otherModule = require('./otherModule');
// 导出功能
module.exports = 'xxx'
2. 模块加载规则
在Node.js中,模块的加载是通过路径来进行的。当使用require函数加载模块时,Node.js会按照一定的规则来查找模块文件:
- 如果路径是绝对路径或者相对路径,则直接根据路径加载模块
- 如果路径不带文件后缀名(例如
.js
、.json
等),Node.js会按照以下顺序尝试添加后缀名并查找对应的文件:.js
、.json
、.node
。
- 如果路径不带文件后缀名(例如
- 如果路径没有后缀名,则尝试读取文件夹
- Node.js会尝试加载该文件夹下的
package.json
文件,并读取其中的main
字段指定的入口文件。 - 如果没有
package.json
文件或者main
字段不存在,则默认加载该文件夹下的index.js
文件。
- Node.js会尝试加载该文件夹下的
如果是非绝对路径或者相对路径。
- 内置模块
- Node.js内置了许多核心模块,模块可以直接使用
- 第三方模块
- npm安装第三方模块,读取
node_modules
下的模块,如果没有,则读取全局的模块。
- npm安装第三方模块,读取
2.1 文件
当使用相对路径或者绝对路径时,看一个案例:
读取文件index.js
javascript
const a = require('./a')
console.log(a)
2.1.1 文件 a
css
我是a,无后缀
2.1.2 文件a.js
js
module.exports = '我是a.js'
2.1.3 文件a.json
json
{
"name":"我是a.json"
}
2.2 文件夹
当使用相对路径或者绝对路径时,如果没有对应的文件,会默认查找有没有对应文件夹。
看一个案例:
读取文件index.js
javascript
const a = require('./a')
console.log(a)
2.2.1 有package.json
指定main为test.js文件
json
"main": "test.js",
test.js
ini
module.exports = '我有package.json'
2.2.2 无package.json
文件夹a下,新建index.js
ini
module.exports = '我没有package.json'
2.3 内置模块
Node.js内置了许多核心模块,这些模块可以直接使用,无需额外安装。例如fs
、http
等模块都是Node.js内置的模块,可以通过require函数直接引入使用。当使用require加载内置模块时,Node.js会自动查找并加载对应的模块文件,无需指定路径。
javascript
const fs = require('fs');
2.4 第三方模块
除了内置模块之外,我们还可以使用第三方模块来扩展Node.js的功能。在Node.js中,通过npm可以方便地安装和管理第三方模块。当我们需要使用第三方模块时,只需要在项目中执行npm install <module>
命令即可安装对应的模块,然后就可以像使用内置模块一样通过require函数引入并使用。
javascript
const axios = require('axios');
Node.js会在项目根目录下的node_modules
文件夹中查找并加载第三方模块,无需手动指定模块的路径。
总结
最后总结一下:
-
模块加载通过绝对或相对路径
- 则直接根据路径名称加载模块,如(a、a.js、a.json等)。
- 如果路径没有后缀名,则尝试读取文件夹下的
package.json
文件,或默认加载该文件夹下的index.js
文件。
-
非绝对或相对路径
- 如果是内置模块,则直接加载内置模块。
- 如果是第三方模块,则在项目根目录下的
node_modules
文件夹中查找并加载。
如有错误,请指正O^O!