Skip to content
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

er默认template设定是否可以改一下 #109

Open
skyline0705 opened this issue Apr 27, 2014 · 14 comments
Open

er默认template设定是否可以改一下 #109

skyline0705 opened this issue Apr 27, 2014 · 14 comments

Comments

@skyline0705
Copy link

前两天看见etpl已经升级,是不是er的template里面可以把默认的设定改一下,防止各种target is exist的bug?

@otakustay
Copy link
Member

那你希望是ignore还是override

@skyline0705
Copy link
Author

ignore

@otakustay
Copy link
Member

能说下原因不?我个人是更倾向于override@leeight@errorrik 你们那有没有出现过同名target的问题,是什么样的场景?

@skyline0705
Copy link
Author

首先我这里除了我以外还有另一个朋友也出现过同名target现象。
首先说一下我的业务需求,我页面中有一个子Action,与父action调用了同一套tpl文件(里面有两个target),于是在子action的view与父action的view中相当于require了这个tpl两次,然后在er3.1中就会报错说target is exist。
我朋友的状况类似,为了合并tpl请求,上线前把一些tpl做了合并(一个tpl里面有多个target),结果也报这个错误。
现在我们两个的解决方案都是一个,就是保证一个tpl里面只有一个target。
其实关于这个问题我个人觉得有两个解决方案,第一种就是直接把er template里面默认设置改成ignore,或者就是针对er/template的require是不是可以记录某个tpl文件的加载状态,如果之前已经require过后续再require的时候就不去加载?

@otakustay
Copy link
Member

  1. 基类和子类require的tpl是同一个的话,esl应该会只加载一次才对,这事不需要loader来做吧?
  2. 如果不同的tpl中有同名target,合并后确实会出错,但为啥要ignore而不是override呢……

@skyline0705
Copy link
Author

之前那个好像说错了,esl加载了几次我忘记了,好像应该是加载了一次,但是每次只要碰到require('er/template!******')这种etpl就会自动去编译,所以如果有同一个模板被require两次,就会出现这个东西被编译两次,而且编译应该是在require的时候编译的,所以基类与子类tpl是同一个就会造成tpl文件被编译了两次,就会造成报错说target is exist。

@otakustay
Copy link
Member

@leeight @errorrik 一起看看这个问题?我感觉有点奇怪,是不是Tplmerge或者esl也有关系?

@errorrik
Copy link

errorrik commented May 4, 2014

我遇到过这种情况,通常是开发环境到线上环境的build过程产生的。

开发环境下,如果不同的module,加载相同的template resourece,并且template里的target name是唯一的话,是不会出现target exists错误的。

但是,build的过程会合并模版。主模块可能会require('tpl!combine.html'),然后由于体积大小考虑,部分没合并的模块会require('t/l!mytpl.html')。如果mytpl.html和combine.html里,包含同样的target,就会出target exists错误

etpl的升级,其实是个权宜之计,在遇到这种问题的时候,如果可以保证同名target内容完全相同,可以通过设置etpl的option来绕开这个问题,此时无论是ignore还是override都是合理的。

另外,如果设置了ignore or override,在多人开发不同target碰巧命名相同时,将基本无法追溯。

但是根本上来说,还是应该build的template merge环节解决这个问题,或者,在build阶段设置这个option

@otakustay
Copy link
Member

这么说我就明白点了,但这里的核心问题是:

  1. foo -> t!tpl.html
  2. bar -> t!tpl.html
  3. 合并后foo -> t!combined.html,但bar -> t!tpl.html

看上去应该是TplMerge没处理好,应该把bar的引用也改掉的

另外一个方法,我们把etpl的默认改为ignore / override,通过edp doctor来检查这些,期待开发者会好好检查,这个我觉得也是合理的

至于build时改options我觉得有些复杂了,没必要

@skyline0705
Copy link
Author

@errorrik 说得那个状况是我朋友遇到的,我遇到的状况就是老代码里面,Module A跟Module B里面引用了同样的tpl,这里比如是tpl.html,然后在这个tpl里面有两个target,Module A用的是target A,Mudule B用的是target B,于是乎因为同一个tpl.html因为被编译了两遍,所以报错,当然我这个问题我可以通过把tpl拆分成两个来解决这个事儿,不过我觉得既然etpl里面有了target这么个东西,那么其实按照开发者的理解,我虽然require了一个tpl文件,但是两个模块分别调用两个target,按理来说不应该给我抛出target is exist这个问题,所以我想说的是,是否可以通过延后模版编译,等到真正确定Module调用的是哪个target的时候再编译,而不是再require的时候就直接预编译

@otakustay
Copy link
Member

理论上,如果A和B里面写的require的路径(计算后的真实路径)是一样的(即指向同一个文件),那么esl就不应该让这模板编译2次才对

能有具体的可复现的代码(最好简单点)吗,说不定是esl上的一个问题?

@skyline0705
Copy link
Author

今儿有点忙,我明后天按照原来那个老代码写一个简单的例子上传一下吧

@otakustay
Copy link
Member

辛苦,因为这好像已经不是仅仅涉及ER、ETPL的问题了,所以还是要搞清楚

@errorrik
Copy link

errorrik commented May 4, 2014

我上次查过,不是esl编译了两遍。不过可以再查一下,不一定是一样的场景。

不过,这个问题本质上是resource id和target name的map问题,edp build是基于文件处理的,中间并不涉及模板解析。看了etpl需要有开放parse的npm了

发自我的 iPhone

在 2014年5月4日,下午11:24,Gray Zhang [email protected] 写道:

理论上,如果A和B里面写的require的路径(计算后的真实路径)是一样的(即指向同一个文件),那么esl就不应该让这模板编译2次才对

能有具体的可复现的代码(最好简单点)吗,说不定是esl上的一个问题?


Reply to this email directly or view it on GitHub.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants