Skip to main content

模块化

模块化规范

模块化的规范是对代码进行模块化拆分和组合时,需要遵循的规则。

  • 使用什么语法来引用模块。
  • 在模块中使用什么语法来向外暴露成员。

好处:方便模块调用,规范代码。

模块化

模块分类

根据来源不同分为:

  • 内置模块(如 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 虽然在前两行指向了 usernamesayHello 成员,但是在下面 module.exports 重新指向了两个成员,覆盖了之前的成员。因此只有最后这次指向是生效的。

exports 对象

为了简化 module.exports 这个对象的写法,Node 提供了 exports 对象。默认情况下他们指向的是同一个对象,最终共享的结果还是 module.exports 指向的为准。

console.log(exports);
console.log(module.exports);

console.log(exports === module.exports);

打印结果: true