什么是系统

在生活和工作中,我们会接触到大量系统:自然界生态系统、计算机操作系统、软件办公系统,还有教育系统、金融系统、网络系统、理论系统等等。究竟什么是系统呢?

来看下维基百科的解释:

系统泛指由一群有关连的个体组成,根据预先编排好的规则工作,能完成个别元件不能单独完成的工作的群体。系统分为自然系统与人为系统两大类。

简言之,系统有两个基本特性:

  1. 系统由个体组成。
  2. 个体之间有关连,按照规则协同完成任务。

系统中的个体可称之为系统成员,这样,要构建一个系统,最基本层面需要做两件事:

  1. 定义系统成员:确定成员是什么。
  2. 约定系统通讯:确定成员之间如何交互,遵循的规则是什么。

只要把这两个问题描述清楚,我们就可以构建出系统。

模块系统

Sea.js 是一个适用于 Web 浏览器端的模块加载器。在 Sea.js 里,一切皆是模块,所有模块协同构建成模块系统。Sea.js 首要要解决的是模块系统的基本问题:

  1. 模块是什么?
  2. 模块之间如何交互?

在前端开发领域,一个模块,可以是JS 模块,也可以是 CSS 模块,或是 Template 等模块。在 Sea.js 里,我们专注于 JS 模块(其他类型的模块可以转换为 JS 模块):

  1. 模块是一段 JavaScript 代码,具有统一的基本书写格式。
  2. 模块之间通过基本交互规则,能彼此引用,协同工作。

把上面两点中提及的基本书写格式和基本交互规则描述清楚,就能构建出一个模块系统。对书写格式和交互规则的详细描述,就是模块定义规范(Module Definition Specification)。

模块标识

模块标识是一个字符串,用来标识模块。在 require、 require.async 等加载函数中,第一个参数都是模块标识。define 函数的 dependencies 参数也是由模块标识组成。

SeaJS 中的模块标识是 CommonJS 模块标识 的超集:

  1. 一个模块标识由斜线("/")分隔的多项组成。
  2. 每一项必须是小驼峰字符串、"." 或 ".."
  3. 模块标识可以不包含文件后缀名,比如 ".js"
  4. 模块标识可以是“相对”或“顶级”标识。如果第一项是 "." 或 "..",则该模块标识是相对标识。
  5. 顶级标识根据模块命名空间的根路径来解析。
  6. 相对标识相对 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 学习的更多相关文章

  1. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  2. seaJS学习资料参考

    seajs官方文档:http://seajs.org/docs/#docs http://wenku.it168.com/d_000096482.shtml http://blog.codinglab ...

  3. seaJs学习笔记之javascript的依赖问题

    之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...

  4. 模块化之seaJs学习和使用

    使用seaJs也有一阵子了,一直也想抽个时间写个这方面的博客,直到今天才写……也许写的不是很完善,但跟大伙分享也是一种乐趣,不对之处欢迎指出.[抱拳] 时间有限,我这里不过多介绍前端模块化,有兴趣可以 ...

  5. seajs学习一天后的总结归纳

    公司项目最近需要将js文件迁移到seajs来进行模块化管理,由于我以前主要接触模块化开发是接触的AMD规范的requireJS,没有接触过CMD规范,而且在实际项目中还没有用过类似技术.于是,我非常兴 ...

  6. 前端MVC学习——模块发开发、seajs学习

    这份学习链接已经足够了:http://seajs.org/docs/#intro 我假设你至少已经浏览过上述链接文档.并且掌握了基本的seajs基础知识~ 手把手教你创建helloworld~ Hel ...

  7. 自学了三天的SeaJs学习,解决了前端的一些问题,与小伙伴们一起分享一下!

    我为什么学习SeaJs? [第一]:为了解决项目中资源文件版本号的问题,以及打包压缩合并等问题. [第二]:好奇心和求知欲.[我发现很多知名网站也都在使用(qq空间, msn, 淘宝等等),而且 Se ...

  8. seajs学习笔记

    seajs配置 seajs.config({ //别名配置 alias:{ 'es5-safe':'gallery/es5-safe/0.9.3/es5-safe', 'jquery':'jquery ...

  9. SeaJS学习笔记(一) ./ 和 ../ 区别

    最近要去实习,公司里使用sea.js进行模块化开发 具体下载安装就不多说了,请参见SeaJS官网 <!DOCTYPE html> <html> <head> < ...

随机推荐

  1. printf的一个常用技巧

    acm 的题目经常要求输出最后面一位不能有空格: 用if语句显得代码难看: 实现如下: int a[5]={1,2,3,4,5}; for(int i=0;i<=4;i++) printf(&q ...

  2. javascript获取以及设置光标位置

    一. 获取光标位置: // 获取光标位置 function getCursortPosition (textDom) { var cursorPos = 0; if (document.selecti ...

  3. 【Lua】Lua中__index与元表(转)

    转载于:http://blog.csdn.net/xocoder/article/details/9028347 Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如 ...

  4. 【BZOJ】【1034】【ZJOI2008】泡泡堂BNB

    贪心 类似田忌赛马策略的一个贪心= = 随便YY了一个做法居然A了…… 简单来说就是先强对强,弱对弱,能赢就赢,不能赢就让弱的那个去对强的那个,剩下的人继续依次捉对比赛(继续刚刚的策略),现在人数还是 ...

  5. DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

    这个类型的resource 后面多个SRGB 表示SRGB空间是指gamma 矫正系数为2.2的色彩空间,这个问题我没有问别人,是我自己是上网查的,我觉得我不是个女人了......我又level up ...

  6. 社区O2O,才是未来10年移动互联网最赚钱的项目

    原文:http://blog.sina.com.cn/s/blog_70e76a920102uyoi.html 8月12日  上海  晴 从深圳回来后,一直和郭老师探讨一个问题:新媒体营销未来最大的市 ...

  7. iOS Automation Test

    google resource for KIF: http://www.oschina.net/translate/ios-ui-testing-with-kif

  8. UML基本表示法(转载)

    UML是流行的图解符号.我们都知道,UML是可视化,说明,构建和记录软件和非软件系统的组成部分.这里的可视化是最重要的部分,需要被理解和记忆. UML符号是最重要的建模元素.适当有效地使用符号是非常重 ...

  9. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  10. UITextField中文搜索

    导入头文件 #import "ChineseInclude.h"#import "PinYinForObjc.h" NSMutableArray *search ...