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 学习技巧
Feb 17 Javascript
借助javascript代码判断网页是静态还是伪静态
May 05 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
javascript 中null和undefined区分和比较
Apr 19 Javascript
JavaScript闭包_动力节点Java学院整理
Jun 27 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 Javascript
Vue组件通信入门之Provide和Inject机制
Dec 29 Javascript
JavaScript用document.write()输出换行的示例代码
Nov 26 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
js 处理URL实用技巧
2010/11/23 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
人事档案接收函
2014/01/12 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
大学军训决心书
2015/02/05 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
特此通知格式
2015/04/27 职场文书
关于python类SortedList详解
2021/09/04 Python
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android