Giter Club home page Giter Club logo

Comments (16)

otakustay avatar otakustay commented on June 8, 2024

我觉得不用这么多下划线开头的,把私有的全放到require.esl下面,成为require.esl.noRequest = [ ... ]这样就好了

另外这个noRequest其实不靠谱,我整理一下说说为啥

from esl.

errorrik avatar errorrik commented on June 8, 2024

除了可能会额外匹配,还有啥?
不想在require下新开property的原因是,amd自己的扩展没这习惯啊

from esl.

otakustay avatar otakustay commented on June 8, 2024

除了可能会额外匹配,还有啥?

简单来说就是这样的代码:

if (role === 'admin') {
    require(['foo', 'bar'], start);
}
else {
    require(['bar'], start);
}

foo的时候必有bar,但也可能没有foo只用bar

这种情况下,我肯定会把barfoo打包在foo.js中,但是当只需要bar的时候,也应该会去加载bar.js

所以我希望的一个效果是:

当需要bar的时候,发现foo也已经在加载中了(或者可能的话,预期会有foo的加载),则不去加载bar,否则就加载bar

不过我不觉得这个问题有个很好的解决方案……如果想不明白,就按noRequest来吧?

from esl.

otakustay avatar otakustay commented on June 8, 2024

不想在require下新开property的原因是,amd自己的扩展没这习惯啊

我的意思不是不开,而是不要我们一个新的私有功能就开一个属性,而是统一放到esl这个属性下面去

前面的代码有点问题,应该是这样:

require.config({
    esl: {
        noRequest: ['foo', 'bar']
    }
});

from esl.

errorrik avatar errorrik commented on June 8, 2024

这种情况下,我肯定会把bar和foo打包在foo.js中,但是当只需要bar的时候,也应该会去加载bar.js

这种场景下,是没啥好的解决方案。如果你是为了http request limit的话,那还不如把foo打到bar里面,不要request foo。

from esl.

otakustay avatar otakustay commented on June 8, 2024

一种解决方案就是像我前面说的,因为是require['foo', 'bar'],这里foo在前bar在后,所以在处理bar的时候,应该能发现foo已经处理过或正在处理中,此时通过一个比如merge: { bar: 'foo' }这样的配置,发现foo已经在处理了那么bar就不发请求,否则就发请求

不过对顺序要求比较高,所以后面才有另一句 或者可能的话,预期会有foo的加载 这东西

from esl.

errorrik avatar errorrik commented on June 8, 2024

而是统一放到esl这个属性下面去

个人不建议放在一个所谓的esl属性下。原因有2:

  1. require.config中,每一项代表的是一个feature,多一个esl出来,不协调
  2. esl中,对config mix,是自动做二级mix处理的,原因写在源码里了。如果多一个不同级的config,这事就麻烦了

如果只是因为下划线_的不顺眼,我觉得,把下划线删掉好过新开一个level的config。


对于之前{Array.}noRequest的配置方式,确实有些单一。不排除require['foo','bar']时bar可能合并到foo,但业务场景未来可能并不需要foo,开发者会改成require['bar']的场景。面对这种场景,如果采用我之前说的方案,开发者就会不得不改require.config。

所以,我觉得方案可以是:{Object}noRequestskey是module id,prefix match;value是string or Array,全匹配,允许*。意思是:key被匹配上的module,如果其value设置的module已经或者正在被加载,则不发送加载请求。

from esl.

otakustay avatar otakustay commented on June 8, 2024

理解,所以最后noRequest就会变为一个对象,按上面讨论的来进行

但是关于 或者可能的话,预期会有foo的加载 这一点,是否真的无法做?

简单地来说,保证require(['foo', 'bar'])require(['bar', 'foo'])行为一致,这个应该是可以的吧?

from esl.

errorrik avatar errorrik commented on June 8, 2024
require(['bar'])
require(['foo'])

这种怎么办

from esl.

errorrik avatar errorrik commented on June 8, 2024

还有,如果foo2依赖了foo,然后require(['foo2', 'bar'],这样的呢

这些场景貌似都无解

from esl.

otakustay avatar otakustay commented on June 8, 2024

require(['bar'])
require(['foo'])
这种怎么办

这种可无视

from esl.

otakustay avatar otakustay commented on June 8, 2024

还有,如果foo2依赖了foo,然后require(['foo2', 'bar'],这样的呢

这是另一个话题,我最早的设想是

require.config({
    resolve: {
        'foo2': 'foo',
        'bar': 'foo
    }
});

这样foo2会被指定到foo.jsbar也指定到foo.js,最后只请求一个文件

但这个方案有问题:

  1. foo2有可能和N个模块打包在一起,不同场景下用不同的
  2. foo2同样有可能要单独加载

所以我认为还是搞不定

from esl.

errorrik avatar errorrik commented on June 8, 2024

这样foo2会被指定到foo.js,bar也指定到foo.js,最后只请求一个文件

如果仅仅是这种需求,完全可以用paths搞定了。当然,用paths的限制是,不能有子模块

from esl.

otakustay avatar otakustay commented on June 8, 2024

本来是的,但现在好像用paths以后会请求foo.js两次?

from esl.

errorrik avatar errorrik commented on June 8, 2024

哦,对,是的。因为目标文件可能是匿名id模块

from esl.

otakustay avatar otakustay commented on June 8, 2024

又记起一个事,上次讨论时真给忘了……

事实上本来想把noRequest这个功能,和另一个合在一起来配置的,就是当我们build后,可能对js会加版本号,但是require的依旧是一个不带版本号的模块名,定位.js不一定正确

因此本来想的是,有一个类似toUrl的配置(函数),把一个模块名定位到一个.js文件,如果有多个模块定位到同一个.js文件,就只发起一个请求

现在的noRequest依旧没能解决版本号这事来着?

from esl.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.