跳转至

模块

信息

本文适用于Node.js

在Node.js环境中, 一个.js文件就称之为一个模块.

目的

  • 提高代码的可维护性: 将代码模块化, 保持文件的简洁
  • 提高代码的可移植性: 当一个模块编写完毕, 就可以导出其中的函数, 变量, 供其他地方引用
  • 避免函数名和变量名冲突: 相同名字的函数和变量完全可以分别存放在不同的模块中

原理

要实现模块的功能, 并不需要语法层面的支持. 如果我们把一段JS代码用一个函数包起来, 那么这段代码中所有的顶层代码中的变量, 即"伪全局变量"就变成了函数内部的变量. 我们将这种函数称为"模块包装器". 不同的模组经过不同的模块包装器包装后就实现了隔离.

原理可以用下面的例子解释:

例子

我们写了一个hello.js文件,

// 模块对象
var module = {
    ...
    exports: {}
};

// 模块包装器
var load = function(exports, module) {
    // 这里是 hello.js 的文件内容
    function foo() {
        return 'Hello, World!';
    };

    module.exports = foo;

    return module.exports
};

// 加载hello.js模块
var exported = load(module.exports, require);

// 保存模块
save(module, exported)
笔记
  • 变量module是Node.js在加载js文件前准备的一个对象, 里面含有一个exports对象, 初始化为{}.
  • Node.js将module.exports对象和module对象传入模块包装器, 在hello.js里面直接可以使用变量module原因就是它实际上是模块包装器的一个参数. exports是对module.exports对象的一个引用(快捷方式).
  • 我们将函数放在module.exports中然后作为模块包装器的返回值返回. exported接收到更新后的module.exports对象, 并被保存在JS缓存中等待被其他模块require.
注意

不要直接对模块内的exports对象赋值. 因为它是一个对module.exports对象的引用. 若对exports对象赋值, 则会改变这个引用, 由于最终导出的是module.exports, 所以导出无效.


  1. 模块. (n.d.). Retrieved June 21, 2024, from https://www.liaoxuefeng.com/wiki/1022910821149312/1023027697415616 

评论