seajs api 学习小结(模块化开发)

转载:http://www.w3cfuns.com/blog-5434745-5404089.html

seajs 官方api文档: https://github.com/seajs/seajs/issues/266
seajs 简易api文档:http://yslove.net/seajs/


1.加载多个模块
当模块a  和 模块b 都加载完成时,开始执行回调函数
seajs.use(['./a','./b'],function(a,b){
     //执行回调函数
});

2.加载单个模块
当加载摸一个模块的时候,执行回调函数
seajs.use('./main',function( main ){
     //加载模块main 并在加载完成之后执行回调
     main.init( );
});

3.seajs.use 与 dom ready 之间的关系
注意:seajs.use 与 DOM ready 事件没有任何关系。如果某些操作要确保在 DOM ready 后执行,需要使用jquery 等类库来保证,比如:

seajs.use(['jquery','./main'],function($,main){

     //通过引入jquery 加入$(document).ready

     $(document).ready(function(){

          main.init();
     });

});



4.seajs 配置相关
(1) alias 属性:alias 用于别名配置:可以通过模块名更方便的加载模块,可以设置url 也可以设置文件路径
  seajs.config({
     base:'../sea-modules/',
     alias:{
        "jquery":"http://static.alipayobjects.com/jquery//1.7.2/jquery.js",(绝对路径)
         "jquery":"/jquery/1.10.1/jquery.js"(相对路径)

     }
});
(2)path 属性:设置path 很有用,可以在不影响base 的情况下,跨路径调用文件
设置路径,方便跨目录调用。通过灵活的设置path可以在不影响base的情况下指定到某个目录。
举个栗子:
seajs.config({
               alias:{
                    //设置要引入模块的别名
                    'module2':'module2.js',
                    'datajson':'datajson.js'
               },
               paths:{
                    //路径配置
                    'jqpath':'../js' -------> 路径配置
               }
});

seajs.use(['jqpath/jquery','module2'],function($,module2){

     $(document).ready(function(){

           //xxxx   xxxx   xxxxx

     });

});

注意:这里有一个要注意的地方!!!!当我们把从sea-modules 下载下来的例子里面封装好的jquery 拿到外面来的时候,我们要注意:jquery 文件里面有句:

"function"==typeof define && define("jquery/jquery/1.10.1/jquery",[],function(){return x}))}

这是sea.js 使用过程中非常著名的错误!ID和路径匹配原则#930   https://github.com/seajs/seajs/issues/930



红字部分是要基于你现在的文件路径,进行修改的,如果你把它移动到了外面,它是根据seajs 的base 进行写的路径,所以要注意移动后一定要按base 重改,不然你会发现console.log($);为空





5.CMD 模块定义规范,在sea.js 中所有的模块定义都是遵循CMD 规范的,以下具体内容参照:https://github.com/seajs/seajs/issues/242
在CMD 模块中一个模块就是一个文件:

(1)define 用来定义模块,define(factory) 是一个函数,其参数是factory,factory 可以是一个:  函数,对象,字符串
函数:define(function(require,exports,module){});

对象:常用语一个json 文件

     define({name:'ann',age:23,fruits:['strawberry','peach']});

字符串:也可以通过定义字符串来实现模板模块

     define('I am a template. My name is {{name}}.');

(2)define 也可以接受多个参数
define( id,deps,factory);

参数解释:  id 标识,deps 依赖数组, factory 函数

id 是模块标识

deps 是模块数组依赖

id 与 deps 可以省略,通过构建工具可以自动添加和生成

(3)require 加载模块
require用来获取其他模块提供的接口,通过require.async() 可以异步加载模块, require.resolve('模块路径/模块名')解析对应的模块路径

require.async(‘jquery’);

require.resolve():  使用模块系统内部的路径解析机制来解析并返回模块路径。该函数不会加载模块,只返回解析后的绝对路径。
(4) exports 相关用法
module.exports Object: 当前模块对外提供的接口

exports.方法名 = function(){

     //xxxx   xxxx 

}

module.exports = {

     //对象!
}

eg.

a. exports.sayHello = function(){

     alert('Hello World!');

}

b. module.exports = {

     name:'ann',

     sayName:function(){

          alert(this.name);

     },

     setName:function(name){

          this.name = name;

     },

     getName:function(){

          alert(this.name);

     }

}



c. function module(){

     this.prop = "initial";

   }

   module.prototype = {

     init:function(){

          alert(this.prop);

     },

     setValue:function(value){

          this.prop = value;

     },

     getValue:function(){

          alert(this.prop);

     }

   }

   module.exports = module;





//假设上面module.exports 是定义在moduletest.js 中的,那么我们这么使用

a.返回的是方法

  define(function(require,exports,module){

      var module1 = require('./moduletest 文件路径');

      module1.sayHello();

  })

b.返回的是对象

define(function(require,exports,module){

     var module1 = require('./moduletest 文件路径');

     module1.setName('annlinkey');

     module1.sayName();

});



c.返回的是构造函数

define(function(require,exports,module){

  var Module1 = require('./moduletest 文件路径');

  var module1ins = new Module1();

  module1ins.init();

  module1ins.setValue('ann');

  module1ins.getValue();

});



小结:

这就是 CMD 模块定义规范的所有内容。经常使用的 API 只有 define, require, require.async, exports,module.exports 这五个。其他 API 有个印象就好,在需要时再来查文档,不用刻意去记。
与 RequireJS 的 AMD 规范相比,CMD 规范尽量保持简单,并与 CommonJS 和 Node.js 的 Modules 规范保持了很大的兼容性。通过 CMD 规范书写的模块,可以很容易在 Node.js 中运行,后续会介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值