在某些库中,经常会看到函数最前面有一个分号。其实是为了防止自动化工具拼接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. ELKStack-生产案例项目实战(十一)

    ELKStack-生产案例项目实战 1.收集ES和apache日志,入redis input { file { path => "/etc/httpd/logs/access_log& ...

  2. Mask-RCNN数据集制作

    转自https://blog.csdn.net/pingushen2100/article/details/80513043 一.Mask-RCNN数据集 1.1 训练Mask-RCNN用的到的文件有 ...

  3. C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)

    前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...

  4. ThinkPHP框架学习(二)

    在上一节中,我主要讲到了如何获取ThinkPHP框架,以及虚拟目录和虚拟主机的配置.准备工作完成之后,就可以利用ThinkPHP去部署项目了. 先在工作目录(D:/zend/workspace)下新建 ...

  5. Repeater控件的分页实现

    本文讲解Repeater控件与PagedDataSource相结合实现其分页功能.PagedDataSource 类封装那些允许数据源控件(如 DataGrid.GridView)执行分页操作的属性. ...

  6. 20155315 2016-2017-2 《Java程序设计》第七周学习总结

    教材学习内容总结 第12章 Lambda语法 Lambda定义 一个不用被绑定到一个标识符上,并且可能被调用的函数. 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译 ...

  7. es6笔记(5)Map数据结构

    概要 字典是用来存储不重复key的Hash结构.不同于集合(Set)的一点,字典使用的是[key,value]的形式来存储数据. JavaScript的对象(Object:{})只能用字符串当做key ...

  8. java学习第03天(运算符、语句)

    5.运算符 (1)算数运算符 //算数运算符:+ - * / %(取余) //++ --(自增,就是在原有数据基础上+1,再赋给原有数据) ///int x = 6370; //x = x/1000* ...

  9. the error about “no such file or directory”

    CHENYILONG Blog the error about "no such file or directory" when you get the question like ...

  10. 多源复制遇到CREATE USER FAILED错误

    MySQL Multi-Source Replication enables a replication slave to receive transactions from multiple sou ...