下载与安装

要在项目中使用SeaJS,你所有需要做的准备工作就是下载sea.js然后放到你项目的某个位置。
SeaJS项目目前托管在GitHub上,主页为 https://github.com/seajs/seajs/ 。可以到其Git库的build目录下下载sea.js(已压缩)或sea-debug.js(未压缩)。
下载完成后放到项目的相应位置,然后在页面中通过<script>标签引入,你就可以使用SeaJS了。

SeaJS基本开发原则

使用SeaJS开发JavaScript的基本原则就是:一切皆为模块。引入SeaJS后,编写JavaScript代码就变成了编写一个又一个模块,SeaJS中模块的概念有点类似于面向对象中的类——模块可以拥有数据和方法,数据和方法可以定义为公共或私有,公共数据和方法可以供别的模块调用。
另外,每个模块应该都定义在一个单独js文件中,即一个对应一个模块。
下面介绍模块的编写和调用。

Sea.js的配置

<script src="sea.js"></script>
<script>seajs.use("main");
</script>

用script标签引入 sea.js,然后用seajs.use进行配置。
seajs.use主要用于载入入口模块。入口模块相当于C程序的main函数,同时也是整个模块依赖树的根。上面在TinyApp小例子中,init就是入口模块。seajs.use用法如下:

//单一模式
seajs.use('./a');//回调模式
seajs.use('./a', function(a) {a.run();
});//多模块模式
seajs.use(['./a', './b'], function(a, b) {a.run();b.run();
});

一般seajs.use只用在页面载入入口模块,SeaJS会顺着入口模块解析所有依赖模块并将它们加载。

如果入口模块只有一个,也可以通过给引入sea.js的script标签加入”data-main”属性来省略seajs.use,例如上面的代码也可以改为如下写法:

<script src="sea.js" data-main="main.js"></script>
  • 1
  • 1

不过我一直没有成功过,具体原因不明。

seajs.config seajs.config(options)

用来进行配置的方法。

seajs.config({

// 别名配置
alias: {
‘es5-safe’: ‘gallery/es5-safe/0.9.3/es5-safe’,
‘json’: ‘gallery/json/1.0.2/json’,
‘jQuery’: ‘jquery/jquery/1.10.1/jquery’
},

// 路径配置
paths: {
‘gallery’: ‘https://a.alipayobjects.com/gallery’
},

// 变量配置
vars: {
‘locale’: ‘zh-cn’
},

// 映射配置
map: [
[‘http://example.com/js/app/‘, ‘http://localhost/js/app/‘]
],

// 预加载项
preload: [
Function.prototype.bind ? ” : ‘es5-safe’,
this.JSON ? ” : ‘json’
],

// 调试模式
debug: true,

// Sea.js 的基础路径
base: ‘http://example.com/path/to/base/‘,

// 文件编码
charset: ‘utf-8’
});

支持以下配置选项:
alias Object

当模块标识很长时,可以使用 alias 来简化。

seajs.config({
alias: {
‘jquery’: ‘jquery/jquery/1.10.1/jquery’,
‘app/biz’: ‘http://path/to/app/biz.js‘,
}
});

define(function(require, exports, module) {

var $ = require(‘jquery’);
//=> 加载的是 http://path/to/base/jquery/jquery/1.10.1/jquery.js

var biz = require(‘app/biz’);
//=> 加载的是 http://path/to/app/biz.js

});

使用 alias,可以让文件的真实路径与调用标识分开,有利于统一维护。
paths Object

当目录比较深,或需要跨目录调用模块时,可以使用 paths 来简化书写。

seajs.config({
paths: {
‘gallery’: ‘https://a.alipayobjects.com/gallery‘,
‘app’: ‘path/to/app’,
}
});

define(function(require, exports, module) {

var underscore = require(‘gallery/underscore’);
//=> 加载的是 https://a.alipayobjects.com/gallery/underscore.js

var biz = require(‘app/biz’);
//=> 加载的是 path/to/app/biz.js

});

paths 配置可以结合 alias 配置一起使用,让模块引用非常方便。
vars Object

有些场景下,模块路径在运行时才能确定,这时可以使用 vars 变量来配置。

seajs.config({
vars: {
‘locale’: ‘zh-cn’
}
});

define(function(require, exports, module) {

var lang = require(‘./i18n/{locale}.js’);
//=> 加载的是 path/to/i18n/zh-cn.js

});

vars 配置的是模块标识中的变量值,在模块标识中用 {key} 来表示变量。
map Array

该配置可对模块路径进行映射修改,可用于路径转换、在线调试等。

seajs.config({
map: [
[ ‘.js’, ‘-debug.js’ ]
]
});

define(function(require, exports, module) {

var a = require(‘./a’);
//=> 加载的是 path/to/a-debug.js

});

更多用法可参考:调试实践
preload Array

使用 preload 配置项,可以在普通模块加载前,提前加载并初始化好指定模块。

// 在老浏览器中,提前加载好 ES5 和 json 模块
seajs.config({
preload: [
Function.prototype.bind ? ” : ‘es5-safe’,
this.JSON ? ” : ‘json’
]
});

preload 中的空字符串会被忽略掉。

注意:preload 中的配置,需要等到 use 时才加载。比如:

seajs.config({
preload: ‘a’
});

// 在加载 b 之前,会确保模块 a 已经加载并执行好
seajs.use(‘./b’);

preload 配置不能放在模块文件里面:

seajs.config({
preload: ‘a’
});

define(function(require, exports) {
// 此处执行时,不能保证模块 a 已经加载并执行好
});

debug Boolean

值为 true 时,加载器不会删除动态插入的 script 标签。插件也可以根据 debug 配置,来决策 log 等信息的输出。
base String

Sea.js 在解析顶级标识时,会相对 base 路径来解析。详情请参阅 模块标识

注意:一般请不要配置 base 路径,把 sea.js 放在合适的路径往往更简单一致。
charset String | Function

获取模块文件时,

模块的定义及编写

模块定义函数define

SeaJS中使用“define”函数定义一个模块。define可以接收三个参数:
复制代码 代码如下:

上面是我从SeaJS源码中摘录出来的,define可以接收的参数分别是模块ID,依赖模块数组及工厂函数。

define对于不同参数个数的解析规则如下:
如果只有一个参数,则赋值给factory。
如果有两个参数,第二个赋值给factory;第一个如果是array则赋值给deps,否则赋值给id。
如果有三个参数,则分别赋值给id,deps和factory。
但是,包括SeaJS的官方示例在内几乎所有用到define的地方都只传递一个工厂函数进去,类似与如下代码:
复制代码 代码如下:

define(function(require, exports, module) {
//code of the module…
});

个人建议遵循SeaJS官方示例的标准,用一个参数的define定义模块。那么id和deps会怎么处理呢?
id是一个模块的标识字符串,define只有一个参数时,id会被默认赋值为此js文件的绝对路径。如example.com下的a.js文件中使用define定义模块,则这个模块的ID会赋值为 http://example.com/a.js ,没有特别的必要建议不要传入id。deps一般也不需要传入,需要用到的模块用require加载即可。

工厂函数factory解析

工厂函数是模块的主体和重点。在只传递一个参数给define时(推荐写法),这个参数就是工厂函数,此时工厂函数的三个参数分别是:
1.require——模块加载函数,用于记载依赖模块。
2.exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
3.module——模块的元数据。
这三个参数可以根据需要选择是否需要显示指定。
下面说一下module。module是一个对象,存储了模块的元信息,具体如下:
1.module.id——模块的ID。
2.module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
3.module.exports——与exports指向同一个对象。

三种编写模块的模式

第一种定义模块的模式是基于exports的模式:
复制代码 代码如下:

define(function(require, exports, module) {var a = require('a'); //引入a模块var b = require('b'); //引入b模块var data1 = 1; //私有数据var func1 = function() { //私有方法return a.run(data1);}exports.data2 = 2; //公共数据exports.func2 = function() { //公共方法return 'hello';}
});
  • 14
  • 15
  • 16

上面是一种比较“正宗”的模块定义模式。除了将公共数据和方法附加在exports上,也可以直接返回一个对象表示模块,如下面的代码与上面的代码功能相同:
复制代码 代码如下:
define(function(require) {
var a = require(‘a’); //引入a模块
var b = require(‘b’); //引入b模块

var data1 = 1; //私有数据var func1 = function() { //私有方法return a.run(data1);
}return {data2: 2,func2: function() {return 'hello';}
};

});

如果模块定义没有其它代码,只返回一个对象,还可以有如下简化写法:
复制代码 代码如下:
define({
data: 1,
func: function() {
return ‘hello’;
}
});

第三种方法对于定义纯JSON数据的模块非常合适。

简单的实例

