SeaJS 学习
什么是系统
在生活和工作中,我们会接触到大量系统:自然界生态系统、计算机操作系统、软件办公系统,还有教育系统、金融系统、网络系统、理论系统等等。究竟什么是系统呢?
来看下维基百科的解释:
系统泛指由一群有关连的个体组成,根据预先编排好的规则工作,能完成个别元件不能单独完成的工作的群体。系统分为自然系统与人为系统两大类。
简言之,系统有两个基本特性:
- 系统由个体组成。
- 个体之间有关连,按照规则协同完成任务。
系统中的个体可称之为系统成员,这样,要构建一个系统,最基本层面需要做两件事:
- 定义系统成员:确定成员是什么。
- 约定系统通讯:确定成员之间如何交互,遵循的规则是什么。
只要把这两个问题描述清楚,我们就可以构建出系统。
模块系统
Sea.js 是一个适用于 Web 浏览器端的模块加载器。在 Sea.js 里,一切皆是模块,所有模块协同构建成模块系统。Sea.js 首要要解决的是模块系统的基本问题:
- 模块是什么?
- 模块之间如何交互?
在前端开发领域,一个模块,可以是JS 模块,也可以是 CSS 模块,或是 Template 等模块。在 Sea.js 里,我们专注于 JS 模块(其他类型的模块可以转换为 JS 模块):
- 模块是一段 JavaScript 代码,具有统一的基本书写格式。
- 模块之间通过基本交互规则,能彼此引用,协同工作。
把上面两点中提及的基本书写格式和基本交互规则描述清楚,就能构建出一个模块系统。对书写格式和交互规则的详细描述,就是模块定义规范(Module Definition Specification)。
模块标识
模块标识是一个字符串,用来标识模块。在 require
、 require.async
等加载函数中,第一个参数都是模块标识。define
函数的 dependencies
参数也是由模块标识组成。
SeaJS 中的模块标识是 CommonJS 模块标识 的超集:
- 一个模块标识由斜线(
"/"
)分隔的多项组成。- 每一项必须是小驼峰字符串、
"."
或".."
。- 模块标识可以不包含文件后缀名,比如
".js"
。- 模块标识可以是“相对”或“顶级”标识。如果第一项是
"."
或".."
,则该模块标识是相对标识。- 顶级标识根据模块命名空间的根路径来解析。
- 相对标识相对
require
所在模块的标识来解析。
注意,符合上述规范的标识肯定是 SeaJS 的模块标识,但 SeaJS 能识别的模块标识不需要完全符合以上规范。 比如,除了大小写字母组成的小驼峰字符串,SeaJS 的模块标识字符串还可以包含下划线和连字符, 甚至可以以"http://"
、"https://"
、"file:///"
等协议标识开头。
相对标识
相对标识只出现在模块环境中,以 "."
开头。会相对当前模块的 URI 来解析:
// 在 http://example.com/js/a.js 中:
require('./b');
// => http://example.com/js/b.js
顶级标识
顶级标识不以点("."
)或斜线("/"
)开始, 会相对 SeaJS 的 base
路径来解析:
// 假设 base 路径是:http://example.com/js/libs/ // 在模块代码里:
require('jquery/1.7.1/jquery');
// => http://example.com/js/libs/jquery/1.7.1/jquery.js
base 路径的默认值,与 sea.js 的路径相关: 如果 sea.js 的路径是: http://example.com/js/libs/sea.js 则 base 路径为: http://example.com/js/libs/
当 sea.js
路径中含有版本号时,base
不会包含 seajs/x.y.z
字串。 当类库模块有多个版本时,这样会更方便。
如果 sea.js 的路径是: http://example.com/libs/seajs/1.0.0/sea.js 则 base 路径是: http://example.com/libs/
当然,也可以手工配置 base
路径:
seajs.config({
base: 'http://code.jquery.com/'
}); // 在模块代码里:
require('jquery');
// => http://code.jquery.com/jquery.js
普通路径
除了相对和顶级标识之外的标识都是普通路径。普通路径的解析规则,和 HTML 代码中的 script.src
一样,会相对当前页面来解析。(以当前页面路径为基础,无论你设置了怎样的base路径)
// 在 http://example.com/js/main.js 中:
require('http://example.com/js/a');
// => http://example.com/js/a.js // 在 http://example.com/js/a.js 中:
require('/js/b');
// => http://example.com/js/b.js // 在任何代码里:
seajs.use('./c');
// => http://example.com/path/to/page/c.js
seajs.use(ids, ...)
和 define(id, ...)
中的模块标识始终是普通路径,因为这两个方法是在全局环境中执行的。
文件后缀的提示
除非在路径中出现井号("#"
)或问号("?"
),SeaJS 在解析模块标识时, 都会自动添加 JS 扩展名(".js"
)。如果不想自动添加扩展名,最简单的方法是, 在路径末尾加上井号("#"
)。
// ".js" 后缀可以省略:
require('http://example.com/js/a');
require('http://example.com/js/a.js');
// => http://example.com/js/a.js // ".css" 后缀不可省略:
require('http://example.com/css/a.css');
// => http://example.com/css/a.css // 当路径中有问号("?")时,不会自动添加后缀:
require('http://example.com/js/a.json?callback=define');
// => http://example.com/js/a.json?callback=define // 当路径以井号("#")结尾时,不会自动添加后缀,且会在解析时,去掉井号:
require('http://example.com/js/a.json#');
// => http://example.com/js/a.json
http://seajs.org/docs/#docs
SeaJS 学习的更多相关文章
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- seaJS学习资料参考
seajs官方文档:http://seajs.org/docs/#docs http://wenku.it168.com/d_000096482.shtml http://blog.codinglab ...
- seaJs学习笔记之javascript的依赖问题
之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...
- 模块化之seaJs学习和使用
使用seaJs也有一阵子了,一直也想抽个时间写个这方面的博客,直到今天才写……也许写的不是很完善,但跟大伙分享也是一种乐趣,不对之处欢迎指出.[抱拳] 时间有限,我这里不过多介绍前端模块化,有兴趣可以 ...
- seajs学习一天后的总结归纳
公司项目最近需要将js文件迁移到seajs来进行模块化管理,由于我以前主要接触模块化开发是接触的AMD规范的requireJS,没有接触过CMD规范,而且在实际项目中还没有用过类似技术.于是,我非常兴 ...
- 前端MVC学习——模块发开发、seajs学习
这份学习链接已经足够了:http://seajs.org/docs/#intro 我假设你至少已经浏览过上述链接文档.并且掌握了基本的seajs基础知识~ 手把手教你创建helloworld~ Hel ...
- 自学了三天的SeaJs学习,解决了前端的一些问题,与小伙伴们一起分享一下!
我为什么学习SeaJs? [第一]:为了解决项目中资源文件版本号的问题,以及打包压缩合并等问题. [第二]:好奇心和求知欲.[我发现很多知名网站也都在使用(qq空间, msn, 淘宝等等),而且 Se ...
- seajs学习笔记
seajs配置 seajs.config({ //别名配置 alias:{ 'es5-safe':'gallery/es5-safe/0.9.3/es5-safe', 'jquery':'jquery ...
- SeaJS学习笔记(一) ./ 和 ../ 区别
最近要去实习,公司里使用sea.js进行模块化开发 具体下载安装就不多说了,请参见SeaJS官网 <!DOCTYPE html> <html> <head> < ...
随机推荐
- 1565: [NOI2009]植物大战僵尸 - BZOJ
Description Input Output仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0.Sample Input3 210 020 0-10 0 ...
- 链路层三种类型的MAC地址
若需要转载,请注明出处. 我们知道,链路层都是以MAC地址来进行通信双方的地址标识的,如下图:在应用中根据接收方的多寡来进行划分,可分为以下三种: 单播(Unicast) 多播(Multicast) ...
- 01.FastDFS的安装部署
1.FastDFS简介 (1)FastDFS的功能介绍 FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负 ...
- 2012 Asia Chengdu Regional Contest
Browsing History http://acm.hdu.edu.cn/showproblem.php?pid=4464 签到 #include<cstdio> #include&l ...
- yebis 和phyreengine的集成
被虐了几个礼拜阿, 暗无天日阿,花样被虐阿 设置 backbuffer commandbuffer这种问题还在其次,和他们的support要phyreengine 的sample就可以了 虐我千百遍的 ...
- DepthClipEnable error
刚刚呢又遇到这种鬼扯的问题,ps就return个(1,1,0,1) nisight的汇编都写对了,但结果就是画不出任何东西,按照经验,必然是某个state.... 我就找啊找啊,被我找到一个 Rast ...
- C#获取网页中的验证码图片(转载)
有时候我们需要获得网页上的图片,尤其是向验证码这样的图片.这个方法就是将网页上的图片获取到PictureBox中.效果入下图所示. 右边是使用Webbrowser控件装载的某网站的注册页面,其中包括了 ...
- 使用CSS3实现3D图片滑块效果
使用 CSS3 的3D变换特性,我们可以通过让元素在三维空间中变换来实现一些新奇的效果. 这篇文章分享的这款 jQuery 立体图片滑块插件,利用了 3D transforms(变换)属性来实现多种不 ...
- 大漠推荐的教程:创建你自己的AngularJS -- 第一部分 Scopes
创建你自己的AngularJS -- 第一部分 Scopes http://www.html-js.com/article/1863
- CKEditor (Toolbar Definition)工具栏自定义配置
JS是大小写敏感的, 在设置配置文件的时候需要注意 以CKEditor 4为基础我们可以通过两种方式配置CKEditor的工具栏,一种是是通过config.js配置文件设置, 另一种是IN-PAGE方 ...