-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 26 题: 介绍模块化发展历程 #28
Comments
很cool |
模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。 IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突。 (function(){
return {
data:[]
}
})() AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好。 define('./index.js',function(code){
// code 就是index.js 返回的内容
}) CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件。 define(function(require, exports, module) {
var indexCode = require('./index.js');
}); CommonJS: nodejs 中自带的模块化。 var fs = require('fs'); UMD:兼容AMD,CommonJS 模块化语法。 webpack(require.ensure):webpack 2.x 版本中的代码分割。 ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。 import a from 'a'; |
|
模块化模块化的作用模块化是为了处理全局污染和依赖管理混乱的问题 模块化因为一开始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并行的状态下,就需要一种方案能够兼容他们,这样我们在开发时, ES6定义通过import引入依赖,通过export导出依赖 机制ES6的模块机制在依赖模块时并不会先去预加载整个脚本,而是生成一个只读引用,并且静态解析依赖,等到执行代码时,再去依赖里取出实际需要的模块 特点编译时加载,不允许在里边引用变量,必须为真实的文件路径。可以通过调用import()语句,会生成一个promise去加载对应的文件,这样子就是运行时加载,可以在路径里边编写变量 |
AMD,CMD用的不多,主要讲一下CommonJS和ESModule 模块的特性
CommonJS特点: exports.add = function add () {/* 方法 */}
// 等同于
module.exports.add = function add () {/* 方法 */} 但注意,不能给 ES6 Module特点: <script type="module" src="./module.js"></script> ESModule的优势:
二者的差异CommonJS模块引用后是一个值的拷贝,而ESModule引用后是一个值的动态映射,并且这个映射是只读的。
CommonJS运行时加载,ESModule编译阶段引用。
|
可从IIFE、AMD、CMD、CommonJS、UMD、webpack(require.ensure)、ES Module、 |
很酷 |
参考这篇文章吧前端科普系列-CommonJS:不是前端却革命了前端 |
模块化 脚本顺序依赖 cmd Commonjs es6 Commmonjs 引入是值的拷贝,多次引入会缓存 |
答案
The text was updated successfully, but these errors were encountered: