seaJS简介和完整实例

什么是 seaJS ?

和requireJS相似的,seaJS 也是用JavaScript编写的JS框架,主要功能是可以按不同的先后依赖关系对 JavaScript 等文件的进行加载工作,可简单理解为JS文件的加载器,它非常适合在浏览器中使用,它可以确保所依赖的JS文件加载完成之后再加载当前的JS文件,这在大量使用JS文件的项目中可确保各个JS文件的先后加载顺序,确保避免了以前因某些原因某个文件加载慢而导致其它加载快的文件需要依赖其某些功能而出现某函数或某变量找不到的问题,这点非常有用,也是 seaJS (遵守CMD) 的主要价值所在吧;但和 requireJS (遵守AMD规范)有所区别。

快速简要知识点:

1、seajs.config({...}); //用来对 Sea.js 进行配置。
2、seajs.use(['a','b'],function(a,b){...}); //用来在页面中加载一个或多个模块。
3、define(function(require, exports, module){...}); //用来定义模块。Sea.js 推崇一个模块一个文件,遵循统一的写法:
4、require(function(require){var a = require("xModule"); ... }); //require 用来获取指定模块的接口。
5、require.async, //用来在模块内部异步加载一个或多个模块。 例如:

define(function(require){
  require.async(['aModule','bModule'],function(a,b){  // 异步加载多个模块,在加载完成时,执行回调
    a.func();
    b.func();
  })    
});

6、exports, //用来在模块内部对外提供接口。 例如:

define(function(require, exports){
    exports.varName01 = 'varValue';  // 对外提供 varName01 属性    
    exports.funName01 = function(p1,p2){  // 对外提供 funName01 方法
    ....
    }       
});

7、module.exports, 与 exports 类似,用来在模块内部对外提供接口。例如:

define(function(require, exports, module) {  
  module.exports = {  // 对外提供接口
    name: 'a',
    doSomething: function() {...};
  };
});

以上 7 个接口是最常用的,要牢记于心。

好了,简要介绍就到这。下面看一个实际例子:

这个例子的设计要求是 hellowMain.js 文件依赖 hellow.js, jQuery作为备用加载到项目中,只有等依赖文件加载完了,才进行业务的JS代码初始化工作;

首先看例子文件目录结构:

