昨天在 Twitter 上的一些有趣的讨论中,我发现人们对于 Web应用和站点对 javascript 的依赖普遍存在一种疑惑。 这种疑惑一直都存在,而对我而言,这个问题随着浏览技术的飞跃发展而集中爆发了。
我第一次遇到这个问题还是在 DHTML 盛行的时代。 我们对浏览器无所不用其极,加上各种动画菜单、3D 标签(我们现在已经学会不再使用这些了),但总有人告诉我们 javascript 不可用。
第一个要问的问题是这些 javascript 不可用的环境在哪里。下面是一些可能的答案:
就像你所看到的那样, javascript 被禁用的原因多种多样, 有被动的, 也有主动的. 所以不能说只有乱用网络的人才会遭遇这样的问题.
像上面所列举的那样, javascript 被禁用的原因多种多样. 如果它是被有意禁用的, 那么我猜主要原因无非以下三点, 即安全考虑、广告疲劳以及慢速连接.
安全考虑在情理之中. 几乎每一个在客户端的攻击都是使用的 javascript(大多数情形下都是利用了插件的漏洞). Java 当然是当前最大的安全漏洞, 但是通过 javascript 同样会对存在漏洞的网站或者不经保护或者过时的浏览器以及操作系统造成安全威胁.
慢速连接是个很有意思的原因. 非常讽刺的是, 我们使用 javascript 是为了加速客户端体验. 最初使用 js 的一个例子就是在客户端对表单进行验证从而避免服务器端不必要的工作周期.
如果你现在正处于一个很差的连接中(比如一个无线连接或者很差的3G连接), 你想要使用 Google Reader 或者 Gmail, 你只能得到一个不完整的页面, 这时候只有使用低版本的才能更好工作.
基于环境以及连接给用户最好的体验是非常好的. 这也是渐进增强(progressive enhancement)所研究的问题. 这也并非是很高深的东西, 它很简单, 并且是处于完全的实用主义.
使用事件授权这样的技术是非常简单的. 你可以通过点击父元素的 handlers 来写你自己的 HTML, 使用 innerHTML 或者其他一些更新更快的技术.
坦白说, 我也不太清楚. 或许是因为我太过时了, 或许是因为我已经一次有一次对浏览器和网络连接失望了, 或许是因为我只想更安全一些. 我只是不明白为什么人们只想要 js 的解决方案呢, 而实际上, js 只是用来提供一些增强功能的.
人们时常怀有疑问的是"应用需要 javascript". 如果我们足够坦诚, 我们就会发现, 这样的应用实际上是很少的. 如果一定要说出一些, 我只能想到的是浏览器中的 photoshop 或者其他的一些编辑器(比如视频、浏览器中的 IDE)才需要依赖于 javascript. 其他都可以通过重新加载和服务器端的一些部件解决.
让我们直面这样一个事实——在 Node.js的时代, 服务器端也可以用 javascript 来写. Dav Glass of Yahoo 两年前显示如果一个工具库编写成余环境独立的, 那么你就可以同时在客户端和服务器端复用这些工具.
"应用需要 javascript" 的真正原因似乎是其他原因, 而非技术上的.
正如禁用 javascript 可以有很多原因, 应用需要 javascript 也有很多原因.
总之, javascript 依赖性的问题不只是技术原因. 它对旧的技术实践提出了疑问, 并且对于可维护性有很大影响.
可以说, 如果我们能问问 "我们为什么需要 js" 而不是问 "人们为什么没有 js", 关于这个问题的讨论会更有成效. 如果我们的技术能很好适应不同需求的话, 去责备人们跟不上网络发展是毫无意义的.
通过展现给用户看他们能通过开启或者关闭浏览器中部件来解决问题同样是没有意义的. 当一个普通用户卡在你的应用中了, 这并不是一个告诉用户发生了什么的做法.
或许所有这些问题在 node 变得成熟以及普及以后都不会再是问题. 我将很乐意看到这点。