helloworld.html源码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello Sea.js</title>
</head>
<body>
<script src="sea.js"></script>
<script>seajs.use("main");
</script>
</body>
</html>

main.js源代码如下:

define("main", //可以不要[], //可以不要function test() {       alert("Hello world!");}
);

(function () {(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var(this).text().split('\n').length;var numbering = $('').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append((this).addClass('has-numbering').parent().append(numbering); for (i = 1; i

Sea.js入门教程相关推荐

  1. Vue.js入门教程-组件注册

    一.组件创建 1.1 创建步骤 创建Vue的组件都有三个基本步骤是 [①创建组件构造器.②注册组件和③使用组件]. 1.2 基本示例 比如,我们创建一个Button组件. // 1. 创建一个组件构造 ...

  2. js读取http chunk流_极简 Node.js入门 教程双工流

    点击上方蓝字关注我们 小编提示: 本文是由 ICBU 的谦行小哥哥出品,我们会持续发出极简 Node.js入门 教程,敬请期待哦,文中有比较多的演示代码建议横屏阅读 双工流就是同时实现了 Readab ...

  3. Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 23 使用 npm 的语义版本控制 24 ...

  4. Vue.js入门教程(适合初学者)

    Vue.js入门教程 Vue官网网址:Vue.js 中文网 Vue.js Vue.js是渐进式JavaScript 框架,是一套构建用户界面的渐进式框架.也可以说Vue.js 是一个用来构建网页界面的 ...

  5. Node.js 入门教程 6 V8 JavaScript 引擎

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 6 V8 JavaScript 引擎 6 ...

  6. egg.js入门教程视频文件(转载于cnode社区)

    记得上篇博客我满怀欣喜的去搞富文本,结果撞的头破血流. 简直是惨不忍睹.后来我也说了,我的那个有比较严重的问题,后期会考虑重构.(第一版已经放弃了) 之后我说我会去看关于后端nodejs koa框架方 ...

  7. Two.js入门教程

    项目中需要前端画svg图像,直接在html上写标签不太优雅,于是找到了Two.js这个第三方类库,使用其完成了开发任务后,分享下使用心得,就算是入门教程了. 其官方网站为https://two.js. ...

  8. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南--类的定义.初始化.继承 Ember.js 入门指南--类的扩展(reopen) Ember.js 入门指南--计算属性(compute properti ...

  9. 前端框架React Js入门教程【转】

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

最新文章

  1. Dynamics CRM2013 自定义开发工具 Dynamics XRM Tools 介绍
  2. 循环自相关函数和谱相关密度(三)——实信号、复信号模型下的BPSK信号循环谱MATLAB仿真结果及代码
  3. console application_灵活使用 console 让 js 调试更简单
  4. python列表如何修改_如何在python中更改列表的字典中的值
  5. karto探秘之open_karto 第四章 --- 回环检测与后端优化
  6. [2018.10.20 T2] 面包
  7. 远程文件传输工具Filezilla
  8. 使用原生js实现简单动画效果
  9. 关于ESD的一些知识
  10. 遥感小目标检测论文梳理
  11. LoRa SX1278通信代码开发学习
  12. CRM为何要给贴标签?
  13. 简单的一道 SQL 题,谈如何提高编程水平
  14. 虚拟机配置可用的DNS服务器
  15. eclipse越来越不稳定了
  16. 微软测试基于云的剪贴板App,可跨平台同步
  17. MonoRail MVC应用(1)-VM/HTML页面
  18. 教师资格证面试中职专业课计算机应用,中职专业课及中职实习指导教师资格面试大纲(试行)...
  19. 从成交量变化抓住股票涨跌
  20. 【C语言】关机小游戏(最好的朋友转瞬即逝)

热门文章

  1. 2 Day DBA-管理方案对象-监控和优化数据库-积极的数据库监控
  2. 软考错题记录(全面)
  3. 程序员专属段子集锦 8/10
  4. 如何用 LaTeX 排版高中数学试卷(转)_Simplelife_新浪博客
  5. windows删除不了文件解决方法(亲测有效)
  6. 《从案例中学习JavaScript》之实现对话效果
  7. 华为OD机试 - 卡片组成的最大数字(Python) | 机试题算法思路
  8. Informix IDS 11零碎治理(918检讨)认证指南,第 5 部门: 数据库效劳器使用(3)
  9. 第一个算出地球周长的人
  10. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A - Wasserstein Distance