Open CodingMeUp opened 4 years ago
模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。
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';
AMD,CMD用的不多,主要讲一下CommonJS和ESModule
特点: require、module.exports、exports CommonJS 一般用在服务端或者Node用来同步加载模块,它对于模块的依赖发生在代码运行阶段,不适合在浏览器端做异步加载。 exports实际上是一个对module.exports的引用:
require
module.exports
exports
exports.add = function add () {/* 方法 */} // 等同于 module.exports.add = function add () {/* 方法 */}
但注意,不能给exports赋值,否则会断开与module.exports的连接。
特点: import、export ES6模块化不是对象,import会在JavaScript引擎静态分析,在编译时就引入模块代码,而并非在代码运行时加载,因此也不适合异步加载。 在HTML中如果要引入模块需要使用
import
export
<script type="module" src="./module.js"></script>
ESModule的优势:
Originally posted by @Reaper622 in https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/28#issuecomment-562807639
https://www.yuque.com/docs/share/9f219af8-12a5-4441-978f-201ef03987ab?
模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。
IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突。
AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好。
CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件。
CommonJS: nodejs 中自带的模块化。
UMD:兼容AMD,CommonJS 模块化语法。
webpack(require.ensure):webpack 2.x 版本中的代码分割。
ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。
ES Modules与common.js区别
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
语句处执行这个要输出的代码,而不是直接加载整个模块。Originally posted by @Reaper622 in https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/28#issuecomment-562807639