ES标准的缺陷
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
CommonJS对模块的定义
-
模块引用
- 在node中,通过require()函数来引入外部的模块
- require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,若使用相对路径,必须以.或..开头
- 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
- 在node中,通过require()函数来引入外部的模块
-
模块定义
- 在Node中,一个js文件就是一个模块
- 每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
- 可以通过exports来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为exports的属性即可
- eg.
exports.x="我是x";
- eg.
- 导入模块后,会在导入位置执行导入模块中的代码,只是被导入模块的大部分变量和方法不可见(还有少部分暴露的变量和方法可见)
- 在Node中,一个js文件就是一个模块
-
模块标识
- 我们使用require()引入外部模块时,传入的参数就是模块标识(),我们可以通过模块标识来找到指定的模块。
模块分类
- 核心模块
- 由node引擎提供的模块
- 核心模块的标识就是模块的名字
- 文件模块
- 由用户自己创建的模块
- 文件模块的标识就是文件的路径
CommonJS包规范
CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由包结构和包描述文件两个部分组成。
-
包结构
- 用于组织包中的各种文件
-
包描述文件
- 描述包的相关信息,以供外部读取分析
包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件。
- package.json 描述文件
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试
注意:json文件不能写注释
模块化过程
当node在执行模块中的代码时,他会首先在代码的最顶部,添加如下代码:
function (exports,require,module,__filename,__dirname)
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
-
exports
- 该对象用来将变量或函数暴露到外部
-
require
- 函数,用来引入外部模块
-
module
- module代表的是当前模块本身
-
__filename
- 当前模块的完整路径
-
__dirname
- 当前模块所在文件夹的完整路径
注意exports和module.exports的区别
exports只是一个局部变量,其值为module.exports,即
exports=module.exports
涨知识
在node中有一个全局对象global
,它的作用和网页中window
类似
在全局中创建的变量都会作为global
的 属性保存
在全局中创建的函数都会作为global
的方法保存