发布 SeaJS v1.0.1 以及模块推荐与后续规划

2011-08-12 07:10

发布 SeaJS v1.0.1 以及模块推荐与后续规划

by lifesinger

at 2011-08-11 23:10:00

original http://lifesinger.wordpress.com/2011/08/11/seajs-v1-0-1/

2011.08.11 Version 1.0.1 (stable)

loader 本身的修改不多:

  1. 增加了对页面中内嵌模块的支持:
    <script>
      define('~/init', null, function(require, exports, module) {
        var test = require('test');
        test.assertTrue('inline module is loaded.');
        test.done();
      });
    seajs.use('~/init');
    </script>
    

    具体请参考:#89

  2. 增加了 preload 配置:
    seajs.config({
      alias: {
        'json': 'json/1.0.0/json'
      },
      preload: [
        './config',
        this.JSON ? '' : 'json'
      ]
    });
    

    preload 模块会在所有其他模块加载之前提前加载并执行好。比如上面的配置,在没有原生 JSON 对象的环境下,会自动预加载好 json.js. 这样,在模块代码里就可以直接调用 JSON.parse 等方法了,就好像所有浏览器都原生支持一样。记录:#81

  3. 整理了社区的一些文章,推荐阅读:Community
  4. 原本打算实现 seajs.sub 方法,考虑到种种原因,暂不实现。有兴趣的可看下:#86

官方网站:http://seajs.com/
英文文档:http://seajs.com/docs/
中文文档:http://seajs.com/docs/zh-cn/

下载页面:release-notes.html

模块推荐

seajs 只是一个 loader, 是一个入口,是一个壳,前端应用里最重要的,除了业务模块,还有各种通用模块。seajs 鼓励用开放式模块来构建基础类库。目前 seajs 大项目收集整理的模块有:

  • es5-safejson, 这两个模块提供了 ES5 规范新增的部分功能。推荐如下配置:
    seajs.config({
      preload: [
        Function.prototype.bind ? '' : 'es5-safe/0.9.0/es5-safe',
        this.JSON ? '' : 'json/1.0.0/json'
      ]
    });
    

    这样配置好后,就可以在所有浏览器中使用 forEach / map / filter / some / ... / Date.now / JSON.parse 等方法了。

  • querystring 模块,提供了对 "foo=1&bar=2" 等参数字符串与 JSON 对象之间的转换方法。需要时,可直接 require 调用即可。
  • cookie 模块,提供 cookies 操作功能。

以上4个模块,是在调研现有类似模块后,重新实现的。所有模块的测试用例都比较齐备,质量上可以得到保证。这些模块统一放在 dew 项目中,定位是:调研现有类似模块后,如果发现有改进空间,或能实现得更好,反馈给原作者,原作者不想继续维护或有理念差异时,才重新造一个轮子,放在 dew 项目中统一维护。

dew 项目中的模块越少越好。大部分模块会直接来自社区,通过 transports 的转换定义文件和 spm 工具来转化。转化后的模块和 dew 项目的模块都存放在 modules 项目里。目前转换过来的模块有:

  • jQuery – 最好的 DOM 操作类库之一。
  • Underscore – 优秀的 JS 语言增强类库。
  • Backbone – 优秀的前端 MVC 框架。
  • Mustache – 简洁的模板操作类库。

目前只包括这些。使用时,建议直接下载 modules 项目,保留目录结构,直接部署到线上的 libs 目录。比如淘宝的:


http://a.tbcdn.cn/libs/seajs/1.0.1/sea.js

http://a.tbcdn.cn/libs/jquery/1.6.2/jquery.js

http://a.tbcdn.cn/libs/json/1.0.0/json.js

...

这样,在页面中引入 sea.js 后,seajs 的 base 目录会默认指向 http://a.tbcdn.cn/libs/. 项目中使用时,推荐在入口文件上统一配置:

/* main.js */
seajs.config({
  alias: {
    'es5-safe': 'es5-safe/0.9.0/es5-safe',
    'json': 'json/1.0.0/json',
    'jquery': 'jquery/1.6.2/jquery',
    'underscore': 'underscore/1.1.7/underscore',
    'backbone': 'backbone/0.5.3/backbone'
  },
  preload: [
    Function.prototype.bind ? '' : 'es5-safe',
    this.JSON ? '' : 'json'
  ]
});

这样,就能做到将一个应用中所用到的通用模块的配置都集中在一起。当某个模块有新版本、需要升级时,修改下配置文件中的版本号即可。还可以加入 map 和 debug 等配置来自由控制时间戳:在线本地调试大观

后续规划

seajs 本身将坚持往纯模块加载器的方向发展和完善,核心功能是模块书写格式和模块加载,其他都是辅助功能,坚持的原则是:如无必要,勿增实体。

seajs 大项目(包括 spm, dew 等),会尝试通过社区的力量,构建出一个开放式前端类库。开放式的好处是:

  1. 任何模块都是可替换的。比如 Backbone 可以替换为 Spine 等,包括 seajs loader 本身也可替换,最关键的是想通过社区,将一些基本规范和编程理念推广开、普适化。很难、很漫长,但很值得去做。
  2. 模块的组合搭配很灵活。因为都是模块化的,这意味着你可以根据各种项目的实际需求,选择性组合需要的模块。虽然因为模块之间的依赖关系会导致选择的复杂性,但目前 dew 项目的一个策略是:适量重复。比如 querystring 和 cookie 两模块里,肯定有些代码是可以拎取出来的,但拎取出来的价值并不大,反而破坏了独立性。es5-safe 和 underscore 也是如此。个人觉得适量重复比零重复更能适应未来。
  3. 参与开发的成本更低。如今,要想给 YUI3 写个 UI 组件并不是件容易的事。你得先搞懂 YUI3 组件的基础构建。对于开放式类库来说,没有这么多前提条件和约定,自由地按照自己觉得最好的方式构建就好。参与的代价更低,整个社区的延展性和覆盖面会很广。当然,这也会带来问题,比如质量控制、文档的一致性等等。但有了 github 和 googlecode 这种社区,一个好的模块,经常 forked 和 watched 数不会太少。简单通过这两个数字,经常就可以帮助我们筛选出一批质量不错的模块来(也有关注度不高但质量很不错的组件,这种情况有,但不多)。

seajs 接来下会将主要精力放在 modules 的增加和 spm 工具的完善上,非常期待你的建议与参与!

最后,有任何想法,强烈推荐发送邮件到:seajs(at)googlegroups.com. 这份邮件列表里,活跃着一群充满热情的攻城师们。