第 31 章:模块系统和包管理器
目录
购买本书
(广告,请不要屏蔽。)

第 31 章:模块系统和包管理器

JavaScript 本身不支持模块,但社区已经创建了令人印象深刻的解决方案。要管理模块,您可以使用所谓的 包管理器,它们 负责发现、安装、依赖管理等等。

模块系统

JavaScript 模块的两个 最重要(但不幸的是不兼容)的标准是:

CommonJS 模块 (CJS)

该标准的主要实现是 Node.js 模块(Node.js 模块具有一些超出 CJS 的功能)。其特点包括

  • 语法简洁
  • 专为同步加载而设计
  • 主要用途:服务器端
异步模块定义 (AMD)

该标准最流行的实现是 RequireJS。其特点包括

  • 语法稍微复杂一些,使 AMD 能够在不使用 eval() 或静态编译步骤的情况下工作
  • 专为异步加载而设计
  • 主要用途:浏览器端

包管理器

说到 包管理器,npm(Node Packaged Modules)是 Node.js 的首选。对于 浏览器,以下两个选项很受欢迎(还有其他选项):

快速简单的模块

对于普通的 Web 开发,您应该使用 RequireJS 或 Browserify 等模块系统。但是,有时您只想快速完成一个简单的任务。那么以下简单的模块模式可以帮助您:

var moduleName = function () {
    function privateFunction () { ... }
    function publicFunction(...) {
        privateFunction();
        otherModule.doSomething();  // implicit import
    }
    return { // exports
        publicFunction: publicFunction
    };
}();

前面是一个存储在全局变量 moduleName 中的模块。它执行以下操作

  • 隐式导入依赖项(模块 otherModule
  • 有一个私有函数,privateFunction
  • 导出 publicFunction

要在网页上使用该模块,只需通过 <script> 标签加载其文件及其依赖项的文件

<script src="modules/otherModule.js"></script>
<script src="modules/moduleName.js"></script>
<script type="text/javascript">
    moduleName.publicFunction(...);
</script>

如果在加载模块时没有访问其他模块(moduleName 就是这种情况),则模块加载顺序无关紧要。

以下是我的评论和建议

  • 我使用这种模块模式有一段时间了,直到我发现我不是第一个发明它的人,而且它有一个正式的名称。Christian Heilmann 推广了它,并将其称为“揭示模块模式”。
  • 如果您使用这种模式,请保持简单。您可以随意使用模块名称污染全局作用域,但请尽量找到唯一的名称。这只是为了快速完成任务,所以不需要太复杂(嵌套命名空间、跨多个文件拆分的模块等)。
下一页:32. 更多工具