Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解
JavaSript模块化
在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?
AMD 与 RequireJS
AMD
define( id?, dependencies?, factory );
1
2
3
4
5
6
7
|
define( "alpha" , [ "require" , "exports" , "beta" ], function ( require, exports, beta ){ export .verb = function (){ return beta.verb(); // or: return require( "beta" ).verb(); } }); |
1
2
3
4
5
6
7
|
define([ "alpha" ], function ( alpha ){ return { verb : function (){ return alpha.verb() + 1 ; } } }); |
1
2
3
4
5
|
define( { add : function ( x, y ){ return x + y ; } } ); |
1
2
3
4
5
6
|
define( function ( require, exports, module){ var a = require( 'a' ), b = require( 'b' ); exports.action = function (){}; } ); |
require();
局部 与 全局 的require
1
2
3
4
5
6
7
|
define( [ 'require' ], function ( require ){ // ... } ); or: define( function ( require, exports, module ){ // ... } ); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
require(String) define( function ( require ){ var a = require( 'a' ); // 加载模块a } ); require(Array, Function) define( function ( require ){ require( [ 'a' , 'b' ], function ( a,b ){ // 加载模块a b 使用 // 依赖 a b 模块的运行代码 } ); } ); require.toUrl( Url ) define( function ( require ){ var temp = require.toUrl( './temp/a.html' ); // 加载页面 } ); |
RequireJS
1
|
<script data-main= 'scripts/main' src= 'scripts/require.js' ></script> |
1
2
3
4
|
define({ method1: function (){}, method2: function (){} }); |
1
2
3
4
5
6
|
define( function (){ return { method1: function (){}, method2: function (){} } }); |
1
2
3
|
define([ 'module1' , 'module2' ], function (m1, m2){ ... }); |
1
2
3
4
5
|
define( function ( require ){ var m1 = require( 'module1' ), m2 = require( 'module2' ); ... }); |
1
2
3
4
|
require( [ 'foo' , 'bar' ], function ( foo, bar ){ foo.func(); bar.func(); } ); |
1
2
3
4
5
|
define( function ( require ){ var m1 = require( 'module1' ), m2 = require( 'module2' ); ... }); |
CMD 与 seaJS
CMD
1
|
define({ "foo" : "bar" }); |
1
|
define( 'this is {{data}}.' ); |
1
2
3
|
define( 'module' , [ 'module1' , 'module2' ], function ( require, exports, module ){ // 模块代码 } ); |
1
2
3
4
|
define( function ( require, exports ){ var a = require( './a' ); a.doSomething(); }); |
1
2
3
4
5
|
define( function (require, exports, module) { require.async( '.a' , function (a){ a.doSomething(); }); }); |
1
2
3
4
|
define( function ( require, exports ){ exports.foo = 'bar' ; // 向外提供的属性 exports. do = function (){}; // 向外提供的方法 }); |
1
2
3
4
5
6
|
define( function ( require, exports ){ return { foo : 'bar' , // 向外提供的属性 do : function (){} // 向外提供的方法 } }); |
1
2
3
4
|
define({ foo : 'bar' , // 向外提供的属性 do : function (){} // 向外提供的方法 }); |
1
2
3
4
5
6
|
define( function ( require, exports ){ exports = { foo : 'bar' , // 向外提供的属性 do : function (){} // 向外提供的方法 } }); |
1
2
3
4
5
6
|
define( function ( require, exports, module ){ module.exports = { foo : 'bar' , // 向外提供的属性 do : function (){} // 向外提供的方法 } }); |
seaJS
1
2
3
4
5
6
7
8
9
10
11
|
// 加载一个模块 seajs.use( './a' ); // 加载模块,加载完成时执行回调 seajs.use( './a' , function (a){ a.doSomething(); }); // 加载多个模块执行回调 seajs.use([ './a' , './b' ], function (a , b){ a.doSomething(); b.doSomething(); }); |
AMD 与 CMD 区别到底在哪里?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// CMD define( function (require, exports, module) { var a = require( './a' ) a.doSomething() // 此处略去 100 行 var b = require( './b' ) // 依赖可以就近书写 b.doSomething() // ... }) // AMD 默认推荐的是 define([ './a' , './b' ], function (a, b) { // 依赖必须一开始就写好 a.doSomething() // 此处略去 100 行 b.doSomething() // ... }) |
UMD
UMD是AMD和CommonJS的糅合
AMD模块以浏览器第一的原则发展,异步加载模块。
CommonJS模块以服务器第一原则发展,选择同步加载,它的模块无需包装(unwrapped modules)。
这迫使人们又想出另一个更通用的模式UMD (Universal Module Definition)。希望解决跨平台的解决方案。
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 ...
});
总结
amdjs 的 require 接口文档 https://github.com/amdjs/amdjs-api/wiki/require
amdjs 的接口文档 https://github.com/amdjs/amdjs-api/wiki
RequireJS和AMD规范 http://javascript.ruanyifeng.com/tool/requirejs.html
知乎 AMD 和 CMD 的区别有哪些? http://www.zhihu.com/question/20351507
JavaScript模块化开发 - AMD规范 http://www.feeldesignstudio.com/2013/09/javascript-module-pattern-amd
模块化设计 http://baike.baidu.com/view/189730.htm
模块化 http://baike.baidu.com/view/182267.htm
Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解的更多相关文章
- JavaScript模块化CommonJS/AMD/CMD/UMD/ES6Module的区别
目录 JS-模块化进程 原始的开发方式 CommonJS && node.js AMD && Require.js CMD && Sea.js UMD ...
- JavaScript模块化编程之AMD - requireJS基础使用
JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...
- 前端模块化小总结—commonJs,AMD,CMD, ES6 的Module
随着前端快速发展,需要使用javascript处理越来越多的事情,不在局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,这时需要一种新的模式 --模块化编程 模块化的理解:模块化是一种处理 ...
- js模块化编程之CommonJS和AMD/CMD
js模块化编程commonjs.AMD/CMD与ES6模块规范 一.CommonJS commonjs的require是运行时同步加载,es6的import是静态分析,是在编译时而不是在代码运行时.C ...
- JavaScript模块化演变 CommonJs,AMD, CMD, UMD(一)
原文链接:https://www.jianshu.com/p/33d53cce8237 原文系列2链接:https://www.jianshu.com/p/ad427d8879cb 前端完全手册: h ...
- js模块化编程之CommonJS和AMD/CMD!
有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...
- JavaScript模块化编程之AMD
简单的说一下AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义".它采用异步方式加载模块,模块的加载不影响它 ...
- CommonJS/AMD/CMD/UMD
为什么会有这几种模式? 起源:Javascript模块化 模块化就是把复杂问题分解成不同模块,这样可维护性高,从而达到高复用,低耦合. 1.Commonjs CommonJS是服务器端模块的规范,No ...
- 关于 CommonJS AMD CMD UMD 规范的差异总结
一.CommonJS 主要是用于服务器端的规范,比如目前的nodeJS. 根据CommonJS规范,一个单独的文件就是一个模块.每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函 ...
随机推荐
- c#从前台界面找后台方法
比如你新接触一个项目 项目别人已经写的差不多了 你对项目一无所知,别人安排给你活 怎么最快速度找到你要干的活对应的东西 以谷歌浏览器为例 一个项目你要修改 库存信息列表 右键检查或者F12 找 ...
- python创建字典的三种方式
创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...
- 记录 Docker 的学习过程 (dockerfile自动制作镜像)
自动制作镜像 通过编写dockerfile来自动创建镜像 #vi Dockerfile #编辑dockerfile文件,一定要以这个名字命名 #cat Dockerfile #导入哪个基础镜像FROM ...
- idea修改忽视文件产生得bug
为了提交代码方便,在idea中增加了忽视文件选项. 这一修改可把自己坑惨了,更改代码运行代码得时候,连打印都没出来,对照了半天代码 也没发现是哪里得错误,后来想到某次修改代码后class文件并没改变, ...
- vm virtualbox 里的ubuntu挂载windows的文件夹
1.先在virtualbox里设置好共享文件夹 如右图所示: 共享文件夹-添加共享文件夹 里面: 选择好 共享文件夹路径,起好 共享文件夹名称,下面都不用选. 假设共享文件名是ShareD, 2. 然 ...
- python特性
# for用法 for i in range(0,100,2): print(i) n = 0 # while用法 while n < 100: print(n) n += 2 else: pr ...
- centos7下自动备份mysql数据库
环境:centos7 .mysql5.7 第一步:创建自动备份脚本文件 mkdir backup cd backup touch backup.sh 第二步:在备份脚本文件中写入备份脚本 vim ba ...
- JUC-线程间通信
面试题: 两个线程,一个线程打印1-52,另一个打印字母A-Z打印顺序为12A34B...5152Z, 要求用线程间通信 线程间通信:1.生产者+消费者2.通知等待唤醒机制 多线程编程模版中 1.判断 ...
- 一次m2eclipse的安装大坑经历之http://m2eclipse.sonatype.org/sites/m2e
m2eclipse 插件的安装在<Maven 实战>这本书上是这么说的: ”由于Eclipse默认没有集成对Maven的支持,幸运的是由Maven之父Jason Van Zyl创立的Son ...
- batch_idx作用
batch_idx作用 待办 batch_idx * len(data) 这里的batch_idx 就是数组分组之后的组号,len(data)就是每组的数据量,这个式子表示的就是总共已经训练的数据总数 ...