模块机制
# 模块机制
[TOC]
# 一、CommonJS规范
- 目标:为了构建JavaScript在包括Web服务器,桌面,命令行工具,及浏览器方面的生态系统。
# 1.1 简单模块定义
// circle.js
const PI = Math.PI
exports.area = (r) => {
return PI * r * r
}
exports.circumference = (r) => {
return 2 * PI * r
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
// app.js
const circle = require('./circle.js')
console.log('The area of a circle of radius 4 is' + circle.area(4))
1
2
3
2
3
# 1.2 模块载入策略
- Node.js的模块分为两类,一类为原生模块(核心),一类为文件模块。
- Node.js对原生模块和文件模块都进行了缓存,于是在第二次require时,是不会有重复开销的。
# 1.2.1 原生模块
- 原生模块在Node.js源代码编译的时候编译进了二进制执行文件,加载的速度最快。
# 1.2.2 文件模块
- 以后缀不同分成三类模块
- .js:通过fs模块同步读取js文件并编译执行。
- .node:通过C/C++进行编写的Addon,通过dlopen方法进行加载。
- .json:读取文件,调用JSON.parse解析加载。
# 1.2.3 require方法中的文件查找策略
- 优先级
- 从文件模块缓存中加载
- 从原生模块加载
- 从文件加载
# 二、包结构
JavaScript缺少包结构,CommonJS致力于改变这种现状,于是定义了包的结构规范。
而NPM(包管理器)的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题。
- 一个符合CommonJS规范的包应该是如下这种结构
- package.json:包描述文件。
- bin:用于存放可执行二进制文件的目录。
- lib:用于存放JavaScript代码的目录。
- doc:用于存放文档的目录。
- test:用于存档单元测试用例的代码。