转: seajs知识点与cmd规范
在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供大家更深入的了解!因为我们都知道 AMD规范: 是 RequireJS 在推广过程中对模块定义的规范化产出的,而CMD规范: 是SeaJS 在推广过程中对模块定义的规范化产出的。
什么是CMD规范?
在CMD中 一个模块就是一个文件,如下代码所示:
//基本格式如:define(id, deps, factory)
// 比如如下代码
define('hello',['jQuery'],function(require, exports, module) {
// 模块代码
});
define是一个全局函数,主要是用来定于模块的。其中如上'hello'就是模块名称,['jquery']是依赖项,也可以依赖于多项可以如下写法['jquery','',''],分别用逗号隔开,其中上面的id(模块名称)和deps(被依赖项) 是可以省略的。省略时,那么模块名称就是文件名称。比如我有个文件叫a.js,那么我定义模块时候如下代码所示:
define(function(require, exports, module) {
// 模块代码
});
那么如果我想在b.js代码里面要依赖于a.js的话,那么我可以直接这样写:
define(function(require,exports,module){ var a = require('a')});
但是注意:带有id 和 deps 是不属于CMD规范的。所以在seaJS里面 一般的写法是不带模块名称和依赖项的。就是如上的代码格式。
下面看看 factory 在seajs里面 factory既可以是函数,对象或者字符串。factory为对象 字符串时候,表示该模块的接口就是该对象或者字符串,如下可以定义一个json对象。
define({"aa":'bb'});和jsonp格式类似,不过这样的数据对象是高度可用的,而且因为是静态对象,他也是CDN友好的,可以提高性能,比如说我们 有个省市区这么一个jSON格式要返回我们前端,如果以传统JSONP的形式提供给客户端,它必须提供一个callback函数名,根据这个函数名动态生成返回数据,这使得标准JSONP数据一定不是CDN友好的。那么我们可以利用这种格式
define({
provinces: [
{
name: '上海',
areas: ['浦东新区', '徐汇区']},
{
name: '江苏',
cities: ['南京', '南通']}
//.....
]
});
假设这个文件名为china.js,那么如果某个模块需要这个数据,只需要:
define(['china'], function(china){
//在这里使用中国省市数据
});
当factory为函数时,表示该模块的构造方法,执行该构造方法,可以得到模块向外提供的接口。默认会传入三个参数require,exports,module.那么我们先来看看require参数吧! require:
require是一个方法,他可以解决依赖,用于获取其他模块提供的接口,比如下面的a.js代码如下
define(function(require, exports) {
exports.a = function(){
// 很多代码
};
});
那么现在我想在b.js里面调用a.js里面的a方法。我们可以如下做:
define(function(require,exports){
var fun = require('./a');
console.log(fun.a()); // 就可以调用到及执行a函数了。
})
require.async(id,callback) :
require.async: 方法用来在模块内部异步加载模块,并在加载完成后执行指定回调。callback参数可选。比如如下代码:
define(function(require, exports, module) { // 异步加载一个模块,在加载完成时,执行回调
require.async('./b', function(b) {
b.doSomething();
}); // 异步加载多个模块,在加载完成时,执行回调
require.async(['./c', './d'], function(c, d) {
c.doSomething();
d.doSomething();
}); });
注意: require是同步往下执行的,而require.async 则是异步回调执行。
require.resolve(id)
使用模块系统内部的路径解析机制来解析并返回模块路径。该函数不会加载模块,只返回解析后的绝对路径。
define(function(require, exports) { console.log(require.resolve('./b'));
// ==> http://example.com/path/to/b.js });
exports
exports:是一个对象,用来向外提供模块接口。
比如还是上面的代码:如下a.js里面
define(function(require, exports) {
exports.a = function(){
// 很多代码
};
});
或者如下书写:
define(function(require, exports) {
return {
i: 'a',
a: function(){
// 执行相应的代码
}
}
});
那么如果我在b.js里面想要调用a.js里面的a方法,由于a.js使用exports对外提供了接口a方法,那么在b.js里面 我们只需要先这样 var fun = require('./a');然后执行fun.a();就可以执行a方法了。
module
module 是一个对象,上面存储了与当前模块相关联的一些属性和方法。其中exports是
module.exports的一个引用。
moudle.id
模块的唯一标识。如下代码:
define('id', [], function(require, exports, module) {
// 模块代码
});
module.uri
根据模块系统的路径解析规则得到的模块绝对路径。
define(function(require, exports, module) {
console.log(module.uri);
// ==> http://example.com/path/to/this/file.js
});
等等属性 具体可以看seajs官网。原理是一样的 因为seajs也采用的是CMD规范。
转: seajs知识点与cmd规范的更多相关文章
- SeaJS之shim插件:解决非cmd规范的插件与sea的区别
SeaJS 中的模块默认都遵守 CMD 规范,但现实中已存在大量普通 JavaScript 类库,比如 jQuery.Underscore 等.使用 shim 插件,可以将这些普通 JS 文件转换成 ...
- CMD规范学习笔记——基于SEAJS实现
CMD(Common Module Definition):该规范明确了模块的书写格式和基本交互规则.通常一个模块就是一个JS文件. 通过define关键字来定义模块,最基本的格式为: define( ...
- AMD规范(RequireJS)、CMD规范(SeaJS)、CommonJS(BravoJS)规范的辨析
首先,AMD,CMD,CommonJS都实现了文件模块化. 对于依赖的模块:AMD是提前执行:CMD是延迟执行: AMD是依赖前置,CMD是依赖就近: AMD官方解释:https://github.c ...
- JavaSript模块规范 - AMD规范与CMD规范介绍
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题 ...
- AMD规范与CMD规范的区别
AMD规范与CMD规范的区别是什么? 在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供 ...
- JavaSript模块规范 - AMD规范与CMD规范介绍(转)
JavaSript模块规范 - AMD规范与CMD规范介绍 JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者 ...
- AMD规范与CMD规范的区别是什么?
AMD规范与CMD规范的区别是什么? 在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供 ...
- JavaSript模块化-AMD规范与CMD规范
JavaScript模块化 在了解AMD,CMD规范前,先来简单地了解下什么是模块化,模块化开发. 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处 ...
- JavaSript模块规范 - AMD规范与CMD规范介绍 (转载lovenyf.blog.chinaunix.net)
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题 ...
随机推荐
- [转载]HDFS的'Block'和MapReduce的'Split'之间的关系和区别
http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html hadoop的分块有两部分,其中第一部分更为人熟知一点. 第一部分就 ...
- Google AdSense的CPC点击单价超百度联盟(2014)
很久没有关注AdSense了,一是访问不太方便,二是网站投放AdSense广告相当少,估计每天收入都不到1美元,所以就懒得去看了,一般都是几个月才去看一看. AdSense还行吗? AdSense点击 ...
- 用NDKr9编译最新ffmpeg2.0.1到android平台
原文来自http://www.mingjianhua.com 本文参照 http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ 在linux下的 ...
- Github实例教程-创建库、创建主页
以README文件为实例,具体介绍github的使用过程 请先下载git,然后配置下面内容: ( 我的系统是debian,其它版本号的UNIX/Linux有区别),windows的临时不清楚. (一) ...
- The Painter's Partition Problem Part I
(http://leetcode.com/2011/04/the-painters-partition-problem.html) You have to paint N boards of leng ...
- input file 模拟
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 用PyRestful快速构建Tornado下REST APIs 的支持
一.安装PyRestful库 $ pip install pyrestful 二.使用案例 (一)books_service.py # -*- coding: utf-8 -*- import tor ...
- android--email发送邮件,文本还有附件形式的邮件
1.首先用的jar包为javaemail 下载地址: https://yunpan.cn/cB3kY8WIvcGtU (提取码:e042) 2.工具包 package com.kllayhello.u ...
- fork出的子进程和父进程的继承关系【转载】
[原文地址]http://blog.163.com/dengjingniurou@126/blog/static/53989196200962924412524/ fork出的子进程和父进程的继承关系 ...
- cocos2d-x spine 加载粒子特效
spine骨骼加载粒子效果 将粒子效果加到骨骼上,update位置和角度.h#ifndef __HOMESCENE_H__#define __HOMESCENE_H__#include "c ...