New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rethinking of module id in libs #112

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

Comments

Projects
None yet
1 participant
@lifesinger
Member

lifesinger commented Oct 29, 2011

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

需求可整理成:

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

This comment has been minimized.

Show comment
Hide comment
@lifesinger

lifesinger Oct 29, 2011

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
Member

lifesinger commented Oct 29, 2011

方案一

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

This comment has been minimized.

Show comment
Hide comment
@lifesinger

lifesinger Oct 29, 2011

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 情况时。
Member

lifesinger commented Oct 29, 2011

方案二

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

This comment has been minimized.

Show comment
Hide comment
@lifesinger

lifesinger Oct 29, 2011

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,意味着无法直接内嵌到页面。
Member

lifesinger commented Oct 29, 2011

方案三

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

This comment has been minimized.

Show comment
Hide comment
@lifesinger

lifesinger Oct 29, 2011

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 时的不匹配,会出问题。
Member

lifesinger commented Oct 29, 2011

方案四

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