简介:本笔记记录node.js采用的CommonJS的模块规范。
-
common.js规范认识
- node应用由模块组成,采用的CommonJS的模块规范。
- 其中每个node.js文件就是一个模块,拥有自己独立的作用域,变量,以及方法等,对其它的模块都不可见。
- CommonJS规范规定,每个模块内部,module变量代表当前模块。
- 这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。
- 加载某个模块,其实是加载该模块的module.exports属性,其中通过require方法加载模块。
-
common.js规范为两种模块
- 系统自带的模块
- fs文件模块,http服务器模块
- 第三方模块
- 通过cnpm安装的模块,比如jquery,vuex,express等模块,之后通过require方法引入模块。
- 自己写的自定义模块
- 系统自带的模块
-
node模块的module对象理解
- module.exports属性
- module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
- module.exports使用格式:module.exports={[开放的变量,以及方法等]}。
- exports变量
- node为每一个模块提供了一个exports变量(可以说是一个对象),指向
module.exports。这相当于每个模块中都有一句这样的命令 var exports = module.exports; - exports使用格式:exports.[属性名]=[开放的变量,以及方法等]。
- node为每一个模块提供了一个exports变量(可以说是一个对象),指向
- 注意: 如果这两者不好区分,那就放弃 exports,只用 module.exports 就好。
- module.exports属性
-
node模块在其它文件中的引入
-
通过require命令引入模块
-
基本用法require命令用于加载模块文件,相当于读入并执行一个js文件,然后返回该模块的exports对象,没有发现指定模块,则就会报错。
-
-
node模块中打印应用
// 1.模块中console的应用,文件名04-model_use.js
// node模块中不存在alert的API接口,因此无法使用alert
console.log("这是node模块中console应用!");
文件名03-conmmon.js引入04-model_use.js的模块
require('./04-model_use');
- node模块中变量的应用
// 2.node模块中变量的应用,文件名04-model_use.js
let varia = "这是node模块中变量的应用!";
exports.NewVaria = varia;
// 文件名03-conmmon.js引入04-model_use.js的模块中的变量
let read = require('./04-model_use');
console.log(read); //得到的read变量是一个方法,需要进行解构才能得到值
// 解构则是将read替换为{NewVaria}
- node模块中函数的应用
// 3.node模块中方法的应用
// 通过rest参数接受数字保存为数组,之后对数组进行reduce方法累加
function sum( ...rest ){
return [...rest].reduce( (a,b) => a+b );
}
exports.sum = sum;
// 文件名03-conmmon.js引入04-model_use.js的模块中的方法
let fun = require('./04-model_use');
console.log( fun.sum(10,20,30) ); // 输出求和结果60
- node模块的缓存功能
- node模块如果在某地方引入模块后,在该地方给引入的模块新添加属性,那么之后第二次引入则会产生缓存,即会出现新添加的属性。
- 为了解决模块缓存的问题,需要在模块中添加delete去删除模块缓存。
// 在03-model_cache.js模块文件中
let num1 = 123;
let num2 = 456;
module.exports = {
num1,num2
};
// 删除缓存的值,下次被引入的时候,不会产生缓存
delete require.cache[module.filename];
// 在04-require03model.js模块文件中
// 引入模块03-model_cache.js
let data = require('./03-model_cache');
console.log(data); //data结果{num1: 123, num2: 456}
// 如果给data添加新的属性后
data.num3 = 789;
// 添加后,打印data,会发现第一次引入的模块03-model_cache.js会出现num3的属性缓存
console.log(data); //data结果{num1: 123, num2: 456, num3: 789}
// 在模块中添加删除缓存后,第二次引入的模块03-model_cache.js则不会会出现num3的属性缓存
let data1 = require('./03-model_cache');
console.log(data1); //data1的结果:{num1: 123, num2: 456}