关于JSVM的三人对谈

庄表伟 说:

JSVM,我觉得有一个方向可以尝试去发展,就是浏览器中的对象管理,起到一个VM的作用

dlee 说:

问题就是你敢不敢去做小白鼠,或者叫做生活在剃刀边上。对于一个严肃的项目,我做项目经理,是不会采用jsvm的。

庄表伟 说:

那为什么你就会采用prototype呢?

dlee :

prototype背后有强大的支持,而不是像jsvm那样只有万春华同志等很少的几个铁杆。

庄表伟 说:

为什么?你是看着哪边人多去哪边的吗?

dlee :

你看那些叫喊"""支持"""的人会不会贡献一行代码。你太容易非黑即白了。当然不完全是这样,不过支持能力是一个非常重要的考虑因素。

庄表伟 说:

我的意思是,JSVM,该不该用他,只能由我们看过他的代码以后,来决定?

dlee :

你有能力维护所有的代码吗?

庄表伟 说:

我只是用他呀,又不是要改他

dlee :

我的意思是说,如果你在项目中使用了SpringRod Johnson玩累了,明天就宣布解散这个项目。你自己独立去维护Spring的代码。你去用什么啊,它只有很少的UI组件,其中还有问题。 你不要夸口这些自己都能开发好,我两年前开发了一个比较好用的Grid,花费了一周多的时间。你自己去实现这样一个组件后再说话。

庄表伟 说:

我不是用他的UI呀,而是用他的这个框架,来组织自己的代码。

dlee 说:

你不用它的UI,有什么必要使用这个框架呢?dojo/prototype一样可以做到啊,我是认为你这样做引入了不必要的成本。况且你如何判定使用的UI库在设计理念上与jsvm完全没有冲突?

庄表伟 说:

OK,你现在已经有结论了,但是我还没有仔细看过他的代码呢,所以我现在还没有结论,等我看过以后,自然会有一个结论的。

dlee :

Ajax库这方面,大部分人都跟我希望的一样,需要一个全面的解决方案。你说的jsvm专精于做某个领域,我认为是行不通的。任何运行于浏览器的js框架都应该是为UI服务的。没有实现过很多UI组件,如何检验它的这个架构设计的合理性?

庄表伟 说:

目前看来,prototype,也只是专精于基础领域的,在它之上,另有script.aculo.usRicoBehaviour这样的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。而是,我现在有几百Kjs文件,如何切分成合理的大小,然后在需要的时候去调用他们

醒来 说:

这个想法是对的,也是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 加载了接近80kjs就为了支持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的浏览器和服务器都是保持长连接

醒来 说:

jsvmcache 也有些问题,他所谓的application模式,在不同的浏览器上实现各不相同,iejs源码用iehtc 技术保存的,ff 是存cookiecookie 的容量是有限制的,所以cache 主要是针对 ie

dlee :

可能是在同一个http连接上发送多个http请求,这些请求需要排队

庄表伟 说:

OK,我提一个方案,你们看是不是可以作为"最佳实践"之一:

对于多个异步请求,可以让他分次异步提交。

对于多个同步请求,应该将多个请求打包以后一次提交。

这个作为"请求队列管理"的一部分

醒来 说:

道理应该是这样,jsvm里好像没有这样的控制,import语句也没有这么智能

庄表伟 说:

其实jsvm应该这么做,比如他load一个jsc文件进来,里面的import语句可能有一堆,就应该是一口气load其他的jsc,不该再分多次了

醒来 说:

我总觉得 线程/队列 这些该是浏览器的事情,用js开发很不保险

庄表伟 说:

你看过我写的那个RSSReader的代码吗?里面就有一个请求队列的

醒来 说:

jsvm做不到,因为loadjsc里又有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 :

我发现现在很多人有一个通病。就跟我在那个ajaxmodel2框架的讨论中说的那样。毫不思考地就将一种技术或者架构用于设计意图之外的场合。其实把IFrame用于异步请求也是这个情况

醒来 说:

jsvm 的建议就是抛弃jsc,完善它自己的面向对象架构,并提供工具类支持,这样才有可能和 dojo 有竞争。所以在国外是称为  tricks,  是有贬义的意思,但翻译成中文,变成窍门,反而有了褒义了

dlee :

Ajax in Action的作者称作hacky的做法,带有贬义

dlee :

Ajax显得与众不同的地方不是它所使用的技术本身,而是通过使用这些技术所带来的新的交互模式。我们所习惯的传统的Web交互模型并不适合于独占式的应用,只有打破了这种交互模型,新的可能性才会慢慢浮现出来。

这是Ajax in Action的一句话,说得非常有道理。我们看到如此众多的人都对Ajax感兴趣不是偶然的。现在我们处在web app发生革命性变化的前夕

庄表伟 说:

嗯,我更关注:慢慢浮现出来的这些可能性中,哪些是正道,哪些是邪道

醒来 说:

我是觉得一定要擦亮眼睛,多从用户的角度想问题

庄表伟 说:

这是对的

你可能感兴趣的:(设计模式,应用服务器,Ajax,UI,浏览器)