锁定老帖子 主题:JSI的导入指令参数顺序调整意见征询
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-13
JSI中依赖的处理和导入的行为是不同的.
JSI每个装载单元都有独立的上下文,他们的依赖也不会相互影响,也不会受全局变量的影响. 所以,hax上述的担心是没有的(如果是我理解的错误,还请hax耐心指出,^_^). 例如,我在脚本C1中用到了jQuery,那么我申明 this.addScript("c1.js","C1", "org.jquery.$"); 能后,我在页面上直接: $import("org.prototype.$"); $import("example.C1"); 这里,两个$变量是不会相互影响的. 页面上调用的$是prototype的$,而c1.js里调用的$还是他的jQuery 的$. 关于prototype和jquery在JSI中共存的方式. 我以前专门写过一个例子: http://jindw.iteye.com/admin/blogs/71280 仍外,关于调试器依赖的问题,我还是不能认同hax的观点. 靠日志解决不是好办法.对于前端脚本来说,日志其实是加入在代码中的垃圾. 到时候还是要清理(JSA新版本中加入了调试信息清理功能).而且添加删除日志也远没有设置断点来的轻松. 而模块做到很小,也不一定是好事. 如果,项目一开始,我们就做好正式发布时导出成单一脚本,完全脱离装载器的打算,那么这样做很好. 但是,如果我们想在运行时采用jsi/pies之类的系统,那么模块太小对性能来说也是一个小小的考验. |
|
返回顶楼 | |
发表时间:2008-02-13
nihongye 写道 我觉得import指令应该只包含所依赖的类名,如import("x.y.z"),至于"x.y.z"这个类在那个文件,通过另一个文件来指定,最好有一个默认的映射规则。
独立控制每个文件使用什么形式加载。 另外不用eval,用document.write script标签的形式,因为知道类和文件的映射关系,便可以检测相应的类是否存在来判定文件是否已经加载下来。 嗯,确实,JSI计算好依赖直接document.write出来,是一个简单的办法.比JSI现有的延迟装载实现简单,也不需要脚本转换. 完全没有装载器的介入,可能也更容易让人接受. 我也可能在后续版本中加入这种功能. 有利必有失,这样一来,完全没有装载器去隔离冲突,JSI的功能也就大大则扣. 这种装载方式,可以在开发调试时使用,运行时合并成单个脚本更合算. 其实,这种方式就是一个简单的运行时脚本合并功能. |
|
返回顶楼 | |
发表时间:2008-02-13
jindw 写道 JSI中依赖的处理和导入的行为是不同的.
JSI每个装载单元都有独立的上下文,他们的依赖也不会相互影响,也不会受全局变量的影响. 所以,hax上述的担心是没有的(如果是我理解的错误,还请hax耐心指出,^_^). 抱歉,偶过春节睡得太多睡糊涂了,这个是你原来就已经实现的特性,不过我看到你写的“当该参数未指定时,target为全局变量容器,等价于直接声明的全局变量”时,一时脑子岔了,以为你新版本的jsi为了异步导入和延迟导入的特性准备改成直接导入到global上了。 |
|
返回顶楼 | |
发表时间:2008-02-13
jindw 写道 仍外,关于调试器依赖的问题,我还是不能认同hax的观点.
靠日志解决不是好办法.对于前端脚本来说,日志其实是加入在代码中的垃圾. 到时候还是要清理(JSA新版本中加入了调试信息清理功能).而且添加删除日志也远没有设置断点来的轻松. 而模块做到很小,也不一定是好事. 如果,项目一开始,我们就做好正式发布时导出成单一脚本,完全脱离装载器的打算,那么这样做很好. 但是,如果我们想在运行时采用jsi/pies之类的系统,那么模块太小对性能来说也是一个小小的考验. 设断点,script单元就必须是基于文件的,而不能eval了。这样你好像只能使用异步加载(即带有函数参数的$import来控制导入的名称了)。鱼与熊掌可以兼得否? 编程模块小我觉得总是好事情。可以在正式发布时通过某种打包方式(除了导出单一脚本,也可以用其它方式,譬如我看到jsi的源代码最后有cachedScripts参数,应该就是可以用来干这个事情的吧)解决性能问题。 |
|
返回顶楼 | |
发表时间:2008-02-14
hax 写道 jindw 写道 仍外,关于调试器依赖的问题,我还是不能认同hax的观点.
靠日志解决不是好办法.对于前端脚本来说,日志其实是加入在代码中的垃圾. 到时候还是要清理(JSA新版本中加入了调试信息清理功能).而且添加删除日志也远没有设置断点来的轻松. 而模块做到很小,也不一定是好事. 如果,项目一开始,我们就做好正式发布时导出成单一脚本,完全脱离装载器的打算,那么这样做很好. 但是,如果我们想在运行时采用jsi/pies之类的系统,那么模块太小对性能来说也是一个小小的考验. 设断点,script单元就必须是基于文件的,而不能eval了。这样你好像只能使用异步加载(即带有函数参数的$import来控制导入的名称了)。鱼与熊掌可以兼得否? 编程模块小我觉得总是好事情。可以在正式发布时通过某种打包方式(除了导出单一脚本,也可以用其它方式,譬如我看到jsi的源代码最后有cachedScripts参数,应该就是可以用来干这个事情的吧)解决性能问题。 是的,若要良好的调试支持,就不能eval了. 可以用延迟装载的方式,和同步装载的区别是,导入指令和其他脚本必须写在不同的script标签里(延迟装载就是说,$import的对象需要在下一个script标签中才能生效),这样,没有异步回调那么麻烦,也不必忍受eval带来的调试困难. 算是鱼与熊掌各取一半吧. 关于模块最小化,我们想法基本一致,我也期望编程模块细分,细分的时候充分考虑一下运行时脚本管理的开销就是. 我上面反对过渡细分,只是因为曾经碰到过变态的细分要求.条件反射,呵呵. |
|
返回顶楼 | |
发表时间:2008-02-14
jindw 写道 是的,若要良好的调试支持,就不能eval了. 可以用延迟装载的方式,和同步装载的区别是,导入指令和其他脚本必须写在不同的script标签里(延迟装载就是说,$import的对象需要在下一个script标签中才能生效),这样,没有异步回调那么麻烦,也不必忍受eval带来的调试困难. 算是鱼与熊掌各取一半吧. 还是采用前面的假设,用户用到jsilib1和jsilib2,jsilib1依赖prototype,jsilib2依赖jquery。现在的问题倒不是用户如何import jsilib1和jsilib2,而是jsilib1、jsilib2如何import prototype和jquery。 延迟装载貌似只能针对最后的client code(即在页面中的代码),如果我延迟载入了jsilib1,那prototype到底是怎么载入的呢?是否取决于jsilib1的import语句? 还有,如果要发布一个基于jsi的类库,那么该类库在导入其他类库的时候,到底应该采用哪一种方式呢?难不成,每种方式都备一份? |
|
返回顶楼 | |
发表时间:2008-02-14
jindw 写道 是的,若要良好的调试支持,就不能eval了. 可以用延迟装载的方式,和同步装载的区别是,导入指令和其他脚本必须写在不同的script标签里(延迟装载就是说,$import的对象需要在下一个script标签中才能生效),这样,没有异步回调那么麻烦,也不必忍受eval带来的调试困难. 算是鱼与熊掌各取一半吧. 还有,延迟装载,就要求该脚本文件要把自己的变量包在一个闭包中避免泄漏到global上去。这个包裹过程在有eval的情况下可以自动加上,在异步load的情况下已然被封到了onload函数里。但是对于延迟装载就必须手动加了吧(当然可以配合服务器端程序变成自动的)。 |
|
返回顶楼 | |
发表时间:2008-02-14
JSI的延迟装载和异步装载过程非常相似.
他们的实现是这样的: 1.计算出全部未装载的依赖,并将依赖加入缓存. 2.执行同步装载. 其实所有的三种装载方式,原理都是一样的,只不过非同步装载在真正装载前有个预处理. 而异步装载和延迟装载的区别也就在于预处理过程中如何缓存脚本. 异步装载就是直接xhr异步读取js文件,加入JSI的脚本缓存. 而延迟模式就略显麻烦了,如hax所言,他是通过打印一段引用脚本,脚本文件的内容就是用闭包封起来的源代码. $JSI.addCacheScript("mypkg","hello.js",function(){eval(this.varText)/** * helllo world 函数 */ function hello(){ alert("hello world") } }) 而这段脚本的生成,我们可以在脚本打包时自动生成. 如果在调试期间,我们不希望每次修改都去运行任务,我们可以用一个jsp代理或者一个servlet过滤器去做相关的文本处理,同时还可以确保转换后的脚本与源文件行数完全对应,这就是JSI对于调试友好实现的基本原理. 其中:eval(this.varText)这句时jsi里面比较关键的一点,他除了申明依赖之外,还构造了一个钩子函数. 能后外界就可以控制装载单元的内容了.如:注入装载后依赖. |
|
返回顶楼 | |
发表时间:2008-02-14
果然是要依赖服务器端啊。而且从你说的来看,好像无论是script标签延迟加载,还是异步加载,都是要配合服务器端的?
|
|
返回顶楼 | |
发表时间:2008-02-15
其实也不叫依赖服务器端了.
是这样,发布的时候,我可以一次将全部脚本处理好,作为静态文件放置在服务段. 但是调试期间,为了方便,我就直接通过代理,即时处理这些脚本了. 另外,异步装载和同步装载需要的资源完全相同. 不需要对脚本做闭包处理. |
|
返回顶楼 | |