来源于:https://zhuanlan.zhihu.com/p/26231889

# JavaScript 模块化

早期的JavaScript并没有模块化解决方案。
随着单页应用与富客户端的流行,出现了模块化(Modularity)。

模块化主要是解决

1. 代码分割
2. 作用域隔离
3. 模块之间的依赖管理
4. 发布到生产环境时的自动化打包与处理

流行过的 JavaScript 模块化解决方案包括但不限于

1. 直接声明依赖(Directly Defined Dependences)
2. 命名空间(Namespace Pattern)
3. 模块模式(Module Pattern)
4. 依赖分离定义(Detached Dependency Definitions)
5. 沙盒(Sandbox)
6. 依赖注入(Dependency Injection)
7. CommonJS、AMD、UMD
8. 标签化模块(Labeled Modules)
9. YModules
10. ES 2015 Modules

早期web开发中,很容易遇到的问题是**命名冲突(Name Collisions)**。

此外应用变大后

1. 无法将所有代码写到单个JavaScript文件中
2. 手动引入所有脚本文件也是个问题
3. 特别是存在着模块间依赖的问题

物极必反,过度碎片化的模块同样会带来性能的损耗与包体尺寸的增大,这包括了

1. 模块加载
2. 模块解析
3. JavaScript 引擎优化失败(因为 Webpack 等打包工具包裹模块时封装的过多 IIFE 函数导致的)

# 命名空间模式

1. 统一添加前缀,如myApp_address, myApp_validateUser()
2. 对象封装,将所有相关变量封装入全局对象中

对象封装的缺点是

1. 大型多人协同项目的可维护性还是较差
2. 没有解决模块间依赖管理的问题

# 依赖注入

依赖注入的核心思想在于某个模块**不需要手动地初始化**某个依赖对象,而**只需要声明**该依赖并由外部框架自动实例化该对象实现并且传递到模块内。
Angular/Angular2/Slot中依赖注入是核心机制之一。

# CommonJS

主要包含`require` 与 `module` 这两个关键字。

CommonJS 算是目前最流行的模块格式,可以应用在

1. Node.js
2. [Browserify**](http://browserify.org/)(客户端)
3. [Webpack**](https://webpack.js.org/)(客户端)

需要注意的是,**Node.js 中的模块在加载之后是以单例化运行,并且遵循值传递原则**

# AMD(Asynchronous Module Definition)

实现了**异步加载模块**。目的是**充分利用浏览器的并发加载能力**。
主要包含`require` 与 `define` 这两个关键字。

> 随着以 npm 为主导的依赖管理机制的统一,越来越多的开发者放弃了使用 AMD 模式。

# UMD(Universal Module Definition)

同时支持 CommonJS 与 AMD 规范的模块。

# ES2015 Modules

主要包含`import` 与 `export` 这两个关键字。

> 我们目前还不能直接保证在所有环境(特别是旧版本浏览器)中使用该规范,但是通过 Babel 等转化工具能帮我们自动处理向下兼容。

ES2015 Modules 还是有些许被诟病的地方

1. 导入语句只能作为模块顶层的语句出现,不能出现在 function 里面或是 if 里面
2. 并且 import 语句会被提升到文件顶部执行,也就是说在模块初始化的时候所有的 import 都必须已经导入完成
3. import 的模块名只能是字符串常量,导入的值也是不可变对象

> 这些设计虽然使得灵活性不如 CommonJS 的 require,但却保证了 ES6 Modules 的依赖关系是确定(Deterministic)的,和运行时的状态无关,从而也就保证了 ES6 Modules 是可以进行可靠的静态分析的。

浏览器中默认支持 ES2015 Modules的情况请查看原文。

[JavaScript模块演化简史]摘要的更多相关文章

  1. 关于javascript模块加载技术的一些思考

    前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...

  2. (转)深入理解JavaScript 模块模式

    深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...

  3. 【转载】ODBC, OLEDB, ADO, ADO.Net的演化简史

    原文:ODBC, OLEDB, ADO, ADO.Net的演化简史 1.演变历史 它们是按照这个时间先后的顺序逐步出现的,史前->ODBC->OLEDB->ADO->ADO.N ...

  4. Javascript模块规范(CommonJS规范&&AMD规范)

    Javascript模块化编程(AMD&CommonJS) 前端模块化开发的价值:https://github.com/seajs/seajs/issues/547 模块的写法 查看 AMD规 ...

  5. 深入理解JavaScript 模块模式

    http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html 模块模式是JavaScript一种常用的编码模式.这是一般的 ...

  6. 转: javascript模块加载框架seajs详解

    javascript模块加载框架seajs详解 SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加 ...

  7. javascript模块加载框架seajs详解

    SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加载).SeaJS可以和jQuery完美集成,使用 ...

  8. 推荐好用的JavaScript模块

    译者按: 作者将自己常用的JavaScript模块分享给大家. 原文:

  9. 小矮人Javascript模块加载器

    https://github.com/miniflycn/webkit-dwarf 短小精悍的webkit浏览器Javascript模块加载器 Why 我们有许多仅基于webkit浏览器开发的应用 无 ...

随机推荐

  1. hdu4753 Fishhead’s Little Game 状态压缩,总和一定的博弈

    此题和UVA 10891 Game of Sum 总和一定的博弈,区间dp是一个道理,就是预处理麻烦 这是南京网络赛的一题,一直没做,今天做了,虽然时间有点长,但是1ac,这几乎是南京现场赛的最后一道 ...

  2. 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1] (转)

    Index Data Author: David Smiley Eric Pugh 译者:Koala++ / 屈伟 在这一章中我们将了解如何将数据传入Solr.这个传入的过程称之为索引,尽管中间还包含 ...

  3. tensorflow语义分割api使用(deeplab训练cityscapes)

    安装教程:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/installation.md citysca ...

  4. Pytorch之CrossEntropyLoss() 与 NLLLoss() 的区别

    (三)PyTorch学习笔记——softmax和log_softmax的区别.CrossEntropyLoss() 与 NLLLoss() 的区别.log似然代价函数 pytorch loss fun ...

  5. IO流 简介 总结 API 案例 MD

    目录 IO 流 简介 关闭流的正确方式 关闭流的封装方法 InputStream 转 String 的方式 转换流 InputStreamReader OutputStreamWriter 测试代码 ...

  6. python 爬虫随机获取User-Agent

    可以有两种方法: 1.随机生成 首先安装 pip install fake-useragent import random from fake_useragent import UserAgent d ...

  7. 【Spark】SparkStreaming-如何使用checkpoint

    SparkStreaming-如何使用checkpoint sparkstreaming checkpoint 默认_百度搜索 spark streaming中使用checkpoint - HarkL ...

  8. 解决webstom failed to change read-only files

    我百思不得其解的是,为何我的文件不让我更改,变成了只读模式,后来我仔细回忆了一下,原来是因为我使用了root权限,来安装thinkjs之后,webstom没有root权限,所以我使用root,在终端敲 ...

  9. 启动项目时出现Not a JAR.......Find JAR........一指循环就是起不来

    出现问题原因就是mapper的映射文件有问题,里面的返回类型如是实体找不到或者找重复的就会这样 解决办法就是:确保在用的实体(路径)能找到,切记不能有重名的实体

  10. 如何用简单例子讲解 Q - learning 的具体过程?

    作者:牛阿链接:https://www.zhihu.com/question/26408259/answer/123230350来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...