模块化
模块化规范
模块化的规范是对代码进行模块化拆分和组合时,需要遵循的规则。
- 使用什么语法来引用模块。
- 在模块中使用什么语法来向外暴露成员。
好处:方便模块调用,规范代码。
模块化
模块分类
根据来源不同分为:
- 内置模块(如 fs、path、http )
- 自定义模块 (用户创建的 .js 文件,就是自定义模块)
- 第三方模块,第三方开发的,使用前需要先下载
加载模块
使用 require
方法加载内置的模块。
- 加载内置模块
const fs = require('fs')
- 加载用户自定义的模块(需要提供路径)
const custom = require('./custom.js')
- 加载第三方模块
const moment = require ('moment')
调用举例
我们创建一个自定义模块,在另一个 js 文件中调用这个模块。
模块 m1.js
console.log("调用了m1这个模块");
在另一个文件中调用这个模块。
usem1.js
const m1 = require("./m1.js");
执行 usem1.js
:
node usem1.js
控制台输出:
调用了m1这个模块
作用域
在自定义模块中,定义的变量和方法只能在模块内被访问,这种模块级的限制,叫做模块作用域。
- 防止全局变量污染
举例:
在浏览器环境中有如下代码:
index.html
...
<script src="sc1.js"></script>
<script src="sc2.js"></script>
<script>
console.log(username);
</script>
sc1.js
var username = '张三'
sc2.js
var username = '李四'
最终输出:
李四
而实际上 sc1.js
中的代码并没有生效,这就是因为同名,变量被污染了。Nodejs 中的模块作用域能很好解决这一问题。
module 对象
介绍
向外共享模块作用域的成员。
创建文件:
module.js
console.log(module);
运行文件,控制台输出:
Module {
id: '.',
path: 'D:\\desk\\FrontEnd\\test\\8-11',
exports: {},
filename: 'D:\\desk\\FrontEnd\\test\\8-11\\module.js',
loaded: false,
children: [],
paths: [
'D:\\desk\\FrontEnd\\test\\8-11\\node_modules',
'D:\\desk\\FrontEnd\\test\\node_modules',
'D:\\desk\\FrontEnd\\node_modules',
'D:\\desk\\node_modules',
'D:\\node_modules'
]
}
这是默认的成员打印,我们如果希望向外共享成员,就需要利用 exports
属性。
共享成员
module.export
: 在自定义模块中向外共享成员。
模块 m1.js
const age=20;
module.exports.username = "张三";
module.exports.sayHello = function () {
console.log("Hello World");
};
tip
在上面的代码中, age 成员没有通过 module.exports
向外导出,因此 age 是这个模块的私有成员,外部访问不到。
usem1.js
const m1 = require("./m1.js");
console.log(m1);
执行代码 usem1.js
:
{ username: '张三', sayHello: [Function (anonymous)] }
注意
使用 require 方法导入对象时,导入的结果永远以 module.exports
指向的对象为准。
模块 m1.js
module.exports.username = "张三";
module.exports.sayHello = function () {
console.log("Hello World");
};
module.exports={
nickname="小黑",
sayHi(){
console.log("你好");
}
}
在上面的代码中 module.exports
虽然在前两行指向了 username
和 sayHello
成员,但是在下面 module.exports
重新指向了两个成员,覆盖了之前的成员。因此只有最后这次指向是生效的。
exports 对象
为了简化 module.exports
这个对象的写法,Node 提供了 exports
对象。默认情况下他们指向的是同一个对象,最终共享的结果还是 module.exports
指向的为准。
console.log(exports);
console.log(module.exports);
console.log(exports === module.exports);
打印结果: true