CommonJS规范
我这篇文章先来说一下Node.js中的CommonJS模块化规范,
然后以此再说一下ES6中官方的模块化规范,看我这篇文章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官方的标准规范,需要导入其规范的依赖才能使用对应的规范,目前已经很少使用了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!