1、模块化
(1)遵守固定的规则,把一个大文件拆成独立并相互依赖的多个小模块
(2)好处:复用性、可维护性、可实现按需加载
2、Node.js中模块的分类
(1)内置模块(官方提供:http、fs、path)
(2)自定义模块(用户自己创建的js文件)
(3)第三方模块(由第三方开发的模块,使用前需要先下载)
3、操作模块
(1)加载模块:使用require()方法,在使用require方法其它模块时,会执行被加载模块中的代码
// m1.js文件
console.log('加载了自定义模块m1');
// 加载m1.js文件
const m1 = require('./06.用户自定义模块1.js') // js后缀名可以被省略
console.log(m1);
// 打印:
// 加载了自定义模块m1
// {}
(2)自定义模块中定义的变量、方法等成员,只能在模块内部被访问,可防止全局变量污染
(3)module对象:存储和当前模块有关的信息,每个自定义模块都有这个属性
Module {
id: '.',
path: '……',
exports: {},
parent: null,
filename: '……,
loaded: false,
children: [],
paths: [……]
}
(4)向外共享模块作用域中的成员
-
在导入某个自定义模块时,实际上导入的是module对象中的exports对象,默认为空
-
经过module.exports暴露的数据才能被访问到
// export.js文件(不经过module.exports暴露则访问不到) module.exports = { name: '星星' } module.exports.age = 18 // test.js文件 const m = require('./exports.js') console.log(m) // {name: '星星', age: 18}
-
共享成员时需要注意
导入成员时,导入的结果,永远以module.exports指向的对象为准
// export.js文件(不经过module.exports暴露则访问不到) module.exports.age = 18 // 此时module.exports指向一个全新的对象 module.exports = { name: '星星' } // test.js文件 const m = require('./exports.js') console.log(m) // {name: '星星'}
(5)exports对象
向外暴露数据时也可以使用exports,exports和module.exports指向同一个对象(修改值也是同步的),最终共享的结果,还是以module.exports指向的对象为准
(6)exports和module.exports的使用误区
require()导入模块时,得到的永远是module.exports所指向的对象
防止混乱,不要在同一个模块中同时使用exports和module.exports
4、Node.js中的模块化规范
(1)CommonJS规范:规定模块的特性和各模块之间如何相互依赖
(2)CommonJS规定:
-
每个模块内部,module变量代表当前模块
-
module变量是一个对象,它的exports属性(module.exports)是对外的接口
-
加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块
网友评论