[答案](https://blog.csdn.net/dadadeganhuo/article/details/86777249)
Activity
[-]前端中的模块化开发[/-][+]第26 题: 前端中的模块化开发[/+]wenJonSnow commentedon Mar 5, 2019
很cool
lvtraveler commentedon Mar 6, 2019
参考:模块化
mengsixing commentedon Mar 6, 2019
模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。
IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突。
AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好。
CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件。
CommonJS: nodejs 中自带的模块化。
UMD:兼容AMD,CommonJS 模块化语法。
webpack(require.ensure):webpack 2.x 版本中的代码分割。
ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。
LouisaNikita commentedon Mar 9, 2019
es6,amd,smd,commonjs 思维导图
ghost commentedon Mar 14, 2019
var fs = require('fs'):
import a from 'a';
[-]第26 题: 前端中的模块化开发[/-][+]第 26 题: 前端中的模块化开发[/+]cathy1024 commentedon Aug 23, 2019
太棒了!
wind4gis commentedon Nov 1, 2019
模块化
模块化的作用
模块化是为了处理全局污染和依赖管理混乱的问题
模块化
因为一开始js本身没有提供模块化的机制,所以才会衍生出commonJS、AMD、CMD和UMD这么多模块化规范。js在ES6时原生提供了import和export模块化机制
commonJS
定义
文件即模块,每个文件通过module来表示,用require来引用其他依赖,用module.exports来导出自身
机制
通过require去引用文件时,会将文件执行一遍后,将其执行结果通过浅克隆的方式,写入全局内存。后续再require该路径,就直接从内存里取出,不需要重新执行对应的文件
特点
commonJS是服务器编程范式,因为服务器上所有文件都在硬盘里,通过同步加载的方式即可,所以该规范是同步加载规范。同时它是在运行时加载,也就是你可以在require里拼接变量,在加载时会自动识别出最终的实际路径
AMD
定义
define(module, [dep1, dep2], callback)
机制
通过require加载时,它会先加载对应的依赖,等依赖资源加载完之后,会执行回调函数,将依赖作为入参,执行对应的业务逻辑
特点
AMD机制是浏览器编程范式,它是在客户端使用的,由于资源都是在服务器上,所以它是异步加载。同时,它最大的特点是强调依赖前置。
CMD
定义
机制和AMD类似,最大的区别就是CMD强调延迟加载,对应的依赖等到回调函数里执行具体依赖语句,才会去加载,但是AMD在后续版本里也支持了延迟加载的写法
机制
同上
特点
同上
UMD
定义
CommonJS、AMD、CMD并行的状态下,就需要一种方案能够兼容他们,这样我们在开发时,
就不需要再去考虑依赖模块所遵循的规范了,而UMD的出现就是为了解决这个问题。
ES6
定义
通过import引入依赖,通过export导出依赖
机制
ES6的模块机制在依赖模块时并不会先去预加载整个脚本,而是生成一个只读引用,并且静态解析依赖,等到执行代码时,再去依赖里取出实际需要的模块
特点
编译时加载,不允许在里边引用变量,必须为真实的文件路径。可以通过调用import()语句,会生成一个promise去加载对应的文件,这样子就是运行时加载,可以在路径里边编写变量
Reaper622 commentedon Dec 7, 2019
AMD,CMD用的不多,主要讲一下CommonJS和ESModule
模块的特性
CommonJS
特点:
require
、module.exports
、exports
CommonJS 一般用在服务端或者Node用来同步加载模块,它对于模块的依赖发生在代码运行阶段,不适合在浏览器端做异步加载。
exports
实际上是一个对module.exports
的引用:但注意,不能给
exports
赋值,否则会断开与module.exports
的连接。ES6 Module
特点:
import
、export
ES6模块化不是对象,
import
会在JavaScript引擎静态分析,在编译时就引入模块代码,而并非在代码运行时加载,因此也不适合异步加载。在HTML中如果要引入模块需要使用
ESModule的优势:
二者的差异
CommonJS模块引用后是一个值的拷贝,而ESModule引用后是一个值的动态映射,并且这个映射是只读的。
import
后生成一个引用链接,在脚本真正执行时才会根据这个引用链接去模块里面取值,模块内部的原始值变了import
加载的模块也会变。CommonJS运行时加载,ESModule编译阶段引用。
export
暴露出要输出的代码块,在import
时使用静态命令的方法引用指定的输出代码块,并在import
语句处执行这个要输出的代码,而不是直接加载整个模块。[-]第 26 题: 前端中的模块化开发[/-][+]第 26 题: 介绍模块化发展历程[/+]13 remaining items