seajs 会多发请求 #246

Closed
popomore opened this Issue Jul 3, 2012 · 7 comments

Projects

None yet

4 participants

@popomore
Member
popomore commented Jul 3, 2012

先看demo http://aralejs.org/lib/switchable/examples/autorender.html ,有几个 404。

switchable.js 是由多个文件合并的,请求 switchable.js 后还会去请求依赖的文件,而这些文件已经打包进 switchable.js 了。

http://aralejs.org/dist/switchable/0.9.5/switchable.js

@lifesinger
Member

分析了下,是打包不对。tabs.js 里,打包后:

define("#switchable/0.9.5/tabs",["#switchable/0.9.5/switchable","#jquery/1.7.2/jquery","#widget/0.9.16/widget","#base/0.9.16/base","#class/0.9.2/class","#events/0.9.1/events","#base/0.9.16/aspect","#base/0.9.16/attribute","#widget/0.9.16/daparser","#widget/0.9.16/auto-render","#switchable/0.9.5/const","#switchable/0.9.5/plugins/effects","#switchable/0.9.5/plugins/autoplay","#switchable/0.9.5/plugins/circular","#switchable/0.9.5/plugins/multiple"],function(a,b,c){var d=a("#switchable/0.9.5/switchable");c.exports=d.extend({})});

plugins 那些依赖应该去掉,因为已经打包在 switchable 里了,不应该重复声明。

小高明白再看下,面谈。

@lifesinger lifesinger closed this Jul 3, 2012
@popomore
Member
popomore commented Jul 3, 2012

打包规则是这样的,针对每个组件分析依赖一直到头,不会考虑其他组件是否已打包依赖。

因为 tab 依赖 switchable,switchable 依赖 plugins,所以会都打包进来。

@lifesinger
Member

这个打包规则还是有问题,这样会导致加载 tabs 时,tabs 的依赖是:

["#switchable/0.9.5/switchable","#jquery/1.7.2/jquery","#widget/0.9.16/widget","#base/0.9.16/base","#class/0.9.2/class","#events/0.9.1/events","#base/0.9.16/aspect","#base/0.9.16/attribute","#widget/0.9.16/daparser","#widget/0.9.16/auto-render","#switchable/0.9.5/const","#switchable/0.9.5/plugins/effects","#switchable/0.9.5/plugins/autoplay","#switchable/0.9.5/plugins/circular","#switchable/0.9.5/plugins/multiple"]

loader 在加载时,不知道 plugins/xxx 已经打包在 switchable 中了,缺乏信息去做判断。

spm 打包时,看来没想象中的简单,还得分析某个依赖是否在已有的依赖中,如果在,则不重复引入。康辉看下。

@leoner
Member
leoner commented Jul 4, 2012

假设合并规则如下:

    switchable.js: ['const.js', 'p1.js', 'p2.js'],
    tabs: 'default'

其中tabs的依赖为['switchable.js', 'p1.js', 'p2.js']
那么现在如果我们加载tabs, tabs执行的时候,seajs发现他依赖三个文件‘switchable.js, p1.js, p2.js’, 由于seajs不可能知道switchable.js其实已经打包了p1.js, p2.js,所以会同时加载这三个文件,这样导致了上面的错误的发生。所以解决办法就是如果我们在dist中发现了合并模块,那么就需要检查那些模块依赖了合并模块,并进行排除。比如还看上面的例子:
tabs依赖了switchable.js这个模块,这个模块合并了p1.js, p2.js, 那么我们就需要从tabs中把p1,p2的依赖进行删除.

@lifesinger
Member

不错,试下了,可以了。

@leoner
Member
leoner commented Jul 4, 2012

@popomore @lifesinger 这个问题已解决,switchable也已经重新打包。

@ekinwei
ekinwei commented Aug 13, 2014

为什么我加载一个Validator模块,连增加很多依赖的js的请求啊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment