1)ES6之前,ECMAScript存在以下几个问题,没有模块系统,官方标准库少/标准接口少,缺乏包管理系统。
2)CommonJS规范,主要是为了弥补JavaScript没有模块化标准的缺陷,CommonJS对模块的定义:模块引用,模块定义,模块标识。
3)从文件角度看, 每个JS文件就是一个模块
4)从结构看, 多个JS文件之间可以相互require,共同实现了一个功能,这整体上也是一个模块。引入外部模块要加上 ./ 或者 …/ 。
5)在Node.js中,一个模块中定义的变量、 函数等, 都只能在这个文件内部有效。
6)当需要从此JS文件外部引用这些变量,、函数时,必须使用exports进行暴露,使用者通过require引用。
当我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
分类:
1)内建模块:底层由C++编写,开发中很少会用到, 但核心模块会调用内建模块。
2)文件模块:由用户自己创建的模块,标识:文件的路径(绝对路径,相对路径)。
3)核心模块:由node引擎提供的模块,由node_modules提供的模块,标识:模块的名字:http,global,fs。
1)原生模块: http、path、fs、util、events 编译成二进制,加载速度最快,原生模块是通过名称来加载。
2)文件模块:在硬盘的某个位置,加载速度非常慢,文件模块通过名称或路径来加载;文件模块的后缀有三种:1.后缀名为.js的JavaScript脚本文件,需要先读入内存再运行 2.后缀名为.json的JSON文件,需要借助fs模块读入内存,转化成JSON对象 3.后缀名为.node的经过编译后的二进制C/C++扩展模块文件,可以直接使用(一般自己写的通过路径来加载,其他人写的通过名称去当前目录或全局的node_modules下面去找)。
3) 第三方模块:如果require函数只指定名称,则视为从node_modules下面加载文件,这样的话,我们可以移动模块而不需要修改引用的模块路径;第三方模块的查询路径包括module.paths和全局目录
补充 :
arguments (获取函数的所有实参)
arguments.callee(返回函数本身)
arguments.callee.caller(返回调用指定函数的函数)
1) 当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码:
function (exports, require, module, __filename, __dirname) {
}
2) 所以模块中的代码都是包装在一个函数中执行的,并且在函数执行的同时传递进了5个实参:
exports: 该对象用来将函数内部的局部变量或局部函数暴露到外部。
require: 用来引入外部的模块。
module: 代表的是当前模块本身, exports就是module的属性; 我们既可以使用 exports 导出,也可以使用module.exports导出。
__filename: 当前模块的完整路径。
__dirname: 当前模块所在文件夹的完整路径。
3)一个模块就是一个函数, 即一个文件就是一个函数。
1)exports只能使用.语法来向外暴露内部变量,exports.xxx = xxx;
2)module.exports既可以通过.语法,也可以直接赋值一个对象 module.exports.xxx = yyy;
module.exports = {xxx: yyy};
3)exports类似于一根指针,指向module.exports。
如果将exports直接赋值一个对象,即exports = obj,会修改exports的指向,此时向外暴露的内容为一个空对象。
1)在Node.js中,可以通过包来对一组具有相互依赖关系的模块进行统一管理,通过包可以把某个独立功能封装起来 。
2)每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。
3)npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
1)概念:安装完node之后只能使用Node语言特性及核心函数,我们还需要一个系统来下载、安装和管理第三方模块。在 Node看这个系统被称为Node包管理器(Node Package Manager,NPM)
2)npm提供的功能:公共注册服务,用户可以把自己写的包上传到服务器上;命令行下载工具,用户可以通过npm命令把别人写的包下载到自己电脑上,还可以管理自己模块依赖的其它模块。
3)npm命令:
npm install <package-name>
npm i jquery
npm install <package name>@<version spec>
npm i jQuery@3.1
npm i mime@2.x
npm uninstall <package name>
npm update <package name>
4)包的安装模式:
npm install <package-name> -g
注册npm账号: https://www.npmjs.com/
登录:npm login
发布:npm publish
1)概念:yarn 是一个依赖管理工具,它能够管理你的代码,并与全世界的开发者分享代码,代码是通过包(有时也被称为模块)进行共享的, 在每一个包中包含了所有需要共享的代码,另外还定义了一个package.json文件,用来描述这个包(号称比npm更加安全)。
2)初始化一个新的项目:
yarn init
3)添加一个依赖包:
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
4)更新一个依赖包:
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
5)删除一个依赖包:
yarn remove [package]
6)安装所有的依赖包:
yarn
yarn install