SeaJS入门教程系列之SeaJS介绍(一)


Posted in Javascript onMarch 03, 2014

前言
SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而只是实现JavaScript的模块化及按模块加载。SeaJS的主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载,将前端工程师从繁重的JavaScript文件及对象依赖处理中解放出来,可以专注于代码本身的逻辑。SeaJS可以与jQuery这类框架完美集成。使用SeaJS可以提高JavaScript代码的可读性和清晰度,解决目前JavaScript编程中普遍存在的依赖关系混乱和代码纠缠等问题,方便代码的编写和维护。
SeaJS的作者是淘宝前端工程师玉伯。
SeaJS本身遵循KISS(Keep It Simple, Stupid)理念进行开发,其本身仅有个位数的API,因此学习起来毫无压力。在学习SeaJS的过程中,处处能感受到KISS原则的精髓——仅做一件事,做好一件事。
本文首先通过一个例子直观对比传统JavaScript编程和使用SeaJS的模块化JavaScript编程,然后详细讨论SeaJS的使用方法,最后给出一些与SeaJS相关的资料。

传统模式 vs SeaJS模块化
假设我们现在正在开发一个Web应用TinyApp,我们决定在TinyApp中使用jQuery框架。TinyApp的首页会用到module1.js,module1.js依赖module2.js和module3.js,同时module3.js依赖module4.js。
传统开发
使用传统的开发方法,各个js文件代码如下:

//module1.js
var module1 = {
    run: function() {
        return $.merge(['module1'], $.merge(module2.run(), module3.run()));
    }
}//module2.js
var module2 = {
    run: function() {
        return ['module2'];
    }
}
//module3.js
var module3 = {
    run: function() {
        return $.merge(['module3'], module4.run());
    }
}
//module4.js
var module4 = {
    run: function() {
        return ['module4'];
    }
}

此时index.html需要引用module1.js及其所有下层依赖(注意顺序):
<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>TinyApp</title>
    <script src="./jquery-min.js"></script>
    <script src="./module4.js"></script>
    <script src="./module2.js"></script>
    <script src="./module3.js"></script>
    <script src="./module1.js"></script>
</head>
<body>
    <p class="content"></p>
    <script>
        $('.content').html(module1.run());
    </script>
</body>
</html>

随着项目的进行,js文件会越来越多,依赖关系也会越来越复杂,使得js代码和html里的script列表往往变得难以维护。
SeaJS模块化开发
下面看看如何使用SeaJS实现相同的功能。
首先是index.html:
<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>TinyApp</title>
</head>
<body>
    <p class="content"></p>
    <script src="./sea.js"></script>
    <script>
        seajs.use('./init', function(init) {
            init.initPage();
        });
    </script>
</body>
</html>

可以看到html页面不再需要引入所有依赖的js文件,而只是引入一个sea.js,sea.js会处理所有依赖,加载相应的js文件,加载策略可以选择在渲染页面时一次性加载所有js文件,也可以按需加载(用到时才加载响应js),具体加载策略使用方法下文讨论。
index.html加载了init模块,并使用此模块的initPage方法初始化页面数据,这里先不讨论代码细节。
下面看一下模块化后JavaScript的写法:
//jquery.js
define(function(require, exports, module) = {    //原jquery.js代码...
    module.exports = $.noConflict(true);
});
//init.js
define(function(require, exports, module) = {
    var $ = require('jquery');
    var m1 = require('module1');
    exports.initPage = function() {
        $('.content').html(m1.run());    
    }
});
//module1.js
define(function(require, exports, module) = {
    var $ = require('jquery');
    var m2 = require('module2');
    var m3 = require('module3');
    exports.run = function() {
        return $.merge(['module1'], $.merge(m2.run(), m3.run()));    
    }
});
//module2.js
define(function(require, exports, module) = {
    exports.run = function() {
        return ['module2'];
    }
});
//module3.js
define(function(require, exports, module) = {
    var $ = require('jquery');
    var m4 = require('module4');
    exports.run = function() {
        return $.merge(['module3'], m4.run());    
    }
});
//module4.js
define(function(require, exports, module) = {
    exports.run = function() {
        return ['module4'];
    }
});

乍看之下代码似乎变多变复杂了,这是因为这个例子太简单,如果是大型项目,SeaJS代码的优势就会显现出来。不过从这里我们还是能窥探到一些SeaJS的特性:
一是html页面不用再维护冗长的script标签列表,只要引入一个sea.js即可。
二是js代码以模块进行组织,各个模块通过require引入自己依赖的模块,代码清晰明了。
通过这个例子朋友们应该对SeaJS有了一个直观的印象,下面本文具体讨论SeaJS的使用。
Javascript 相关文章推荐
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
javascript iframe中打开文件,并检测iframe存在否
Dec 28 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
Dec 08 Javascript
JQuery开发的数独游戏代码
Oct 29 Javascript
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
Jquery实现textarea根据文本内容自适应高度
Apr 03 Javascript
JS实现动态移动层及拖动浮层关闭的方法
Apr 30 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
解析js如何获取css样式
Dec 11 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
Dec 20 Javascript
原生JS使用Canvas实现拖拽式绘图功能
Jun 05 Javascript
js的hasownproperty使用示例
Mar 02 #Javascript
javascript对象的使用和属性操作示例详解
Mar 02 #Javascript
使用js显示当前时间示例
Mar 02 #Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 #Javascript
jquery制作弹窗提示窗口代码分享
Mar 02 #Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 #Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 #Javascript
You might like
一个多文件上传的例子(原创)
2006/10/09 PHP
PHP新手上路(四)
2006/10/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
接收键盘指令的脚本
2006/06/26 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
彻底理解Python中的yield关键字
2019/04/01 Python
python 标准差计算的实现(std)
2019/07/29 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
Python urllib2运行过程原理解析
2020/06/04 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
淘宝客服自我总结鉴定
2014/01/25 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
网站推广策划方案
2014/06/04 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
2019年大学推荐信
2019/06/24 职场文书
python实现A*寻路算法
2021/06/13 Python