//file of folder structure
//-----------------------------------------------------
//seaJS对项目的目录一般格式如下,如userExample01下的结构
userExample01
       |-----sea-modules
       |           |--sea.js 等框架JS文件
       |-----app
       |      |----*.html 页面html文件
       |-----static
       |        |---hellow
       |              |---*.js/*.css
//-----------------------------------------------------

1、HTML 文件 index.html 注意看 seaJS 加载方式之一,见 script 标签,以及配置和调用方式;

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>seaJS</title>  
<link rel="stylesheet" href="../static/hellow/hellow.css" />  
</head>  
<body>  
<h4>seaJS 例子 example 01</h4>  
<div id="div01" class="div01">  
<span id="span01" class="span01">my TEXT 001 seaJS 例子,鼠标移动到上面看看边框变化...</span>  
</div>  
<br>  
<div id="div02" class="div02">my TEXT 002 seaJS 例子,鼠标放到上面等下看</div>  
<script type="text/javascript" src="../sea-modules/sea.js"></script>  
<script type="text/javascript">  
// seajs 的简单配置  
seajs.config({  
    //all alias path base on this//所有别名基于本路径  
    base:"../sea-modules/"  
      
    //define each self path//定义paths,本例未启用  
    //,paths:{  
    //  "jQueryPath":"jquery"  
    //}  
      
    //define each alias name here  
    ,alias:{ //auto add suffix .js  
        "jQuery1.9":"jquery/jquery-1.9.1.min"  
        ,"jQuery1.11":"jquery/jquery-1.11.0.min"  
        ,"hellow":"../hellow/hellow"  
    }  
    ,preload:'jQuery1.11'  
    ,vars:{  
       'locale':'zh-cn' //本例未启用,在模块中可用格式{key},即{locale}表示变量  
    }  
});  
//加载入口模块,加载完成后调用模块的方法  
seajs.use(['jQuery1.11','../static/hellow/hellowMain.js'],function($,hm){  
    hm.initEvent();   
});  
//seajs.use(['jQuery1.11','../static/hellow/hellowMain.js']);  
</script>  
</body>  
</html>  

2、页面样式文件 hellow.css

@charset "utf-8";  
*{font-family:"微软雅黑","microsoft Yahei",verdana;}  
pre{margin:0px;padding:2px 0px;font-size:13px;font-family:verdana;}  
.div01{  
    border:1px solid red;  
    width:600px;  
    min-height:100px;  
    padding:10px;  
    box-sizing:border-box;  
}  
.span01{  
    border:1px solid blue;  
    display:inline-block;     
}  
.div02{  
    border:1px dotted #666;  
    min-height:60px;  
    font-size:20px;  
    margin:20px 0px 0px 0px;  
}  
.alignRight{  
    text-align:right;  
    font-size:30px;  
    animation:myplay01 2s linear 2s infinite normal;  
}  
@keyframes myplay01 {  
    0% {  
        background: white;   
        transform: rotate(0deg);  
        transform:translate(0,0);  
    }     
    100% {  
        background: #CCC;   
        transform: rotate(30deg);  
        transform:translate(0px,100px)  
    }  
}  
.text01{  
    line-height:20px;  
    font-size:13px;  
    font-family:verdana;  
}  

3、业务文件之一,hellow.js 注意语法看看模块是怎么写的,推荐注意文件各个注释说明和书写格式,方便养成良好习惯和代码规范

define(function(require, exports, module){  
    //1,define intenal variable area//变量定义区  
    var moduleName = "hellow module";  
    var version = "1.0.0";  
      
    //2,define intenal funciton area//函数定义区  
    var getObj = function(id){  
        return document.getElementById(id+"");        
    };  
    exports.alert = function(a){  
        alert(a);     
    };  
      
    exports.initEvent = function(){  
        var myObj = getObj('div01');  
        myObj.onmouseover = function(){  
            myObj.style = "border:3px solid blue;"  
        };  
          
        myObj.onmouseout = function(){  
            myObj.style = "border:1px solid red;"  
        };  
          
        var myObj2 = getObj('div02');  
        myObj2.onmouseover = function(){  
            myObj2.className = "div02 alignRight";  
        };  
          
        myObj2.onmouseout = function(){  
            myObj2.className = "div02";  
        };        
    };  
      
    //3,export this module API for outside other module  
    //暴露本模块API给外部其它模块使用  
    module.exports = exports;  
      
    //4,auto run initEvent function when module loaded finish  
    //启用时在加载完将自动运行某方法  
    //exports.initEvent();  
      
});  

4、业务文件之一,主模块 hellowMain.js 注意语法看看模块是怎么写的,推荐注意文件各个注释说明和书写格式,方便养成良好习惯和代码规范

// This is app main module JS file  
define(function(require, exports, module){  
    //1,define intenal variable area//变量定义区  
    var moduleName = "hellow module";  
    var version = "1.0.0";  
          
    //2,load each dependency   
    var workjs = require("hellow");  
          
    //3,define intenal funciton area//函数定义区  
    exports.loadTip = function(refConId){  
        var tipMsg = "module is loaded finish.";  
        if(undefined === refConId || null === refConId || "" === refConId+""){  
            alert(tipMsg);  
        }else{  
            document.getElementById(refConId+"").innerHTML = tipMsg;  
        }  
    };  
      
    exports.initEvent = function(){       
        workjs.initEvent();  
        exports.loadTip();  
    };  
      
    //4,export this module API for outside other module  
    //暴露本模块API给外部其它模块使用  
    module.exports = exports;  
      
    //5,auto run initEvent function when module loaded finish  
    //启用时在加载完将自动运行某方法  
    //exports.initEvent();  
});  

注意:对应的 seaJS 和 jquery 各个版本文件这里没有给出,到对应的网上或官网下载放到对应目录,注意修改文件名对应即可,参见对应地方的注释;

本例虽然简单,但是基本包含了实际大部分 seaJS 知识点,注释也非常清楚,同时注意文件的组织结构,seaJS的配置的定义,调用关系,模块的写法,模块内部的写法,依赖文件的加载和调用,以及模块如何自动运行某个函数等等。

参考来源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容