关于JSVM的三人对谈 Ajax浏览器设计模式应用服务器UI
庄表伟 说:
JSVM,我觉得有一个方向可以尝试去发展,就是浏览器中的对象管理,起到一个VM的作用
dlee 说:
问题就是你敢不敢去做小白鼠,或者叫做生活在剃刀边上。对于一个严肃的项目,我做项目经理,是不会采用jsvm的。
庄表伟 说:
那为什么你就会采用prototype呢?
dlee 说:
prototype背后有强大的支持,而不是像jsvm那样只有万春华同志等很少的几个铁杆。
庄表伟 说:
为什么?你是看着哪边人多去哪边的吗?
dlee 说:
你看那些叫喊"顶"、"支持"、"牛"的人会不会贡献一行代码。你太容易非黑即白了。当然不完全是这样,不过支持能力是一个非常重要的考虑因素。
庄表伟 说:
我的意思是,JSVM,该不该用他,只能由我们看过他的代码以后,来决定?
dlee 说:
你有能力维护所有的代码吗?
庄表伟 说:
我只是用他呀,又不是要改他
dlee 说:
我的意思是说,如果你在项目中使用了Spring,Rod Johnson玩累了,明天就宣布解散这个项目。你自己独立去维护Spring的代码。你去用什么啊,它只有很少的UI组件,其中还有问题。 你不要夸口这些自己都能开发好,我两年前开发了一个比较好用的Grid,花费了一周多的时间。你自己去实现这样一个组件后再说话。
庄表伟 说:
我不是用他的UI呀,而是用他的这个框架,来组织自己的代码。
dlee 说:
你不用它的UI,有什么必要使用这个框架呢?dojo/prototype一样可以做到啊,我是认为你这样做引入了不必要的成本。况且你如何判定使用的UI库在设计理念上与jsvm完全没有冲突?
庄表伟 说:
OK,你现在已经有结论了,但是我还没有仔细看过他的代码呢,所以我现在还没有结论,等我看过以后,自然会有一个结论的。
dlee 说:
在Ajax库这方面,大部分人都跟我希望的一样,需要一个全面的解决方案。你说的jsvm专精于做某个领域,我认为是行不通的。任何运行于浏览器的js框架都应该是为UI服务的。没有实现过很多UI组件,如何检验它的这个架构设计的合理性?
庄表伟 说:
目前看来,prototype,也只是专精于基础领域的,在它之上,另有script.aculo.us、Rico、Behaviour这样的lib
dlee 说:
你喜欢摆擂台,那么就摆个擂台,大家都实现Grid组件,看看谁做得好。
庄表伟 说:
呵呵,这倒是个好办法
dlee 说:
你可以跟醒来来详细讨论,问题不是你想想得那么简单。做小白鼠也有好处,晓钢就经常偷偷练习一些自己的独门绝技。
庄表伟 说:
呵呵
dlee 说:
你可以将我跟他的冲突理解为主要在一个领域,就是我不认为解决他所说的两个问题,需要这么重的方案。而且他的解决方案从JS开发者的角度看来也不是很优雅。
庄表伟 说:
嗯,这两点,我基本上是同意的
dlee 说:
万春华同志的兴趣不在UI组件方面,这使得他偏离了浏览器JS诞生的使命。今天我跟醒来说过类似的意思。 我们的分歧不完全在技术本身上面。因为我们思考问题的思路差别很大,所以没有出现很大的交集
庄表伟 说:
嗯,我比较理解你的意思了,但是,我不是很同意...
dlee 说:
你看过他们的代码了吗?
庄表伟 说:
看了一些
dlee 说:
代码的模块程度如何?有没有可能将醒来说的一些部分完全去掉?
庄表伟 说:
哪些部分?
dlee 说:
我觉得他们如果做一些更加清晰的划分,划分出一个最小的core部分,而且像Spring那样划分成很多不同的jar,这样会更好一些。最糟的情况是要么全有要么全无
醒来 已经添加到此对话中。
dlee 说:
你既然对jsvm非常感兴趣,就和醒来先详细谈谈。我作为旁听好了。
庄表伟 说:
呵呵,好的呀
醒来 说:
好啊,我 最近刚看了jsvm的源码
庄,你觉得jsvm怎么样
庄表伟 说:
我刚开始看他的代码。说实话,我觉得他的js代码写得非常好,也很干净、清楚。因此,这样的一个人,写出这样水平的代码的人,对于js的理解,肯定是相当深入的。
醒来 说:
代码写的是真不错
庄表伟 说:
我以前曾经想当然的认为,他不了解js,只喜欢java,所以才会把js,扭曲成java的样子这样的想法,肯定是偏见。那么,在承认对方有足够的智力与经验的前提下,再来看他的代码,我觉得更不该"断然否定",说他"一无是处"。
醒来 说:
我在javaeye 上提出了我的意见,我也认为他的代码写得很不错,但是侧重点有点不合时宜。现在真是有些像java虚拟机了,基本是一个classloader + class cache 的实现
庄表伟 说:
还有这个:
a) 独立模式:standalone, 该模式下,当前页面的jsvm独立加载,不和系统中其他页面的JSVM发生关联。
b) 应用程序模式:application, 应用程序模式下的页面会除了加载jsvm以外,还将构造一个Application的环境。其他模块模式的页面会共享Application的资源。
c) 模块模式:module, 模块模式的页面必须运行在一个Application模式的页面下。该页面可以通过application框架共享资源以及访问全局变量。
d) 自动模式:auto, 页面根据环境自动选择是独立模式还是模块模式。
我觉得很有点意思
醒来 说:
从名字上来讲,jsvm倒是符合本意。但是java的成功不是只靠一个jvm的,我觉得 jdk 更关键
庄表伟 说:
现在的js库,除了jsvm,都是以一个Page为单位运行的,鲜有"Application"的概念。而VM的提出,我认为,为将来合理的Browser Object Cache Layer,提供了可能
醒来 说:
我有点怀疑,这样带来的复杂性有没有必要
庄表伟 说:
而且我还希望将来JSVM,能够更好的支持请求任务队列的管理,这样的机制,JS的语法本身提供得并不够好。还有多线程的管理,JS也没有像Java那样的,语法级的支持。
dlee 说:
我不大相信浏览器中的JS将来会被用在这样的目的
醒来 说:
其实我觉得,这些应该是浏览器提供的功能,在浏览器未发展到这个程度之前,强迫javascript畸形的实现,不一定值得
庄表伟 说:
嗯,这是问题的关键...我前面的畅想,的确是我希望将来的JS,能够支持的一部分
dlee 说:
是的,我们希望将来的JS引擎来提供这些基础设施
庄表伟 说:
现在JSVM,也许能够支持一部分,也许还不能够,所以,说不定哪天JS 2.0出来,JSVM就没有意义了
醒来 说:
所以对于jsvm的模式,应用程序模式还可以理解,模块模式很难让人明白有什么用
庄表伟 说:
这是一个思考模式的问题
假设你对于js本身不熟悉,要让你合理、自然的划分多个js文件,合理、自然的在该load的时候才去load,这就相当的费力
醒来 说:
所以我的意见就是,jsvm 希望吸引人来开发,应该要给出jsdk 差不多,一个jsvm 吸引不了人
庄表伟 说:
当然,更加正确的道路,当然是按照js的本性来做,提出某种"js loading design pattener"。但是,在经验还没有被总结成模式之前,模仿java式的代码组织,不失为一种方案
醒来 说:
load js 的模式其实现在都是 用一个同步的xmlhttprequest 去加载js,然后eval。这个 dojo 和 prototype 都有提供基础支持
庄表伟 说:
不是如何loading。而是,我现在有几百K的js文件,如何切分成合理的大小,然后在需要的时候去调用他们
醒来 说:
这个想法是对的,也是jsvm值得肯定的地方
我的主要意见是说它提供的 jsc 的形式有点鸡肋,同时缺乏简单高效的工具类,所以吸引不了开发人员。jsvm2 的代码里有 1/3 就是为了支持这个自创的jsc语法
庄表伟 说:
这是...败笔...。jsc我也不喜欢,混杂了部分js语法和部分java语法...还不如仅仅规定一个必须的头部,其他的完全采用js语法呢。还有一点我觉得是这个万兄在那里畅想,就是JSVM打算支持多种语法的设想,工作量太大了。
dlee 说:
不过万春来同志说这个可以不用
醒来 说:
所以我建议索性抛弃jsc,以万兄的javascript功力,写一部分有用的工具类,我觉得不会有人真的愿意用 var map = new HashMap(), map.put(k, v); 这样的方式写js
庄表伟 说:
对的
dlee 说:
所以我刚才说:
我觉得他们如果做一些更加清晰的划分,划分出一个最小的core部分,而且像Spring那样划分成很多不同的jar,这样会更好一些。最糟的情况是要么全有要么全无。
醒来 说:
jsc 是可以不用,但jsvm 加载了接近80k的js就为了支持jsc, 没有意义啊
庄表伟 说:
他现在是有多个js的,只是他core的部分太大了
醒来 说:
庄,如果你去看runtime.js 就知道了,jsvm2其实把jsc都预先编译了,否则效率一定太低
现在甚至还有一些观点,不要把js分得太多,因为要激发太多的http连接,反而响应性更不好。毕竟js的加载是同步的 ,这各ajax的异步核心思想有冲突。
dlee 说:
这个考虑也是很有道理的
庄表伟 说:
激发太多的http连接?还是激发太多的同步http连接?
dlee 说:
那个所谓的classloader就是向服务器请求一个包含js类的文件,然后evaluate。而且也要考虑evaluate的执行效率
醒来 说:
每一个import 就是一个http 连接。当然,jsvm 考虑到了cache
dlee 说:
对的,就是发出一个xmlhttp请求
庄表伟 说:
其实,他完全可以将自己的jsdk,做成一个jsc文件,一口气load进来
dlee 说:
不是多个连接,这个要看服务器怎么配置。其实支持http1.1的浏览器和服务器都是保持长连接
醒来 说:
jsvm的cache 也有些问题,他所谓的application模式,在不同的浏览器上实现各不相同,ie是js源码用ie的htc 技术保存的,ff 是存cookie。cookie 的容量是有限制的,所以cache 主要是针对 ie。
dlee 说:
可能是在同一个http连接上发送多个http请求,这些请求需要排队
庄表伟 说:
OK,我提一个方案,你们看是不是可以作为"最佳实践"之一:
对于多个异步请求,可以让他分次异步提交。
对于多个同步请求,应该将多个请求打包以后一次提交。
这个作为"请求队列管理"的一部分
醒来 说:
道理应该是这样,jsvm里好像没有这样的控制,import语句也没有这么智能
庄表伟 说:
其实jsvm应该这么做,比如他load一个jsc文件进来,里面的import语句可能有一堆,就应该是一口气load其他的jsc,不该再分多次了
醒来 说:
我总觉得 线程/队列 这些该是浏览器的事情,用js开发很不保险
庄表伟 说:
你看过我写的那个RSSReader的代码吗?里面就有一个请求队列的
醒来 说:
jsvm做不到,因为load的jsc里又有import 语句,这是递归的
庄表伟 说:
不是递归,是分层的
醒来 说:
要么js语言升级,要么浏览器升级,我总觉得现阶段就想让ajax完全达到替代桌面应用的程度是不可能的
庄表伟 说:
这个当然是不可能的...
醒来 说:
所以在现阶段,还是不要搞复杂了,多线程和队列能用到的地方毕竟不多
我觉得dlee强调的对的,现在需要的是组件
语言级别的东西,就让js语言和浏览器标准去慢慢支持吧
庄表伟 说:
我理解你们所认为的"轻重缓急"了。根本的观点在于:"急于将浏览器中应用,推向完全的桌面应用,并不现实"。立足于"更好的浏览器端应用",而非"尽可能像桌面应用的浏览器端应用",这么说来,当务之急自然是UI控件的完善与丰富
dlee 说:
我觉得浏览器中js诞生的使命就是改善交互和UI
醒来 说:
对,就是这个意思
dlee 说:
而且我从项目开发负责人的角度,更希望一个全面的解决方案。不是什么都需要我去做集成
庄表伟 说:
JSVM的问题,不在于他语法上像Java,而在于他的目标上像Java!
dlee 说:
也可以这样来理解
醒来 说:
ajax 里的cache 应该是去cache 数据,用来cache js代码,意义多大呢,所以jsvm太技术化了
dlee 说:
在Ajax in Action中,提出了一种独占式应用。就是像Word一样,可能每天都要用上几个小时。目前的Ajax技术,包括一些基础框架,还很难达到这个要求。所以确实需要这样一类基础架构,但是我们认为这些支持最好由浏览器和JS引擎来提供。
庄表伟 说:
看来我们已经初步达成共识了
醒来 说:
js 就是用来操作DOM的,不要让它承担太多重任,xmlhttp本来也不是 js的一部分,浏览器的扩展而以
dlee 说:
我发现现在很多人有一个通病。就跟我在那个ajax和model2框架的讨论中说的那样。毫不思考地就将一种技术或者架构用于设计意图之外的场合。其实把IFrame用于异步请求也是这个情况
醒来 说:
对jsvm 的建议就是抛弃jsc,完善它自己的面向对象架构,并提供工具类支持,这样才有可能和 dojo 有竞争。所以在国外是称为 tricks, 是有贬义的意思,但翻译成中文,变成窍门,反而有了褒义了
dlee 说:
Ajax in Action的作者称作hacky的做法,带有贬义
dlee 说:
令Ajax显得与众不同的地方不是它所使用的技术本身,而是通过使用这些技术所带来的新的交互模式。我们所习惯的传统的Web交互模型并不适合于独占式的应用,只有打破了这种交互模型,新的可能性才会慢慢浮现出来。
这是Ajax in Action的一句话,说得非常有道理。我们看到如此众多的人都对Ajax感兴趣不是偶然的。现在我们处在web app发生革命性变化的前夕
庄表伟 说:
嗯,我更关注:慢慢浮现出来的这些可能性中,哪些是正道,哪些是邪道
醒来 说:
我是觉得一定要擦亮眼睛,多从用户的角度想问题
庄表伟 说:
这是对的