[TOC]
# 31. 模块系统和包管理器
JavaScript没有模块的内置支持,但社区创造了令人印象深刻的解决方法。为了管理模块,您可以使用所谓的包管理器,它负责处理发现、安装、依赖管理和更多。
## 31.1 模块系统
JavaScript模块中两个最重要的标准(不幸的是不兼容的)是:
### CommonJS模块(CJS)
本标准主导的体现是`Node.js`模块(`Node.js`模块有几个超越CJS的特点)。其特点包括:
* 紧凑的语法
* 专为同步加载设计
* 主要使用:服务端。
### 异步模块定义(AMD)
本标准的最流行的实现是[`RequireJS`](http://requirejs.org/)。其特点包括:
* 稍微复杂的语法,使AMD没有`eval()`或静态编译步骤的工作
* 专为异步加载设计
* 主要使用:浏览器端
## 31.2 包管理器
当涉及到软件包管理器,**NPM**(Node Packaged Modules)是Node.js规范选择。对于浏览器来说,以下两个项很受欢迎(与其他相比):
* `Bower`是一个支持AMD和CJS的 Web包管理器。
* `Browserify`是一个工具,可以让你使用类似于 node 的 `require()` 的方式来组织浏览器端的 Javascript 代码,通过预编译让前端 Javascript 可以直接使用 Node NPM 安装的一些库。
## 31.3 简单粗暴的模块实现
对于正常的web开发,,你应该使用一个模块系统,如`requirejs`或`Browserify`。然而,有时候你只想简单暴力一些把它放在一起。下面简单的模块模式可以帮助:
```js
var moduleName = function () {
function privateFunction () { ... }
function publicFunction(...) {
privateFunction();
otherModule.doSomething(); // implicit import
}
return { // exports
publicFunction: publicFunction
};
}();
```
上述是一个模块,存储在全局变量的`moduleName`。它做以下:
* 隐式的导入依赖(模块`othermodule`)
* 有一个私有的函数,`privateFunction`
* 输出`publicFunction`
若要在网页上使用该模块,只需通过`<script >`标记加载其文件及其依赖项的文件:
```js
<script src="modules/otherModule.js"></script>
<script src="modules/moduleName.js"></script>
<script type="text/javascript">
moduleName.publicFunction(...);
</script>
```
如果在加载一个模块时,其他模块没有被访问(这是`moduleName`的情况下),此时模块加载的顺序并不重要。
以下是我的意见和建议:
* 我使用这个模块模式了一段时间,直到我发现我没有发明它,它有一个正式的名字。Christian Heilmann推广普及它,叫它"[揭示模块模式](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript)"。
* 如果您使用此模式,保持简单。可以随意用模块名称污染全局范围,但请尝试找到唯一名称。它只是为了极客(黑客),所以没有必要多么好看华丽(嵌套命名空间,模块分割多个文件,等等)。
- 本书简介
- 前言
- 关于这本书你需要知道些什么
- 如何阅读本书
- 目录
- I. JavaScript的快速入门
- 第1章 基础的JavaScript
- II. 背景知识
- 第2章 为什么选择JavaScript?
- 第3章 JavaScript的性质
- 第4章 JavaScript是如何创造出来的
- 第5章 标准化:ECMAScript
- 第6章 JavaScript的历史里程碑
- III. 深入JavaScript
- 第7章 JavaScript语法
- 第8章 值
- 第9章 运算符
- 第10章 布尔值
- 第11章 数字
- 第12章 字符串
- 第13章 语句
- 第14章 异常捕获
- 第15章 函数
- 第16章 变量:作用域、环境和闭包
- 第17章 对象和继承
- 第18章 数组
- 第19章 正则表达式
- 第20章 Date
- 第21章 Math
- 第22章 JSON
- 第23章 标准全局变量
- 第24章 编码和JavaScript
- 第25章 ECMAScript 5中的新功能
- IV. 技巧、工具和类库
- 第26章 元代码样式指南
- 第27章 调试的语言机制
- 第28章 子类化内置构造函数
- 第29章 JSDoc:生成API文档
- 第30章 类库
- 第31章 模块系统和包管理器
- 第32章 其他工具
- 第33章 接下来该做什么
- 著作权