commonjs,amd,cmd
在某些库中,经常会看到函数最前面有一个分号。其实是为了防止自动化工具拼接js时,如果前面的js文件的结尾处忘了加分号,拼接出来的代码容易挂,加分号这种行为属于防御式编程。
一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。当然,模块开发需要遵循一定的规范,否则各用各的就会乱套了。
var myModule = (function(){
var var1 = 1;
var var2 = 2;
function fn1(){
}
function fn2(){
}
return {
fn1: fn1,
fn2: fn2
};
})();
下面介绍3种常用的JS模块规范:CommonJS,AMD,CMD。
服务器端一般采用同步加载文件,一旦需要某个模块,服务器端便停下来,等待它加载好再执行。而浏览器端要保证效率,需要采用异步加载,预处理,提前将需要的模块文件并行加载好。
CommonJS是服务端规范,AMD和CMD是浏览器端规范。
一、CommonJS
定义时,不用define关键字。
CommonJS有三个全局变量module、exports和require。
// hello.js var hello = "Hello"; module.exports = hello;
// world.js
var amodule = require("./hello");
var Result = amodule + "world!";
module.exports = Result;
commonjs,有代表性的是Node.js。
一般不用额外引入什么库,使用node时,就可以像上面这样写。
如果想要对外提供接口的话,可以将接口绑定到module.exports上。
function MyModule() {
// ...
}
if(typeof module !== 'undefined' && typeof exports === 'object') {
module.exports = MyModule;
}
二、AMD
Asynchronous Module Definition,异步模块定义。
1、定义模块
A、有名,有依赖,有回调函数 define(id,dependencies,factory);
//比如
define('myModule', ['jquery'], function($) {//依赖必须一开始写好
// $ is the export of the jquery module.
$('body').text('hello world');
});
B、匿名模块,有依赖,多依赖
define(['dep1','dep2'],function(dep1,dep2){
});
//比如
define(['jquery', './math.js'], function($, math) {
// $ and math are the exports of the jquery module.
$('body').text('hello world');
});
C、匿名模块,有依赖,单依赖
define(['dep1'],function(dep1){
});
//比如
define(['jquery'], function($) {
$('body').text('hello world');
});
D、匿名模块,没有依赖,只定义简单的模块
define(function(){
});
2、加载模块
AMD也采用require()语句加载模块,但是不同于CommonJS,AMD要求两个参数:require([module], callback); 所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
define('myModule', ['jquery'], function($) {//依赖必须一开始写好
// $ is the export of the jquery module.
$('body').text('hello world');
});
// using
require(['myModule'], function(myModule) {});
AMD,最具代表性的就是RequireJS。
一般要通过script标签引入require.js,再用上述写法。
如果想要对外提供接口,可以这么做:
function MyModule() {
// ...
}
if(typeof define === 'function' && define.amd) {
define(function() { return MyModule; });
}
三、CMD
Common Module Definition,通用模块定义,一个模块就是一个文件。
define(function(require, exports, module) {
var a = require('./a');
a.doSomething();
var b = require('./b'); // 依赖可以就近书写
b.doSomething();
});
CMD,有代表性的是SeaJS。
一般要通过script标签引入sea.js,再用上述写法。
如果想要对外提供接口,可以这么做:
function MyModule() {
// ...
}
if(typeof define === 'function' && define.cmd) {
define(function() { return MyModule; });
}
或者这么做
function MyModule() {
// ...
}
if(typeof define === 'function' && define.cmd) {
define(function(require, exports, module) {
module.exports = MyModule;
}
}
四、AMD和CMD
AMD是提前执行依赖的模块(预加载),CMD是延迟执行依赖的模块(懒加载);
AMD推崇依赖前置,CMD推崇依赖就近;
AMD的一个API可以多用,CMD的API职责单一,没有全局require。
AMD用户体验好,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行。
commonjs,amd,cmd的更多相关文章
- 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz
浅析JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. ...
- JS中的模块规范(CommonJS,AMD,CMD)
JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧, ...
- 关于commonjs,AMD,CMD之间的异同
1.简介 随着前端业务复杂度的增加,模块化成为一个大的趋势.而在ES6还未被浏览器所支持的情况下,commonjs作为ES6中标准模块加载方案,在客服端中的支持情况并不好,现在在客服端中有2中模块化的 ...
- 再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现” ...
- JavaScript模块化思想之CommonJS、AMD、CMD、UMD
前一篇文章了解了什么是模块,这一篇就简单介绍一下如何定义并加载一个模块. 我所了解的三种模块加载方式分别是CommonJS.AMD和CMD 网上关于这三种模块加载方式讲解的文章很多,我就简单的做个介绍 ...
- CommonJS、AMD、CMD、NodeJs、RequireJS到底有什么联系?
JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范,本文包括这三个规范的来源及对应的产物的原理. 一.C ...
- CommonJS与AMD、CMD
随着JS模块化编程的发展,处理模块之间的依赖关系变得至关重要,随后诞生了CommonJS.AMD与CMD规范,但es6的import/export能代替他们,但因为本人所使用的webpack也支持前三 ...
- CommonJS、AMD与CMD
自从有了模块,我们可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...
- 对于模块加载:ES6、CommonJS、AMD、CMD的区别
运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有 ...
随机推荐
- Java FileReader使用相对路径读取文件
Java FileReader使用相对路径读取文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 在进行编程时需要时常更换主机进行测试,如果使用绝对路径则需要经常更改,为此使用相对路径是一个 ...
- disabled属性对form表单向后台传值的影响
在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...
- hdu 5385 The path
http://acm.hdu.edu.cn/showproblem.php?pid=5385 题意: 给定一张n个点m条有向边的图,构造每条边的边权(边权为正整数),令d(x)表示1到x的最短路,使得 ...
- CF&&CC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence
http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...
- Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression
http://codeforces.com/contest/978/problem/D 题目大意: 给你一个长度为n的b(i)数组,你有如下操作: 对数组中的某个元素+1,+0,-1.并且这个元素只能 ...
- Lua程序设计(三)面向对象实现一个简单的类
1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法)__index 赋值其实是一个func ...
- 浅谈 js 下 with 对性能的影响
这几天多次看到有博主们在写 with 的文章,这货确实非常方便,但是却是个性能杀手,所以一直都是上不得台面的.那么他究竟会让效率低下到什么程度呢?先来看下 with 是如何的便捷吧.. // 正常调用 ...
- 控制台console对象常用的一些方法
console.log():调试中最常用的方法,用于在控制台窗口显示信息. console.log(123); console.warn():输出信息时,在最前面加一个黄色三角,表示警告 consol ...
- 收集SpringBoot的一些学习资料
1:wuyouzhuguli的博客 (24篇) https://github.com/wuyouzhuguli/Spring-Boot-Demos 2:方志鹏的博客 (27篇) https://b ...
- 大数据系列之分布式计算批处理引擎MapReduce实践-排序
清明刚过,该来学习点新的知识点了. 上次说到关于MapReduce对于文本中词频的统计使用WordCount.如果还有同学不熟悉的可以参考博文大数据系列之分布式计算批处理引擎MapReduce实践. ...