前一篇文章了解了什么是模块,这一篇就简单介绍一下如何定义并加载一个模块。

我所了解的三种模块加载方式分别是CommonJS、AMD和CMD
网上关于这三种模块加载方式讲解的文章很多,我就简单的做个介绍,如果想深入了解一下可以去网上查阅一下相关的资料。

(1)CommonJS
在CommonJS中,一个单独的文件就是一个模块。被调用模块内使用exports暴露接口,调用模块使用require调用暴露出来的接口。
示例如下:
1 // student.js
2 // 私有变量
3 var a = 123;
4 function add(student) {
5 console.log('Add student:' + student);
6 }
7 // exports对象上的方法和变量是外部可访问的
8 exports.add = add;
1 // 使用require加载student.js模块
2 var student = require('./student.js');

CommonJS加载模块是“同步”的,也就是说,如果我们要调用被调用模块中的公共方法和变量,一定要等被调用模块加载完毕后才可以。用于服务端的NodeJS就采用的CommonJS来管理模块。但是在浏览器端,同步加载会因为收到网络环境的影响存在很大的不确定性,所以CommonJS不适合于浏览器端。


如果在浏览器环境下想要从服务器加载模块,就必须使用“异步”的方式。所以就出现了AMD和CMD解决方案。


(2)AMD(Asynchromous Module Definition)
requireJS就是一种使用AMD异步加载模块的管理插件。AMD模块支持对象,函数,构造器,字符串,JSON等各种类型的模块。
 
AMD规范使用define方法定义模块:
 1 //define(param1,param2) 通过define方法定义模块
2 //@param1: 数组,元素为引入的依赖模块
3 //@param2: 回调函数,通过形参传入依赖
4 define(['firstModule','secondModule'],function(firstModule,secondModule){
5 function foo(){
6 firstModule.test();
7 }
8 // 暴露foo()
9 return {foo:foo};
10 });

同时,AMD允许使用define方法定义模块是兼容CommonJS规范,可以使用require和exports。

1 define(function(require,exports,module){
2 var reqModule = require("./firstModule");
3 reqModule.test();
4
5 exports.pubPort = function(){
6 // 函数体
7 }
8 });

(3)CMD
CMD和AMD的区别主要体现在对依赖模块的执行时机上,AMD是“依赖前置”。主张提前加载所需模块,CMD是“依赖就近”。也就是可以用到的时候再加载。有点类似于Java中的“饿汉模式”和“懒汉模式”。
从requireJS 2.0开始,也可以延迟加载了。
举个栗子:
 1 // AMD——依赖前置
2 define(['./a','./b'],function(a,b){
3 //提前声明要依赖的模块
4 });
5
6 // CMD
7 define(function(require,exports,module){
8 //依赖可以就近写
9 var a = require('./a');
10 a.test();
11
12 //软依赖
13 if(status){
14 var b = require('./b');
15 b.test();
16 }
17 });
这里有个名词叫软依赖,我个人理解软依赖就是不一定依赖,硬依赖就是一定会依赖的模块,软依赖就是需要才依赖,不需要就不依赖,根据status判断。

(4)UMD
UMD——Universal Module Definition,通用的模块定义
UMD等于CommonJS加上AMD。UMD的工作其实就是做了一个判断:
    - 先判断当前环境对NodeJs支持的模块是否存在,存在就用Node.js模块模式(exports)。
    - 如果不支持,就判断是否支持AMD(define),存在就使用AMD方式加载。
 

JavaScript模块化思想之CommonJS、AMD、CMD、UMD的更多相关文章

  1. Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  2. JavaScript模块化CommonJS/AMD/CMD/UMD/ES6Module的区别

    目录 JS-模块化进程 原始的开发方式 CommonJS && node.js AMD && Require.js CMD && Sea.js UMD ...

  3. JavaScript模块化演变 CommonJs,AMD, CMD, UMD(一)

    原文链接:https://www.jianshu.com/p/33d53cce8237 原文系列2链接:https://www.jianshu.com/p/ad427d8879cb 前端完全手册: h ...

  4. CommonJS/AMD/CMD/UMD

    为什么会有这几种模式? 起源:Javascript模块化 模块化就是把复杂问题分解成不同模块,这样可维护性高,从而达到高复用,低耦合. 1.Commonjs CommonJS是服务器端模块的规范,No ...

  5. 前端模块化小总结—commonJs,AMD,CMD, ES6 的Module

    随着前端快速发展,需要使用javascript处理越来越多的事情,不在局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,这时需要一种新的模式 --模块化编程 模块化的理解:模块化是一种处理 ...

  6. 关于 CommonJS AMD CMD UMD 规范的差异总结

    一.CommonJS 主要是用于服务器端的规范,比如目前的nodeJS. 根据CommonJS规范,一个单独的文件就是一个模块.每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函 ...

  7. 关于 CommonJS AMD CMD UMD 规范的差异总结(转)

    根据CommonJS规范,一个单独的文件就是一个模块.每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的. // foo.js var ...

  8. 关于 CommonJS AMD CMD UMD

    1. CommonJS CommonJS 原来叫 ServerJS, 是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用requi ...

  9. CommonJS/AMD/CMD/UMD概念初探

    1.CommonJS是一种规范,NodeJS是这种规范的实现. 1.1.CommonJS 加载模块是同步的,所以只有加载完成才能执行后面的操作. 参考: http://www.commonjs.org ...

随机推荐

  1. 22.Odoo产品分析 (三) – 人力资源板块(3) – 休假管理(1)

    查看Odoo产品分析系列--目录 安装休假管理模块,出现"休假"菜单:  休假管理为了更方便直观的看出员工的休假信息,将信息以日历视图显示出来.  在日历中点击某一天时,可以创建改 ...

  2. Python 标准类库-数据类型之copy-深拷贝浅拷贝操作

    标准类库-数据类型之copy-深拷贝浅拷贝操作   by:授客 QQ:1033553122 Python中赋值并不会拷贝对象,只是创建目标和对象的绑定关系. copy.copy(x) 返回x的浅拷贝 ...

  3. Flask路由与蓝图Blueprint

    需求分析: 当一个庞大的系统中有很多小模块,在分配路由的时候怎么处理呢?全部都堆到一个py程序中,调用@app.route? 显然这是很不明智的,因为当有几十个模块需要写路由的时候,这样程序员写着写着 ...

  4. PyCharm 在PyCharm中使用GitHub

    PyCharm是当前进行Python开发,尤其是Django开发最好的IDE,GitHub是程序员的圣地,几乎人人都在用,就不详细介绍两者了. 本文假设你对PyCharm和Github都有一定的了解, ...

  5. (转)Debian 安装与卸载包命令

    1.APT主要命令apt-cache search  ------package 搜索包sudo apt-get install ------package 安装包sudo apt-get remov ...

  6. [20180928]如何能在11g下执行.txt

    [20180928]如何能在11g下执行.txt --//链接问的问题: http://www.itpub.net/thread-2105467-1-1.html create table test( ...

  7. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...

  8. 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果

    利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...

  9. PE 添加系统管理员账号(域控可加)转

    使用U盘制作一个PE系统,这里推荐老毛桃或者大白菜:开机进入Bios,选择U盘启动:进入U盘启动画面后,选择一个PE系统:进入PE系统后,我们去本机系统盘,将 C:/Windows/System32/ ...

  10. 基于centOS7:新手篇→nginx安装

    一.首先安装编译工具和库 #安装make zlib gcc OpenSSL yum -y install make zlib zlib-devel gcc-c++ libtool openssl op ...