博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转: seajs知识点与cmd规范
阅读量:6091 次
发布时间:2019-06-20

本文共 3012 字,大约阅读时间需要 10 分钟。

在比较之前,我们得先来了解下什么是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规范。

转载地址:http://fjlwa.baihongyu.com/

你可能感兴趣的文章
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>
Mysql利用binlog恢复数据
查看>>
我的友情链接
查看>>
用yum安装mariadb
查看>>
一点IT"边缘化"的人的思考
查看>>
WPF 降低.net framework到4.0
查看>>
搭建一个通用的脚手架
查看>>