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中的Screen屏幕对象
Jan 16 Javascript
JavaScript参数个数可变的函数举例说明
Oct 10 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
封装获取dom元素的简单实例
Jul 08 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
Aug 08 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
通过命令行生成vue项目框架的方法
Jul 12 Javascript
vue-cli脚手架-bulid下的配置文件
Mar 27 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 Javascript
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
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
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
Python urls.py的三种配置写法实例详解
2017/04/28 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python3 元组tuple入门基础
2020/02/09 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
2015年保送生自荐信
2015/03/24 职场文书
邹越演讲观后感
2015/06/15 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
7个关于Python的经典基础案例
2021/11/07 Python