您现在的位置是:首页 >其他 >CommonJS规范网站首页其他
CommonJS规范
我这篇文章先来说一下Node.js中的CommonJS模块化规范,
然后以此再说一下ES6中官方的模块化规范,看我这篇文章
介绍
CommonJS是一种服务端模块化规范,node.js就遵守了CommonJS模块化规范。
node.js是CommonJS在服务端的一个实现,webpack打包工具也对CommonJS提供支持。
注意:CommonJS是服务端规范,在浏览器中是不可以使用的
注意:Node.js不是只支持CommonJS规范,还可以支持其他规范,但是默认的规范就是CommonJS规范
基本使用
Node.js中:一个JS文件就代表一个模块,模块内定义的变量、函数、类,只能在这个模块内使用,通过暴露变量和方法供外部使用。
其他模块需要导入此模块时,只需要通过require()来导入即可,下面说一下详细用法。
模块导出
为了实现模块的导出,Node中使用了一个叫做Module的类,每个模块其实就是一个Module的实例,叫做module。
即在每个模块中,都有一个module对象,这个对象代指的就是本模块
module对象上有一个exports对象,这个对象就作为本模块向外提供的对象,所有需要导出的对象都需要挂载到module.exports对象身上
const name = 'zhangsan'
function say(){
console.log('Say')
}
module.exports.name = name
module.exports.say = say
在每个模块中,还有一个对象就是exports对象,其中module.exports就指向exports对象
console.log(module.exports === exports)
// true
所以我们只需要把要提供出的的变量、方法挂载到exports身上就可以了
exports.name = 'zhangsan'
exports.say = function () {
console.log('Hello')
}
模块的导入
require()方法是Node中内置的一个方法,用来导入模块的。
在本模块中,如果需要导入其他模块,直接使用require()
就可以了,必须要用一个对象来接收
- 如果要导入本地的模块,即自定义模块,则需要给出模块的路径
- 如果是Node.js中内置的模块或第三方模块,只需要给出模块名称就好了
先来看一下,导入内置模块或第三方模块,直接给出模块名称
const http = require('http')
如果需要导入自定义模块,则需要给出模块的路径名称
const myModule = require('./module/student.js')
后缀名.js
可以省略,像这样
const myModule = require('./module/student')
在使用require()导入模块时,用一个对象来接收,这个对象本质上就是那个模块中的exports对象,所以以此来调用模块向外提供的变量、方法
require()方法内部有一个cache缓存,里面记录了本模块导入过的所有的自定义模块。
在导入模块时,会先检查缓存中是否已经加载过了,如果已经加载过了,那么就不会重复加载。
如果没有加载过,那么加载进来,并写入缓存。
CommonJS规范的缺点
加载模块是同步的,意味着只有等到要导入的模块加载完毕后,当前模块中的内容才会被加载运行。
其他JS规范
AMD、CMD是浏览器端的模块规范,但也都不是JS官方的标准规范,需要导入其规范的依赖才能使用对应的规范,目前已经很少使用了。