小言_互联网的博客

能否让JS作为打开网页的入口?

272人阅读  评论(0)

最近逛GitHub论坛的时候发现一个很有意思的话题:

Make JavaScript Files a Valid Entry Point to a Web Page

意思是,让JavaScript文件作为一个合法的网页入口(而不是html文件)。话题地址在这:

https://github.com/w3c/webcomponents/issues/807

这个话题勾起了我的兴趣,因为我一直觉得以html文件作为网页的唯一入口很麻烦,前后端分离之后写纯静态html的人越来越少了,前端框架兴起之后几乎所有的网页和应用都由JavaScript来操作。我们打开用Vue开发的https://element.eleme.cn/官网,检查一下源代码会得到这样一个普遍现象:

整个网页几乎只有一行代码有意义:

    <div id="app"></div>

剩下的全是JS。这种现象逐渐让我们开始质疑html标记语言是否还有存在的必要。

标记语言存在的意义

技术的发展是从自下而上的,新技术出现的顺序往往和潜意识相反(在后人看来)。我们都知道JavaScript是用于在前端计算的主要工具,html则是对JavaScript的一种弥补,用来更直观的表示UI元素的位置关系,这才是js和html正真的主从关系。同理,在Qt中,qml标记语言也是对C++的一种弥补。

然而事实是,前端先有html,再出现了JavaScript。qml倒是后于C++而诞生,主要因为C++本身并不是做UI的。

JS和html诞生顺序的颠倒导致了浏览器的历史遗留问题:网页只能从html来渲染,js必须嵌入到html中。这只能说,html确实没啥用了,但是标记语言(或者说描述语言)还是拥有不可动摇的地位。

注意,这里所说的原生html语言并不包括其他和html长得很像的标记语言,比如前端脚手架中使用的mvvm标记语言,模板引擎等。这些标记语言中的一些特殊语法比如双花括号 {{ }},php标签 <?php ?>,很有GraphQL风格的qml以及JS的模板字符串 `${ }` 这些都是为了解决特定问题而对通用的JavaScript语言进行的一种扩充。当然,即使没有这些标记语言,通用编程语言也能达到目的,但有了标记语言,效率提升了一个层次。

即时渲染

回到最初的问题,html标记语言目前有一种被孤立的趋势,但并不代表html就要被淘汰,html至少还支持即时渲染。即时渲染是标记语言的一大优势,因为标记语言可以拆分成流来传输:虽然html中有闭合标签的语法约束,但是浏览器仍然能够一边接受html流,一边渲染UI,当html文件很大的时候,这种网络的延迟削减是JavaScript不可替代的。上期介绍的ndJSON标记语言也是同样可以一边解析一边传输,一个道理。这就是为什么国内访问Gmail的时候经常选择加载基本html:

如果网速很慢,点击“加载基本HTML”就可以提前享受流式渲染。

以JS作为网页入口可行吗?

以上仍然不能解释为啥网页的入口一定得是html,现在的问题是,未来有没有可能支持从JS直接打开网页,这个问题就是在w3c/webcomponents这个GitHub仓库下“嚣张”质疑w3c标准的issue作者Lonniebiz,从对问题的描述中可以看出他还是个完美主义的杠精,他一再强调以text/html为网页入口是web标准库的致命缺陷却给不出合适的论据,单纯从美学的角度要求w3c委员会对标准库进行修正,于是收获了网友的一致吐槽:

同时,看戏的小伙伴包括我给他的解决方案基本都是使用<script>标签将JavaScript代码包裹起来再以text/html为mime类型传给浏览器作为入口,就像下面这样:

<!DOCTYPE html><meta charset="utf-8"><script>	

	
addEventListener('DOMContentLoaded', function () {	
  document.title = 'Hello index.js';	
  document.head.appendChild(	
    document.createElement('style')	
  ).textContent = `	
    html {	
      font-family: sans-serif;	
      font-size: 16px;	
      text-align: center;	
    } `;	
  document.body.appendChild(	
    document.createTextNode('Hello body')	
  );	
}, {once: true})	

	
</script>

这种方式已经很常见了,大伙都在用也没啥意见,可是版主Lonniebiz就是认之为一种hack手段并嗤之以鼻。在翻看了几十条长篇评论之后终于忍无可忍的我给了他一个“最终”解,希望能结束这场无意义的辩论赛:


我也讨厌html丑陋的语法,但浏览器的职责是浏览不同mime类型的媒体资源,不仅仅是网页(text/html)!浏览器还可以展示图片,音视频,pdf,纯文本,等等等。所以对于text/JavaScript资源来说,浏览器会展示js只读模式的纯文本内容(虽然没啥实际用途),但不会,不能够也不应该去执行这个js文件。这里有三“不”,我来解释下:

  • “不会”:这是事实,浏览器不会直接解析text/JavaScript

  • “不能够”:text/JavaScript这种媒体资源不会触发虚拟机和标准库的加载

  • “不应该”:确实有人希望在浏览器中浏览js文件内容,而不需要执行

从逻辑上,网页也属于一种媒体,它和其他媒体类型是平等对待的,网页的mime类型就是text/html,没有其他。所以只有text/html才会让浏览器加载为网页服务的v8虚拟机以及DOM标准库。

也许在将来的某一天清晨,网页拥有了第二个mime叫webpage/javascript或者webpage/wasm!等到那一天,直接从JS或者WebAssembly渲染页面的美好夙愿也就实现了。

(完)


转载:https://blog.csdn.net/github_38885296/article/details/101444571
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场