在某些库中,经常会看到函数最前面有一个分号。其实是为了防止自动化工具拼接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的更多相关文章

  1. 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz

    浅析JS中的模块规范(CommonJS,AMD,CMD)   如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已.     ...

  2. JS中的模块规范(CommonJS,AMD,CMD)

    JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧, ...

  3. 关于commonjs,AMD,CMD之间的异同

    1.简介 随着前端业务复杂度的增加,模块化成为一个大的趋势.而在ES6还未被浏览器所支持的情况下,commonjs作为ES6中标准模块加载方案,在客服端中的支持情况并不好,现在在客服端中有2中模块化的 ...

  4. 再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现” ...

  5. JavaScript模块化思想之CommonJS、AMD、CMD、UMD

    前一篇文章了解了什么是模块,这一篇就简单介绍一下如何定义并加载一个模块. 我所了解的三种模块加载方式分别是CommonJS.AMD和CMD 网上关于这三种模块加载方式讲解的文章很多,我就简单的做个介绍 ...

  6. CommonJS、AMD、CMD、NodeJs、RequireJS到底有什么联系?

    JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范,本文包括这三个规范的来源及对应的产物的原理. 一.C ...

  7. CommonJS与AMD、CMD

    随着JS模块化编程的发展,处理模块之间的依赖关系变得至关重要,随后诞生了CommonJS.AMD与CMD规范,但es6的import/export能代替他们,但因为本人所使用的webpack也支持前三 ...

  8. CommonJS、AMD与CMD

    自从有了模块,我们可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...

  9. 对于模块加载:ES6、CommonJS、AMD、CMD的区别

    运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有 ...

随机推荐

  1. 如何查去别人的ip,进行定位

  2. Spark记录-Scala数组

    Scala提供了一种数据结构叫作数组,数组是一种存储了相同类型元素的固定大小顺序集合.数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用. 可以声明一个数组变量,例如:numbers,使 ...

  3. MyBatis中传入参数parameterType类型详解

    前言 Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型.本文主要给大家 ...

  4. c#的事件用法——实现下载时发生的事件

    //下载时发出的事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  5. 20155204 2016-2017-2 《Java程序设计》第8周学习总结

    学号 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 想要取得channel的操作对象,可以使用channels类,它定义了静态方法newChannel(). ...

  6. linux - 流量切分线路

    流量切分线路方式 # 程序判断进入IP线路,设置服务器路由规则控制返回 vi /etc/iproute2/rt_tables #添加一条策略 bgp2 #注意策略的序号顺序 ip route add ...

  7. JavaScript 计时

    http://www.w3school.com.cn/js/js_timing.asp JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码 ...

  8. 华中邀请赛现场赛F题 Seats

    题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1552 解题报告:题目意思应该很清楚,就是有n个人,分别属于7个班级,然后他们坐成 ...

  9. 第9月第9天 CTFramesetterCreateWithAttributedString

    1. NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."; UIFont *uiFont = [UIFont ...

  10. Redis持久化——AOF

    一.是什么? AOF是以日志的形式来记录每个写操作,将Redis执行过的所有写操作记录下来(读操作不做记录),只许追加文件不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis ...