Nodejs模块化
ECMAScript标准的缺陷
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
如果程序设计的规模达到了一定程度,则必须对其进行模块化,模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制。CommonJS的模块功能可以帮我们解决该问题。
Nodejs实现了是CommonJS规范,但是也对规范做了一些取舍
介绍
- 什么是模块化与模块?
将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用
- 什么是模块化项目?
编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目
- 模块化好处
- 防止命名冲突
- 高复用性
- 高维护性
模块暴露数据
可以通过下面的操作步骤
-
创建me.js
//声明函数 function tiemo(){ console.log('贴膜....'); } //暴露数据 module.exports = tiemo;
-
创建index.js
//导入模块 const tiemo = require('./me.js'); //调用函数 tiemo();
模块暴露数据的方式有两种:
module.exports = value
exports.name = value
使用时有几点注意:
module.exports
可以暴露任意数据- 不能使用
exports = value
的形式暴露数据,模块内部module
与exports
的隐式关系exports = module.exports = {}
,require
返回的是目标模块中module.exports
的值
导入(引入)模块
在模块中使用require
传入文件路径即可引入文件
const test = require('./me.js');
require 使用的一些注意事项:
-
对于自己创建的模块,导入时路径建议写相对路径,且不能省略
./
和../
-
js
和json
文件导入时可以不用写后缀,c/c++
编写的node
扩展文件也可以不写后缀,但是一般用不到 -
如果导入其他类型的文件,会以
js
文件进行处理 -
如果导入的路径是个文件夹
- 首先检测该文件夹下
package.json
件中main
属性对应的文件,如果存在则导入,反之如果文件不存在会报错 - 如果
main
属性不存在,或者package.json
不存在,则会尝试导入文件夹下的index.js
和index.json
- 如果还是没找到,就会报错
- 首先检测该文件夹下
-
导入
node.js
内置模块时,直接require
模块的名字即可,无需加./
和../
导入模块的基本流程
require
导入自定义模块的基本流程
- 将相对路径转为绝对路径,定位目标文件
- 缓存检测
- 读取目标文件代码
- 包裹为一个函数并执行(自执行函数)。通过
arguments.callee.toString()
查看自执行函数 - 缓存模块的值
- 返回
module.exports
的值