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
模块化规范::AMD/CMD/CommonJS/es6模块等等规范,规范了如何来组织你的代码。一般这种方式写的代码浏览器不认,需要用模块化构建工具来打包编译成浏览器可以识别的文件。
允许模块通过 require 方法来同步加载所要依赖的其他模块,然后通过 exports 或 module.exports 来导出需要暴露的接口。
require
exports
module.exports
只能使用在服务器端,无法使用在浏览器端。
使用案例:
// 导入 require("module"); require("../app.js"); // 导出 exports.getStoreInfo = function() {}; module.exports = someValue;
优点:
缺点:
Asynchronous Module Definition:异步模块定义
采用异步方式加载模块,模块的加载不影响后面语句的运行。所有依赖模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才执行。
// 定义 define("module", ["dep1", "dep2"], function(d1, d2) {...}); // 加载模块 require(["module", "../app"], function(module, app) {...});
加载模块require([module], callback) [module] : 是一个数组,里面的成员就是要加载的模块 callback : 是加载成功之后的回调函。
加载模块require([module], callback)
require([module], callback)
[module]
callback
require.js
RequireJS 对模块的态度是预执行。由于 RequireJS 是执行的 AMD 规范, 因此所有的依赖模块都是先执行;即 RequireJS 是预先把依赖的模块执行,相当于把require提前了
RequireJS 执行流程:
CMD规范和AMD很相似,简单,并与CommonJS和Node.js的 Modules 规范保持了很大的兼容性;在CMD规范中,一个模块就是一个文件。
使用实例:
define(function(require, exports, module) { var a = require('./a'); a.doSomething(); // 依赖就近书写,什么时候用到什么时候引入 var b = require('./b'); b.doSomething(); });
定义模块使用全局函数define,其接收 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串; factory 是一个函数: require 是一个方法,接受模块标识作为唯一参数,用来获取其他模块提供的接口:require(id) exports 是一个对象,用来向外提供模块接口 module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
定义模块使用全局函数define,其接收 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串; factory 是一个函数:
require(id)
module
sea.js
SeaJS 对模块的态度是懒执行, SeaJS 只会在真正需要使用(依赖)模块时才执行该模块。 与 requireJS 类似,推崇依赖后置。社区衰微,不建议入坑。
AMD 以浏览器第一原则发展异步加载模块。CommonJS 模块以服务器第一原则发展,选择同步加载,它的模块无需包装。 UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式;在判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。 使用案例:
(function (window, factory) { if (typeof exports === 'object') { module.exports = factory(); } else if (typeof define === 'function' && define.amd) { define(factory); } else { window.eventUtil = factory(); } })(this, function () { //module ... });
ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。 ES6 模块设计思想:尽量的静态化、使得编译时就能确定模块的依赖关系,以及输入和输出的变量(CommonJS和AMD模块,都只能在运行时确定这些东西)。
// 导入 import "/app"; import React from “react”; import { Component } from “react”; // 导出 export function multiply() {...}; export var year = 2018; export default ...
由于 import 是静态执行,所以 import 具有提升效果即 import 命令在模块中的位置并不影响程序的输出。
import()
require/exports 是必要通用且必须的;因为事实上,目前编写的 import/export 最终都是编译为 require/exports 来执行的。
The text was updated successfully, but these errors were encountered:
Sorry, something went wrong.
No branches or pull requests
CommonJS(同步加载模块)
允许模块通过
require
方法来同步加载所要依赖的其他模块,然后通过exports
或module.exports
来导出需要暴露的接口。只能使用在服务器端,无法使用在浏览器端。
使用案例:
优点:
缺点:
AMD(异步加载模块)
采用异步方式加载模块,模块的加载不影响后面语句的运行。所有依赖模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才执行。
使用案例:
优点:
缺点:
实现 AMD 规范代表
require.js
RequireJS 执行流程:
CMD(异步加载模块)
CMD规范和AMD很相似,简单,并与CommonJS和Node.js的 Modules 规范保持了很大的兼容性;在CMD规范中,一个模块就是一个文件。
使用实例:
优点:
缺点:
实现规范库
sea.js
UMD(AMD 和 CommonJS 的糅合)
AMD 以浏览器第一原则发展异步加载模块。CommonJS 模块以服务器第一原则发展,选择同步加载,它的模块无需包装。
UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式;在判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
使用案例:
ES6 模块
ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块设计思想:尽量的静态化、使得编译时就能确定模块的依赖关系,以及输入和输出的变量(CommonJS和AMD模块,都只能在运行时确定这些东西)。
使用案例:
优点:
缺点:
import 优先执行
由于 import 是静态执行,所以 import 具有提升效果即 import 命令在模块中的位置并不影响程序的输出。
动态
import()
import()
提供一个基于 Promise 的 APIimport()
可以在脚本的任何地方使用import()
接受字符串文字,可以根据需要构造说明符ES6 模块跟 CommonJS 模块的区别
CommonJS
ES6 模块
参考资料
The text was updated successfully, but these errors were encountered: