We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
模块化的作用主要是用来抽离公共代码;隔离作用域,处理全局污染,避免变量冲突;处理依赖管理混乱等。
将代码拆分成独立的块,然后再把这些块连接起来可以通过模块模式来实现。背后的思想是把逻辑分块,各自封装,相互独立,每个块自行决定对外暴露什么,同时自行决定引入执行哪些外部代码。
使用自执行函数来编写模块化。 特点:在一个单独的函数作用域中执行代码,避免变量冲突。
//引入 require(['module1', 'module2'], function(m1, m2){ 使用m1/m2 }) // 定义和暴露模块 //无依赖 define(function(){ return 模块 } //有依赖 define(['module1', 'module2'], function(m1, m2){ return 模块 })
AMD规范是非同步加载模块,允许指定回调函数。AMD推荐的风格通过返回一个对象作为模块对象。
var math=require('math')
exports.add = function add () {/* 方法 */} //或 module.exports.add = function add () {/* 方法 */}
define 是一个全局函数,用来定义模块。define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串。 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。factory 为函数时,表示是模块的构造方法。执行该构造方法,可以得到模块向外提供的接口。factory 方法在执行时,默认会传入三个参数:require、exports 和 module
define
factory
require
exports
module
//同步 var fs = require('fs'); //异步 require.async('./module3', function (m3) { }) //定义和暴露模块 无依赖 define(function(require, exports, module){ exports.xxx = value module.exports = value }) 有依赖 define(function(require, exports, module){\ //引入依赖模块(同步)\ var module2 = require('./module2')\ //引入依赖模块(异步)\ require.async('./module3', function (m3) {\ })\ //暴露模块\ exports.xxx = value\ })
为了统一CommonJS和AMD生态系统,规范应运而生。UMD可用于创建这两个系统都可以使用的模块代码。本质上,UMD定义的模块会在启动时检测要使用哪个模块系统,然后进行适当配置,并把所有逻辑包装在一个立即调用的函数表达式(IIFE)中。
import会在JavaScript引擎静态分析、编译时就引入模块代码,因此也不适合异步加载。
import
<script type="module" src="./module.js"></script>
export
The text was updated successfully, but these errors were encountered:
No branches or pull requests
模块化的作用主要是用来抽离公共代码;隔离作用域,处理全局污染,避免变量冲突;处理依赖管理混乱等。
模块模式
将代码拆分成独立的块,然后再把这些块连接起来可以通过模块模式来实现。背后的思想是把逻辑分块,各自封装,相互独立,每个块自行决定对外暴露什么,同时自行决定引入执行哪些外部代码。
模块的特性
IIFE(Immediately Invoked Function Expression)
使用自执行函数来编写模块化。
特点:在一个单独的函数作用域中执行代码,避免变量冲突。
AMD(Asynchronous Module Definition)
语法
AMD规范是非同步加载模块,允许指定回调函数。AMD推荐的风格通过返回一个对象作为模块对象。
Commonjs
Commonjs是服务端模块的规范,Node.js采用了这个规范。CommonJS的风格通过对module。exports或exports的属性赋值来达到暴露模块对象的目的。CommonJS 一般用在服务端或者Node用来同步加载模块,它对于模块的依赖发生在代码运行阶段(只有加载完成,才能执行后面的操作),不适合在浏览器端做异步加载。
语法
var math=require('math')
语法
CMD
CMD整合了common.js 和 amd的特点,模块使用时再声明,模块的加载是异步的,模块使用时才会加载执行。在 CMD 规范中,一个模块就是一个文件。
语法
define
是一个全局函数,用来定义模块。define
接受factory
参数,factory
可以是一个函数,也可以是一个对象或字符串。factory
为对象、字符串时,表示模块的接口就是该对象、字符串。factory
为函数时,表示是模块的构造方法。执行该构造方法,可以得到模块向外提供的接口。factory
方法在执行时,默认会传入三个参数:require
、exports
和module
通用模块定义(UMD, Universal Module Definition)
为了统一CommonJS和AMD生态系统,规范应运而生。UMD可用于创建这两个系统都可以使用的模块代码。本质上,UMD定义的模块会在启动时检测要使用哪个模块系统,然后进行适当配置,并把所有逻辑包装在一个立即调用的函数表达式(IIFE)中。
ES Modules
import
会在JavaScript引擎静态分析、编译时就引入模块代码,因此也不适合异步加载。语法
<script type="module" src="./module.js"></script>
优势
CommonJS和ESModule的区别
CommonJS模块引用后是一个值的拷贝,而ESModule引用后是一个值的引用(动态映射,并且这个映射是只读的。)。
import
后生成一个引用链接,在脚本真正执行时才会根据这个引用链接去模块里面取值,模块内部的原始值变了import
加载的模块也会变。CommonJS运行时加载,ESModule编译阶段引用。
export
暴露出要输出的代码块,在import
时使用静态命令的方法引用指定的输出代码块,并在import
语句处执行这个要输出的代码,而不是直接加载整个模块。参考资料
The text was updated successfully, but these errors were encountered: