seajs升级到2.0之后发现的define问题

67 views
Skip to first unread message

leader tom

unread,
May 1, 2013, 11:56:32 PM5/1/13
to se...@googlegroups.com
问题描述:
  之前使用seajs 1.x的时候,大量的使用到了如下写法:
    define(['a.js,b.js'],function(){})
    使用起来是没问题的,因为源码里的define是有考虑到的(以下摘自1.3的seajs代码片段):
    if (arguments.length === 1) {
      factory = id;
      id = '';
    }
    // define([], factory)
    else if (util.isArray(id)) {
      factory = deps;
      deps = id;
      id = '';
    }

    // parse deps
    if (!util.isArray(deps) && util.isFunction(factory)) {
      deps = parseDependencies(factory.toString());
    } 

 升级到2.0之后,之前的js全部报错了,定位到是define出了问题,2.0的define做了一些修改,如下(以下摘自2.0的seajs-debug代码片段):
 function define(id, deps, factory) {
  // define(factory)
  if (arguments.length === 1) {
    factory = id
    id = undefined
  }
  // Parse dependencies according to the module factory code
  if (!isArray(deps) && isFunction(factory)) {
    deps = parseDependencies(factory.toString())
  }

从代码上看,2.0之后定义define(['a.js,b.js'],function(){})这种形式的话,参数id变成了数组,deps就变成function了,导致后面解析有问题。
目前解决办法是补齐所有参数,这样OK。但是我之前项目所有js都需要更新一次。
考虑seajs升级之后应该也能兼容以前的情况,希望作者考虑一下是否增加以前对参数的判断,保证向前兼容。
或者是我理解不到位,还望作者多多指教

Frank Wang

unread,
May 2, 2013, 8:58:27 AM5/2/13
to seajs
可以自己打个补丁:

var _define = define
define = function(id, deps, fn) {

  if (typeof id === "string" && typeof deps === "function") {
     fn = deps
     deps = null
  }

  _define(id, deps, fn)

}


2013/5/2 leader tom <tomlea...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "seajs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to seajs+un...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 



--
王保平 / 玉伯(射雕)
送人玫瑰手有余香

leader tom

unread,
May 2, 2013, 10:11:42 PM5/2/13
to se...@googlegroups.com
恩,在源码处可以自己做一些小的兼容处理,解决办法是OK的,感谢,但是考虑项目中对sea源码的一些兼容/修改应该越少越好,业务代码专注业务,框架问题由框架解决,因此在社区咨询了该情况,也希望玉伯确认一下这种省略id的define写法是否还支持(2.0.x之后是否fix一下)?

在 2013年5月2日星期四UTC+8下午8时58分27秒,Frank Wang写道:

Frank Wang

unread,
May 3, 2013, 1:39:18 AM5/3/13
to seajs
2.0 之后,只支持 define(id, deps, fn) 和 define(fn) 这两种写法
其他的都不支持了。


2013/5/3 leader tom <tomlea...@gmail.com>

leader tom

unread,
May 6, 2013, 5:43:42 AM5/6/13
to se...@googlegroups.com
恩,看到了,还想再请教一下去掉define(deps,fn)这种方式的原因是什么。?

在 2013年5月3日星期五UTC+8下午1时39分18秒,Frank Wang写道:

李振文

unread,
May 6, 2013, 5:55:31 AM5/6/13
to se...@googlegroups.com
为什么不支持define(deps,fn)这种写法呢?

 1.日常开发中,习惯使用define(fn),用工具合并后补上deps来优化解析性能;2.0为何强制要求硬编码id?
    这样需要让合并工具去理解id路径——而且可能每个项目的id路径不一样(又可能同时使用多个项目的模块库),又需要做差异化,搞复杂了
 2.小项目开发我不需要用合并工具,又想补上deps来优化解析性能,这样又必须自己去算id?这样并不自由哦

在 2013年5月3日星期五UTC+8下午1时39分18秒,Frank Wang写道:

Frank Wang

unread,
May 6, 2013, 10:33:21 PM5/6/13
to seajs
你应该是说为什么不支持 define(id, fn) 吧?这个我最近也在考虑是否要再增加回去,支持下。

直接写 define(id, fn) 会有风险,因为一压缩,require 关键字没保留,就出问题了。


2013/5/6 李振文 <i...@lizhenwen.com>
Message has been deleted

李振文

unread,
May 6, 2013, 11:15:04 PM5/6/13
to se...@googlegroups.com
不是的,是问为什么不支持define(deps,fn)
不想再手动或用工具拼上id,让seajs自动算就够用了,id实质就是url拉,开发不需要再过多的关注

在 2013年5月7日星期二UTC+8上午10时33分21秒,Frank Wang写道:

leader tom

unread,
May 6, 2013, 11:16:31 PM5/6/13
to se...@googlegroups.com
振文说的也是我一楼提到的情况,我们已经指定了依赖,但没有填充id。振文说的define(deps,fn)这种写法,deps是依赖数组。

在 2013年5月7日星期二UTC+8上午10时33分21秒,Frank Wang写道:

Frank Wang

unread,
May 6, 2013, 11:19:15 PM5/6/13
to seajs
define(deps, fn) 这样的话,岂不永远不能合并了?一个文件中只能有一个模块了。

我想想。要不就还原回  sea.js 1.x 的支持。


2013/5/7 leader tom <tomlea...@gmail.com>

Frank Wang

unread,
May 6, 2013, 11:20:28 PM5/6/13
to seajs
我回复到这里了:https://github.com/seajs/seajs/issues/713#issuecomment-17521256

两位看看,可以补充。


2013/5/7 Frank Wang <lifes...@gmail.com>
Reply all
Reply to author
Forward
0 new messages