Comments (16)
我觉得不用这么多下划线开头的,把私有的全放到require.esl
下面,成为require.esl.noRequest = [ ... ]
这样就好了
另外这个noRequest
其实不靠谱,我整理一下说说为啥
from esl.
除了可能会额外匹配,还有啥?
不想在require下新开property的原因是,amd自己的扩展没这习惯啊
from esl.
除了可能会额外匹配,还有啥?
简单来说就是这样的代码:
if (role === 'admin') {
require(['foo', 'bar'], start);
}
else {
require(['bar'], start);
}
有foo
的时候必有bar
,但也可能没有foo
只用bar
这种情况下,我肯定会把bar
和foo
打包在foo.js
中,但是当只需要bar
的时候,也应该会去加载bar.js
所以我希望的一个效果是:
当需要
bar
的时候,发现foo
也已经在加载中了(或者可能的话,预期会有foo
的加载),则不去加载bar
,否则就加载bar
不过我不觉得这个问题有个很好的解决方案……如果想不明白,就按noRequest
来吧?
from esl.
不想在require下新开property的原因是,amd自己的扩展没这习惯啊
我的意思不是不开,而是不要我们一个新的私有功能就开一个属性,而是统一放到esl
这个属性下面去
前面的代码有点问题,应该是这样:
require.config({
esl: {
noRequest: ['foo', 'bar']
}
});
from esl.
这种情况下,我肯定会把bar和foo打包在foo.js中,但是当只需要bar的时候,也应该会去加载bar.js
这种场景下,是没啥好的解决方案。如果你是为了http request limit的话,那还不如把foo打到bar里面,不要request foo。
from esl.
一种解决方案就是像我前面说的,因为是require['foo', 'bar']
,这里foo
在前bar
在后,所以在处理bar
的时候,应该能发现foo
已经处理过或正在处理中,此时通过一个比如merge: { bar: 'foo' }
这样的配置,发现foo
已经在处理了那么bar
就不发请求,否则就发请求
不过对顺序要求比较高,所以后面才有另一句 或者可能的话,预期会有foo的加载 这东西
from esl.
而是统一放到esl这个属性下面去
个人不建议放在一个所谓的esl属性下。原因有2:
- require.config中,每一项代表的是一个feature,多一个esl出来,不协调
- esl中,对config mix,是自动做二级mix处理的,原因写在源码里了。如果多一个不同级的config,这事就麻烦了
如果只是因为下划线_
的不顺眼,我觉得,把下划线删掉好过新开一个level的config。
对于之前{Array.}noRequest的配置方式,确实有些单一。不排除require['foo','bar']
时bar可能合并到foo,但业务场景未来可能并不需要foo,开发者会改成require['bar']
的场景。面对这种场景,如果采用我之前说的方案,开发者就会不得不改require.config。
所以,我觉得方案可以是:{Object}noRequests
,key
是module id,prefix match;value
是string or Array,全匹配,允许*
。意思是:key
被匹配上的module,如果其value
设置的module已经或者正在被加载,则不发送加载请求。
from esl.
理解,所以最后noRequest
就会变为一个对象,按上面讨论的来进行
但是关于 或者可能的话,预期会有foo的加载 这一点,是否真的无法做?
简单地来说,保证require(['foo', 'bar'])
和require(['bar', 'foo'])
行为一致,这个应该是可以的吧?
from esl.
require(['bar'])
require(['foo'])
这种怎么办
from esl.
还有,如果foo2依赖了foo,然后require(['foo2', 'bar'],这样的呢
这些场景貌似都无解
from esl.
require(['bar'])
require(['foo'])
这种怎么办
这种可无视
from esl.
还有,如果foo2依赖了foo,然后require(['foo2', 'bar'],这样的呢
这是另一个话题,我最早的设想是
require.config({
resolve: {
'foo2': 'foo',
'bar': 'foo
}
});
这样foo2
会被指定到foo.js
,bar
也指定到foo.js
,最后只请求一个文件
但这个方案有问题:
foo2
有可能和N个模块打包在一起,不同场景下用不同的foo2
同样有可能要单独加载
所以我认为还是搞不定
from esl.
这样foo2会被指定到foo.js,bar也指定到foo.js,最后只请求一个文件
如果仅仅是这种需求,完全可以用paths搞定了。当然,用paths的限制是,不能有子模块
from esl.
本来是的,但现在好像用paths
以后会请求foo.js
两次?
from esl.
哦,对,是的。因为目标文件可能是匿名id模块
from esl.
又记起一个事,上次讨论时真给忘了……
事实上本来想把noRequest
这个功能,和另一个合在一起来配置的,就是当我们build后,可能对js会加版本号,但是require
的依旧是一个不带版本号的模块名,定位.js
不一定正确
因此本来想的是,有一个类似toUrl
的配置(函数),把一个模块名定位到一个.js
文件,如果有多个模块定位到同一个.js
文件,就只发起一个请求
现在的noRequest
依旧没能解决版本号这事来着?
from esl.
Related Issues (20)
- `relative2absolute` 的问题 HOT 5
- 求助 zrender中怎么直接加载模块 HOT 1
- esl在一些特殊情况下无法加载module HOT 1
- 一个比较严重的bundle bug, header上多次添加同一bundle模块url HOT 4
- 压缩混淆模块后,局部require的方法名如果不是require,则无法加载module HOT 2
- 能否让esl支持node, 各种原因想在node上用esl HOT 2
- require.config 修改 packages 的配置 HOT 1
- add cross origin attribute to root require
- 处理 bundles 时候有可能请求错误的地址 HOT 1
- bundles 要不要考虑支持 glob pattern 或 RegExp match HOT 6
- 全局 require 函数,处理 querystring 的疑似 bug? HOT 1
- 调用require函数时 data-main指定的文件尚未加载完成.
- 相同的packages配置在requirejs中可以使用, 在esl却有问题.
- Performance Issue
- require 模块失败后,再次 require 该模块不会重新加载
- esl 怎么不做UMD?
- esl 与 requirejs 表现不一致的地方 HOT 1
- ESL 支持IE6吗? HOT 1
- factroy中require正则有点问题 HOT 1
- 使用data-main,并在config中设置waitSeconds出错 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from esl.