前端AMD、CMD和commonJs-前端知识
前端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主要解决两个问题
- 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
- 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);
- id:可选参数,用来定义模块的标识,如果没有提供该参数,脚本文件名(去掉拓展名)
- dependencies:是一个当前模块依赖的模块名称数组
- factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值
在页面上使用require函数加载模块
require([dependencies], function(){});
require()函数接受两个参数
- 第一个参数是一个数组,表示所依赖的模块
- 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块
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> <div>这是一个提示样式</div></body></html>
CommonJs:是主要为了JS在后端的表现制定的,他是不适合前端的,为什么这么说呢?前端主要的问题是1.带宽,2.加载时需要通过网络加载3.代码需要从一个服务器端分发到多个客户端执行
CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。
区别:
1、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
2、CMD推崇就近依赖,只有在用到某个模块的时候再去require
本文参考:
前端AMD、CMD和commonJs-前端知识的更多相关文章
- AMD,CMD,UMD,CommonJS
http://www.jianshu.com/p/bd4585b737d7 http://www.jianshu.com/p/09ffac7a3b2c
- js模块系统 - amd|cmd|commonjs|esm|umd
写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...
- 前端模块化(AMD和CMD、CommonJs)
知识点1:AMD/CMD/CommonJs是JS模块化开发的标准,目前对应的实现是RequireJs/SeaJs/nodeJs. 知识点2:CommonJs主要针对服务端,AMD/CMD主要针对浏览器 ...
- vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结
vue—你必须知道的 目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...
- 研究一下javascript的模块规范(CommonJs/AMD/CMD)
最近写react需要使用nodejs作为开发环境,需要通过npm安装一些第三方的依赖库,因此慢慢感觉到nodejs基础薄弱对我带来了一些不安全感,尤其是javascript模块这一块听到了很多概念,比 ...
- JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...
- js模块化编程之CommonJS和AMD/CMD
js模块化编程commonjs.AMD/CMD与ES6模块规范 一.CommonJS commonjs的require是运行时同步加载,es6的import是静态分析,是在编译时而不是在代码运行时.C ...
- 关于 CommonJS AMD CMD UMD
1. CommonJS CommonJS 原来叫 ServerJS, 是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用requi ...
- FW: AMD, CMD, CommonJS和UMD
javascript 我是豆腐不是渣 4月5日发布 推荐 2 推荐 收藏 32 收藏,486 浏览 今天由于项目中引入的echarts的文件太大,requirejs经常加载超时,不得不分开来加载ech ...
随机推荐
- 《JAVA与模式》之原型模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...
- 【bzoj4259】 残缺的字符串 FFT
又是一道FFT套路题 思路可以参考bzoj4503,题解 我们对串S和串T中出现的*处全部赋值为0. 反正最终的差异度式子大概就是 $C[i]=\sum_{j=0}^{|T|-1}S[i+j]T[j] ...
- VSTO学习(六)——创建Outlook解决方案
本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案的,所以本专题中将为大家介绍下Outlook相关的内容.我 ...
- Web开发常用在线工具
http://tool.oschina.net/ 爬去网页工具: http://www.keydatas.com/product
- 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)
1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...
- 第6章—渲染web视图—使用Thymeleaf
使用Thymeleaf 长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf是原生的,不依赖于标签库.它能够在接受原始HTML的地方 ...
- LogCat里的错误提示 FATAL EXCEPTION: main
程序一运行闪退. 原因为包冲突,将冲突的包删除即可.
- WordPress 主题教程
创建 WordPress 主题其实不难,只要你从现在开始认真学习这个教程,从零一步一步开始,你就会成为一个 WordPress 主题制作高手,至少你会修改现有主题. 下面是一个从零开始制作 WordP ...
- C++中对象模型
C++面向对象语言一大难点是继承,但又是不得不掌握的.简单的继承是很容易理解的,但是当涉及到多继承,设计到虚函数的继承,特别是涉及到虚继承时,问题就会变得复杂.下面的内容来自参考资料中的三篇文章.C+ ...
- Python远程连接主机之paramiko模块
Python的paramiko模块能够连接远程主机,并在该主机上执行命令,和该主机之间进行文件传输.paramiko支持用明文密码登录远程主机和秘钥登录.使用之前要安装一下这个模块哈,pip inst ...