rethinking of module id in libs #112

Closed
lifesinger opened this Issue Oct 29, 2011 · 4 comments

Projects

None yet

1 participant

@lifesinger
Member

这个问题不简单,参考之前的思考 #100

需求可整理成:

  1. 可以多版本共存
  2. 支持 combo
  3. 模块代码可内嵌到页面
  4. 尽量能支持直接 require('jquery/1.6.4/jquery')
@lifesinger
Member

方案一

jquery/1.6.4/jquery.js:

define([], factory)

main.js:

seajs.config({
  alias: {
    'jquery': 'jquery/1.6.4/jquery'
  }
});

define(function(require) {
  var $ = require('jquery');
});

不足

  1. 由于省略 id,代码不能内嵌
  2. 由于省略 id,不能 combo
@lifesinger
Member

方案二

jquery/1.6.4/jquery.js:

define('jquery', [], factory)

main.js:

seajs.config({
  alias: {
    'jquery': 'jquery/1.6.4/jquery'
  }
});

define(function(require) {
  var $ = require('jquery');
});

fn-define.js 中,对 define 参数中的 id 不 parseAlias

不足

  1. 由于对 define 中的 id 不 parseAlias,意味着内嵌模块的写法很严格,不能有 alias. 在实际应用中不方便。
  2. memoize 模块时的 id 和 require 时的 id 不一致,要对应上的话,内部实现会很麻烦,特别考虑 combo 情况时。
@lifesinger
Member

方案三

jquery/1.6.4/jquery.js:

define('./jquery', [], factory)

main.js:

seajs.config({
  alias: {
    'jq162': 'jquery/1.6.2/jquery',
    'jq164': 'jquery/1.6.4/jquery'
  }
});

define(function(require) {
  var jq162 = require('jq162');
  var jq164 = require('jq164');
});

fn-define.js 中,对 define 参数中的 id 会 parseAlias

不足

  1. 使用相对 id,意味着对 combo 的支持不利,需要 loader 中对 combo 语法做解析,合理的映射回去。
  2. 使用相对 id,意味着无法直接内嵌到页面。
@lifesinger
Member

方案四

jquery/1.6.4/jquery.js:

define('#jquery/1.6.4/jquery', [], factory)

main.js:

seajs.config({
  alias: {
    'jq162': 'jquery/1.6.2/jquery',
    'jq164': 'jquery/1.6.4/jquery'
  }
});

define(function(require) {
  var jq162 = require('jq162');
  var jq164 = require('jq164');
});

fn-define.js 中,对 define 参数中的 id 会 parseAlias

好处

  1. 由于使用了 top-level id, 意味着可以 combo 和内嵌到页面中。
  2. 有 top-level id, 意味着可多版本并存。
  3. 没有 alias 时,可以直接用 require('jquery/1.6.4/jquery') 来获取。

不足

  1. 增加一个约定:id 前的 # 表示不需要 parseAlias
  2. jquery.js 目录结构很严格: base/jquery/x.y.z/jquery.js 如果 base 目录变化了,比如放在了 base/libs/jquery/x.y.z/jquery.js, 则 memoize 时的 id 和 require 时的不匹配,会出问题。
@lifesinger lifesinger closed this Oct 29, 2011
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment