-
Notifications
You must be signed in to change notification settings - Fork 171
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
<项目目录设计规范>讨论 #13
Comments
对于利用后端模板系统的多页面的项目而言的话,一般都要求某一个action与某一个tpl对应,在开发时期与上线部署时期,tpl的相对路径不改变能方便FE与RD双方的开发与调试。 所以可以考虑把所有的模板文件放到 另外 |
package项目src目录结构设计的问题以esui举例,因为它是典型package项目,并且包含css和img资源引用。 现在,package下src目录设计是这样的:
从业务项目的require paths配置说起常见的场景是,我开发一个业务项目,其使用了esui,这时需要对引入lib目录的package进行require的路径映射配置。 首先, 那么,我们只能配置
看起来,貌似解决了一些问题。 css资源的依赖开发业务项目时,我需要使用esui/Button,其依赖一个css资源,我们假设文件名叫
然后在Button.js里这么引用: 看起来从路径上来说,是正确的。但是,对于Button.js,当前的moduleId是 从上面的描述可以得出结论: 再看 个人觉得合适的方案package项目src目录下
所以,以下两个例子都是ok的。 expamle-1:
expamle-2:
require path配置则可以如此: 进一步,因为src下只包含 当然,package通过工具引入和管理,那配置也是自动管理的,为了保证引入package的完整性,可以不使用上段说的 |
关于require path的问题我认为业务项目中,对package的引用是通过 而
在这样的方式下,没必要把js文件夹设计成如此多层的结构,继续保持js文件夹的扁平性即可。 例如以esui为例,结构依旧是
而
这种情况下, amdjs对packages的查找规则参考如下:
关于CSS这东西不理解为什么这个resource id是不能被normailize的,amdjs对loader plugin中的resource id有强制的normalize要求:
这里 不可normalize 是指在逻辑上不能做,还是技术上确实存在着障碍呢? 虽然说amdjs提供的
从这个角度来看, esui/Button 对应的“文件夹”其实是 esui ,加上CSS的resource id ../css/button.css ,得到的是 esui/../../css/button.css ,这是一个非常自然的过程,再加上esui的package配置,把 esui 替换成 ../lib/esui/src/js ,得到 *../lib/esui/src/js/../css/button.css * ,依此找到最终的src应该不是什么问题。 即使抛开文件系统的说法,AMD正常的relative module id似乎也是这个工作,假设我当前module是 my/foo ,在 my/foo.js 中写一个 综合以上,我还是不大认同要修改当前项目文件夹结构规范。 |
package main的悖论在Common-Config spec里,
对引用package中的resource normalizeLoader-plugins规定了必须normalize,确实是这样,并且这个实现肯定是loader做的,不是各个plugin本身做的。如果pluginbu提供normailze方法,loader就会使用自己的normalize方法。对于css plugin,其normalize逻辑确实应该和默认逻辑是一致的。 所以,这就是问题: 在 因为,normalize结果是非法的。 所以,我才得出之前的结论: |
关于package和main问题我认为 对于 resource normalize的问题amdjs允许plugin做normalize方法,因为resource id是 a plugin-specific string that the loader plugins knows how to parse to load the resource ,因此plugin应该有完整的控制权,我们可以实现将resource id转为absolute path的过程再来控制缓存吧。 |
resource normalize的问题
缓存是由loader控制的,不能由plugin控制。 然后,两个概念,toUrl和normalize是完全无关的两个事情。
关于package的开发时与loader的packages配置我认同如下的点:
但是,回到那个问题,loader的packages配置,在处理时,是不是应该是一个纯粹的path lookup |
第一,默认的module的normalize规则是怎么样的,module根据普通的normalize规则可以找到正确的.js文件,CSS使用同样的normalize规则,为什么就找不到了……我看了一下Loader Plugins的normailize部分,似乎并没有什么冲突的内容 第二,loader应该是这样的
amdjs没有要求package中的location再从path去做一次映射,我觉得location就是直接使用的,并非纯粹的path lookup 而在package开发过程中,作为package developer是在什么时候用自己的package的,通常是debug的时候,那么这个loader也应该配置了package选项? |
又想了一下,感觉应该package的location和path还是有点关系的,大致的一个算法如下:
在这样的方案下,我也不认为package的配置有什么问题,对于esui这样的package,应该不会在 |
这个我不太容易理解,假如 |
应该就是require('esui/main')的效果 |
对于package的使用者来说,就和你说的一样,因为有 但是如果我是esui这个package的开发者,我认为package的源码中不应该出现 |
关于packages配置是否只作用于path lookup阶段按照@otakustay的算法,是达不到@leeight 说的: 在 如果想要达到 那么,与moduleId转换相关的配置项就有两个: require('esui')===require('esui/main')的影响对package开发者的影响以下场景基于现在的<项目目录设计规范>草案,esui的开发过程 场景1: require('esui')===require('esui/main')
main要引用Control,应该 所以 场景2: require('esui')!==require('esui/main')
main要引用Control,应该 所以 以上两种场景都比较诡异,我打算参照下requirejs关于packages的描述,以及commonjs package中为什么bin通常放在root下,源码通常放在lib目录下。 但无论怎么看,js目录貌似是多余的。所以又引入下面一个问题: package开发时对css资源的引用关于这个问题,我又回到上面的说法: '../css/button.css'是 在实际load的时候,我们拿它去toUrl, 所以我认为, |
@errorrik 所说的场景2是不怎么正确的,在开发esui的时候,任何模块名都不应该含有 esui 字样,所以 对于CSS的问题,我的疑问是,css loader plugin提供一个normalize方法,为什么这个方法要给loader 再者,即便给loader的是
在RichSelector中,我使用 |
是的,我上面举的例子2是不合理的,写出来是为了显而易见的看到其不合理性。 package配置的处理问题,我待会下午先做个试验,看看情况,结果通报到此 |
这么热闹的帖子一定要赶在截止前插一楼。 |
关于这个问题,我理解应该根据js的文件的路径计算出css文件的路径,不应该用 换句话说,即便定义模块的时候,显示的声明了模块Id,但是不应该用模块Id参与资源路径的计算,而是应该用模块的Url进行资源路径的计算。 |
关于packages配置与package开发时module的问题https://github.com/amdjs/amdjs-tests/blob/master/tests/packagesConfig/funky/index.js 从这里可以看出, package在开发时module必须使用匿名id进行define,并通过relative id引用依赖。 唯一的麻烦,就是loader实现了。。。 关于package开发时css资源的放置问题
这个问题在https://github.com/amdjs/amdjs-api/wiki/Loader-Plugins里,normalize章节有描述。整篇提到的是resource id、module id,而不是path。也就是说,这货是资源标识,不是资源路径。
你的例子,
所以我的建议是,干掉js直接src下。css资源可以直接放src下,也可以放src/css下。 |
@errorrik 看amdjs的Loader Plugin这一章的时候,其实也很困惑这个resource id是什么,从你的描述来看,一个 absolute id 是指基于 baseUrl 的id,因此如果基于 baseUrl 再有 .. 这样的东西,就会出问题,是这样吗? 另外我对于Loader Plugin章节的理解是, |
This is useful in providing optimal caching and optimization, but it only needs to be implemented if: the resource IDs have complex normalization |
@errorrik 所以CSS的这个resource id,不能认为是coplex normalization的情况是吧……(其实这都是扯,真要说我们因为项目结构复杂所以是complex也没人能喷) 那么我倾向于这样的方案,不知是否符合要求了
|
Loader-Plugins spec里描述的resource id,我根据描述和index的例子,个人的理解它的意图是, |
你上面给出的例子,从css资源管理的角度来讲,是没问题的。但是我们现有的《项目目录规范》草案里,对业务目录是这么描述的:
所以我觉得我们可以统一下:
|
如果一定要2选1,我更赞同第2个方案,大家都允许出现,不过第2个方案里 .js 文件放在哪,直接放在 src/ 下吗? 我不赞同第1个方案的原因是,如果根据这个方案,那么如果是esui,则结构可能是:
js和css放在同一目录下,这种结构我认为是OK的,只不过各控件引用lib的时候要 但其它package可能有问题:
|
不是的 对于业务项目src下必须只包含 package项目的src下直接按照上面的的原则划分。也就是 源文件资源不允许(MUST NOT)按资源类型划分目录的例子package项目例:
业务项目例子:
仅仅JS资源不允许(MUST NOT)按资源类型划分目录的例子package项目例:
业务项目例子:
当然,如果仅仅JS资源不允许(MUST NOT)按资源类型划分目录,那上面的例子也符合这个规范。 |
原来是这样,总算觉得自己完全理解了 这2个方案下,我选择2:
|
@otakustay 的意思就是自由化咯,可以增加css/tpl目录,也可以不增加放同级,项目开发者自己把握,但是不允许出现js目录 如果是这样,其他同学还有没有意见? |
就是这个意思,无论是package还是biz的module目录,都放开限制 |
为什么 |
因为你的base module是 |
我看规范里面没有说明对于resourceId的normalize一定要参考moduleId,为什么不用module Url来计算呢?即便是按照moduleId来计算,算出来的结果是relative的,但是这个应该指的是resourceId,如果我要加载这个资源的话,resource Url应该是很明确的。 |
我理解resource id的用处就是按照正常的normalize方案计算出resource url,然后资源的缓存和加载都应该以resource url为准。否则我可以创造出两个不同的resource id,但是指向同样的resource url,难道要加载两次么? |
哈哈 @leeight 提的这个情况不就是我们一直在讨论的情况嘛~ 关于这个我觉得还是可以参考正常js module加载,比如这样:
这个在js module上也超出了 baseUrl 的范围,计算出的resource id也是relative的,且和plugin无关,是不是loader本身也不会缓存? |
bingo 这个问题和baseUrl无关咯 如果是global require的话,只能使用absolute id来加载的。如果是local require的话,就看你当前的module id了。requirejs处理的很巧妙,保留第一个term,比如a/b的../../../c -> a/../../../c。a/../../../c是这个absolute id,第一位不是.或.. |
所以 esui/src/js/Button 对应的CSS如果是 ../css/Button.css 的话,保留第一个term后形成 esui/../css/Button.css ,似乎也是正确的?我们为何不这么做呢? 当然不能说这个方法没问题,假设有这样的结构
对于 js/Button 和 js/widget/Button ,都能搞出 ../css/Button.css ,不过相信没啥人能搞出这样的结构来,所以requirejs的这个策略我感觉还是很不错的 |
@errorrik @otakustay 现在无法理解你们在讨论啥了。貌似跟resource的加载和模块怎么定义这两个主题有些关系。 我从上面的讨论中还是无法理解为啥目录结构为啥会影响到resource的加载了(或者你们也是认为不会有影响,但是让我理解成这样子了)。
即便有人写出这种结构,两个Button.css还是能够顺利计算出absolute url,也应该可以正常加载的,这个例子有啥意义?
这个想说明啥问题呢? |
@leeight 我的理解是这样的: 当前的模块id是 esui/Button ,在这个模块中引用 ./Control ,能计算出另一个模块id为 esui/Control 。这个是正常的。 把这里的 esui 看成根目录 / ,如果在 esui/Button 里引用 ../SomeThing ,超出了根目录的范围,因此计算出的会是一个 相对于当前根目录的路径 ,即 ../SomeThing ,这里因为已经超过了根目录,因此不会是一个绝对的路径(因为根目录以外有什么,我们不知道)。 就是因为这个算法,一但在根目录以外,只能出个相对的路径(loader的默认算法,先不讨论我们要不要override之),所以才会有 不同模块引用不同东西产生同样的resource id 这一问题。 而requirejs对于这个问题,用了一个办法去处理,即当计算出的路径是相对路径时,加上当前模块名的第一部分,即把 ../SomeThing 变成 esui/SomeThing ,类似的概念是,我们虽然不知道根目录外有什么,但依旧能在相对路径前加个 / 。 |
关于id和url的说明先拿module来看。通常我们define module的时候是使用
而且,默认规则中,id -> url的结果,是 关于normalize只有在module内部,使用
对于top level的id,normailze是不会执行step1的。 require resource和require module在下面require module的过程中:
require resource的行为和require module是一样的,也必须是一样的。我想这个没什么好质疑的。 在
都是path style,当然是和默认normalize保持一致最自然。 package开发时的require resource我为什么一直_强调_在
回到最本质的问题:package项目的src目录的目录结构我们在讨论的,其实是 灰大提出的模式,其他同学为什么不能接受?不能接受的具体原因是什么? |
就这么着吧,我没问题了。 |
讨论谢幕 |
<项目目录设计规范>规范草案地址为:http://fe.baidu.com/doc/ecom/std/directory.text
讨论时间:
讨论时间截止下周三(2013-2-27)凌晨12点。下周三(2013-2-27)将对有分歧的问题发起投票。
提出问题时间截止周日(2013-2-24)凌晨12点,此时间后不允许提出新的问题,可继续对已提出问题进行讨论发表意见。
请大家踊跃提问题发表意见。
The text was updated successfully, but these errors were encountered: