论坛首页 Web前端技术论坛

JSI的导入指令参数顺序调整意见征询

浏览 9726 次
精华帖 (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之类的系统,那么模块太小对性能来说也是一个小小的考验.


0 请登录后投票
   发表时间:2008-02-13  
nihongye 写道
我觉得import指令应该只包含所依赖的类名,如import("x.y.z"),至于"x.y.z"这个类在那个文件,通过另一个文件来指定,最好有一个默认的映射规则。
独立控制每个文件使用什么形式加载。
另外不用eval,用document.write script标签的形式,因为知道类和文件的映射关系,便可以检测相应的类是否存在来判定文件是否已经加载下来。


嗯,确实,JSI计算好依赖直接document.write出来,是一个简单的办法.比JSI现有的延迟装载实现简单,也不需要脚本转换.
完全没有装载器的介入,可能也更容易让人接受.
我也可能在后续版本中加入这种功能.

有利必有失,这样一来,完全没有装载器去隔离冲突,JSI的功能也就大大则扣.
这种装载方式,可以在开发调试时使用,运行时合并成单个脚本更合算.
其实,这种方式就是一个简单的运行时脚本合并功能.

0 请登录后投票
   发表时间:2008-02-13  
jindw 写道
JSI中依赖的处理和导入的行为是不同的.
JSI每个装载单元都有独立的上下文,他们的依赖也不会相互影响,也不会受全局变量的影响.
所以,hax上述的担心是没有的(如果是我理解的错误,还请hax耐心指出,^_^).


抱歉,偶过春节睡得太多睡糊涂了,这个是你原来就已经实现的特性,不过我看到你写的“当该参数未指定时,target为全局变量容器,等价于直接声明的全局变量”时,一时脑子岔了,以为你新版本的jsi为了异步导入和延迟导入的特性准备改成直接导入到global上了。
0 请登录后投票
   发表时间:2008-02-13  
jindw 写道
仍外,关于调试器依赖的问题,我还是不能认同hax的观点.
靠日志解决不是好办法.对于前端脚本来说,日志其实是加入在代码中的垃圾.
到时候还是要清理(JSA新版本中加入了调试信息清理功能).而且添加删除日志也远没有设置断点来的轻松.
而模块做到很小,也不一定是好事.
如果,项目一开始,我们就做好正式发布时导出成单一脚本,完全脱离装载器的打算,那么这样做很好.
但是,如果我们想在运行时采用jsi/pies之类的系统,那么模块太小对性能来说也是一个小小的考验.


设断点,script单元就必须是基于文件的,而不能eval了。这样你好像只能使用异步加载(即带有函数参数的$import来控制导入的名称了)。鱼与熊掌可以兼得否?

编程模块小我觉得总是好事情。可以在正式发布时通过某种打包方式(除了导出单一脚本,也可以用其它方式,譬如我看到jsi的源代码最后有cachedScripts参数,应该就是可以用来干这个事情的吧)解决性能问题。
0 请登录后投票
   发表时间:2008-02-14  
hax 写道
jindw 写道
仍外,关于调试器依赖的问题,我还是不能认同hax的观点.
靠日志解决不是好办法.对于前端脚本来说,日志其实是加入在代码中的垃圾.
到时候还是要清理(JSA新版本中加入了调试信息清理功能).而且添加删除日志也远没有设置断点来的轻松.
而模块做到很小,也不一定是好事.
如果,项目一开始,我们就做好正式发布时导出成单一脚本,完全脱离装载器的打算,那么这样做很好.
但是,如果我们想在运行时采用jsi/pies之类的系统,那么模块太小对性能来说也是一个小小的考验.


设断点,script单元就必须是基于文件的,而不能eval了。这样你好像只能使用异步加载(即带有函数参数的$import来控制导入的名称了)。鱼与熊掌可以兼得否?

编程模块小我觉得总是好事情。可以在正式发布时通过某种打包方式(除了导出单一脚本,也可以用其它方式,譬如我看到jsi的源代码最后有cachedScripts参数,应该就是可以用来干这个事情的吧)解决性能问题。


是的,若要良好的调试支持,就不能eval了.
可以用延迟装载的方式,和同步装载的区别是,导入指令和其他脚本必须写在不同的script标签里(延迟装载就是说,$import的对象需要在下一个script标签中才能生效),这样,没有异步回调那么麻烦,也不必忍受eval带来的调试困难.
算是鱼与熊掌各取一半吧.


关于模块最小化,我们想法基本一致,我也期望编程模块细分,细分的时候充分考虑一下运行时脚本管理的开销就是.
我上面反对过渡细分,只是因为曾经碰到过变态的细分要求.条件反射,呵呵.
0 请登录后投票
   发表时间: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的类库,那么该类库在导入其他类库的时候,到底应该采用哪一种方式呢?难不成,每种方式都备一份?


0 请登录后投票
   发表时间:2008-02-14  
jindw 写道

是的,若要良好的调试支持,就不能eval了.
可以用延迟装载的方式,和同步装载的区别是,导入指令和其他脚本必须写在不同的script标签里(延迟装载就是说,$import的对象需要在下一个script标签中才能生效),这样,没有异步回调那么麻烦,也不必忍受eval带来的调试困难.
算是鱼与熊掌各取一半吧.


还有,延迟装载,就要求该脚本文件要把自己的变量包在一个闭包中避免泄漏到global上去。这个包裹过程在有eval的情况下可以自动加上,在异步load的情况下已然被封到了onload函数里。但是对于延迟装载就必须手动加了吧(当然可以配合服务器端程序变成自动的)。
0 请登录后投票
   发表时间: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里面比较关键的一点,他除了申明依赖之外,还构造了一个钩子函数.
能后外界就可以控制装载单元的内容了.如:注入装载后依赖.

0 请登录后投票
   发表时间:2008-02-14  
果然是要依赖服务器端啊。而且从你说的来看,好像无论是script标签延迟加载,还是异步加载,都是要配合服务器端的?
0 请登录后投票
   发表时间:2008-02-15  
其实也不叫依赖服务器端了.
是这样,发布的时候,我可以一次将全部脚本处理好,作为静态文件放置在服务段.
但是调试期间,为了方便,我就直接通过代理,即时处理这些脚本了.

另外,异步装载和同步装载需要的资源完全相同.
不需要对脚本做闭包处理.
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics