前端AMD和CMD是在模块化的基础上产生并且得到大幅度的引用的。

AMD 即Asynchronous Module Definition(点击链接可以查看AMD面试题),中文名是异步模块定义的意思。它是一个在浏览器端模块化开发的规范;

CMD 即Common Module Definition ,中文名是同步模块定义的意思,是SeaJs在推广过程中对模块规范化的定义的产出。该规范明确了模块的基本书写格式和基本交互规则

CommonJs:官方网址:http://www.commonjs.org/    CommonJs用在服务器端,AMD和CMD用在浏览器环境

这三者的主要作用是:

1.javaScript模块化加载而生的

2.便于团队的人员的协作,代码不至于很乱

3.在网络请求中的记载时间的优化

AMD使用方法:

AMDjavaScript不支持,所以出现我们经常用的requireJs,实际上AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出

requireJS主要解决两个问题

  1. 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
  2. js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长

具体写法如下:

1.在文件中首先要引入require.js,

2.定义一个模块

3.加载模块

1 define(function(){
2 var keyboard = {
3 'init':function(){
4 console.log(2);
5 }
6 }
7 return keyboard;
8 })

这是我们创建的一个文件keyboard.js;

<html>
<head>
<meta charset="utf-8">
<title>requireJs</title>
<script src="./require.js"></script>
</head>
<body>
<div>代码测试</div>
<script>
require(['./keyboard'],function(keyboard){
keyboard.init();
})
</script>
</body>
</html>

注意require的语法,这里引入是可以省略文件后缀.js的,后面function参数定义了这个模块的名称,函数内部直接调用就可以了。下面是编译后的代码,这里我们会看到我们引用的keyboard.js多了一个async属性,这里实现了异步加载。

语法如下:

requireJS定义了一个函数 define,它是全局变量,用来定义模块

define(id?, dependencies?, factory);
  1. id:可选参数,用来定义模块的标识,如果没有提供该参数,脚本文件名(去掉拓展名)
  2. dependencies:是一个当前模块依赖的模块名称数组
  3. factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值

在页面上使用require函数加载模块

require([dependencies], function(){});

require()函数接受两个参数

  1. 第一个参数是一个数组,表示所依赖的模块
  2. 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块

require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题

CMD使用方法:

1.引入seajs

2.定义模块文件

3.引入模块

4.seajsAPI:http://yslove.net/seajs/

代码示例如下:

<html>
<head>
<meta charset="utf-8">
<title>requireJs</title>
<script src="./seajs.js"></script>
</head>
<body>
<div>代码测试</div>
<script>
seajs.use('./keyboard',function(keyboard){
keyboard.init();
})
</script>
</body>
</html>
/*define(function(){
var keyboard = {
'init':function(){
console.log(2);
}
}
return keyboard;
})*/
//seajs
define(function(require, exports, module) { // 模块代码
console.log(require,exports,module);
module.exports ={
'init':function(){
console.log(2);
}
} });
/*define(function(){
var keyboard = {
'init':function(){
console.log(2);
}
}
return keyboard;
})*/
//seajs
/*define(function(require, exports, module) { // 模块代码
console.log(require,exports,module);
module.exports ={
'init':function(){
console.log(2);
}
} });*/
//seajs第二种定义
define(function(require, exports, module) { // 模块代码
console.log(require,exports,module);
return {
'init':function(){
console.log(2);
}
} });

从上面可以看出,通过seajs定义模块时,需要注意写法,一种是直接return一个对象,另一种是module.exports,再看一下浏览器解析的效果

<html><head>
<meta charset="utf-8">
<title>requireJs</title>
<script src="./seajs.js"></script>
</head>
<body style="">
<div>代码测试</div>
<script>
seajs.use('./keyboard',function(keyboard){
keyboard.init();
})
</script> </body></html>

使用时,需要使用seajs.use(),更多用法,可以参考前面的api

CMD异步用法:

define(function(require, exports, module) {

  // 模块代码
console.log(require,exports,module);
return {
'init':function(){
var $body = document.getElementsByTagName('body')[0];
var html = '<div>这是一个提示样式</div>';
$body.append(html);
}
} });
/*define(function(){
var keyboard = {
'init':function(){
console.log(2);
}
}
return keyboard;
})*/
//seajs
/*define(function(require, exports, module) { // 模块代码
console.log(require,exports,module);
module.exports ={
'init':function(){
console.log(2);
}
} });*/
//seajs第二种定义
define(function(require, exports, module) {
var loading = '';
// 模块代码
require.async('./loading',function(loading){
loading = loading.init();
}); return {
'init':function(){
console.log(2);
},
'loadingInit':function(){
console.log(loading);
}
} });
<html>
<head>
<meta charset="utf-8">
<title>requireJs</title>
<script src="./seajs.js"></script>
</head>
<body>
<div>代码测试</div>
<script>
seajs.use('./keyboard',function(keyboard){
keyboard.init();
keyboard.loadingInit();
})
</script>
</body>
</html>

在编译后的html中没有加载loading.js,keyboard.js,但是在network中会有显示,

<html><head>
<meta charset="utf-8">
<title>requireJs</title>
<script src="./seajs.js"></script>
</head>
<body style="">
<div>代码测试</div>
<script>
seajs.use('./keyboard',function(keyboard){
keyboard.init();
keyboard.loadingInit();
})
</script> &lt;div&gt;这是一个提示样式&lt;/div&gt;</body></html>

CommonJs:是主要为了JS在后端的表现制定的,他是不适合前端的,为什么这么说呢?前端主要的问题是1.带宽,2.加载时需要通过网络加载3.代码需要从一个服务器端分发到多个客户端执行

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

区别:

1、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块 
2、CMD推崇就近依赖,只有在用到某个模块的时候再去require

本文参考:

前端模块化

SeaJs

require.js

前端AMD、CMD和commonJs-前端知识的更多相关文章

  1. AMD,CMD,UMD,CommonJS

    http://www.jianshu.com/p/bd4585b737d7 http://www.jianshu.com/p/09ffac7a3b2c

  2. js模块系统 - amd|cmd|commonjs|esm|umd

    写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...

  3. 前端模块化(AMD和CMD、CommonJs)

    知识点1:AMD/CMD/CommonJs是JS模块化开发的标准,目前对应的实现是RequireJs/SeaJs/nodeJs. 知识点2:CommonJs主要针对服务端,AMD/CMD主要针对浏览器 ...

  4. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  5. 研究一下javascript的模块规范(CommonJs/AMD/CMD)

    最近写react需要使用nodejs作为开发环境,需要通过npm安装一些第三方的依赖库,因此慢慢感觉到nodejs基础薄弱对我带来了一些不安全感,尤其是javascript模块这一块听到了很多概念,比 ...

  6. JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)

    前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...

  7. js模块化编程之CommonJS和AMD/CMD

    js模块化编程commonjs.AMD/CMD与ES6模块规范 一.CommonJS commonjs的require是运行时同步加载,es6的import是静态分析,是在编译时而不是在代码运行时.C ...

  8. 关于 CommonJS AMD CMD UMD

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

  9. FW: AMD, CMD, CommonJS和UMD

    javascript 我是豆腐不是渣 4月5日发布 推荐 2 推荐 收藏 32 收藏,486 浏览 今天由于项目中引入的echarts的文件太大,requirejs经常加载超时,不得不分开来加载ech ...

随机推荐

  1. 【hdu6121】 Build a tree 简单数学题

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6121 我好像推得挺久的诶..... 题目大意:给你一棵有$n$个点的树,根节点为$0$,对于其余节点 ...

  2. Windows server 2008 R2 安装AD域证书

    参考文档: http://blog.51cto.com/gaowenlong/1969585 http://blog.51cto.com/gaowenlong/1969586 安装后打开证书颁发机构 ...

  3. Ubuntu Cannot run program "../SDK/build-tools/xxx/aapt": erro = 2 No such file or directory

    64位ubuntu Android Studio  Gradle编译时出现如下报错: java.io.IOException: Cannot run program "/home/king/ ...

  4. 3、Xamarin Forms 调整安卓TabbedPage 下置

    降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份.   教程晦涩难懂是我的错误. 对于默认的TabbedPage 上面进行页面切换 上面是安卓默认的情况 对我们大部分人来说都 ...

  5. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...

  6. 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库

    使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...

  7. PHP中 LFI Local File Include,本地文件包 漏洞

    在allow_url_include=On就是远程文件包含了,假设这里为off,那就只能本地包含了. 1.       包含上传文件 只要目标服务器支持上传,不管是jpg,txt,gif等都可以,在其 ...

  8. Apache版本hadoop-2.6.0.tar.gz平台下搭建Hue

    不多说,直接上干货! http://archive.apache.org/dist/ http://www.cnblogs.com/smartloli/p/4527168.html http://ww ...

  9. 微信小程序开发-概述

    微信小程序开发-概述 一.小程序申请&APPID 登录微信平台申请成为小程序开发者,小程序不可直接使用服务号或订阅号的AppID,需要登录微信公众平台管理后台,在网站的"设置&quo ...

  10. 配置alibaba的yum 源

    1, 进入yum源目录 cd /etc/yum.repos.d 2, 备份系统yum配置文件 sudo mv CentOS-Base.repo CentOS-Base.repo.bak 3, 下载al ...