某种意义上,此争论的根源之一是:HTML / CSS / JS 并不适合写 UI 。
HTML + CSS 本来是服务于排版的。HTML 只用来表达信息,而 CSS 赋予信息以样式,JS 则提供简单的交互和动态更新内容的能力。
- HTML 是可以脱离 CSS 存在的:打开一个博客页面,文章内容都在 HTML 里,即使 CSS 完全没加载出来,用户也可以阅读文章内容;
- HTML + CSS 又是可以脱离 JS 存在的:现在还有很多人认为网页就该脱离 JS 也能正常工作,比如这里的讨论:
https://news.ycombinator.com/item?id=33212448 。
早期的互联网上,网站以门户网站、博客、论坛等形式为主,这一套可以说非常成功。网站就是一篇文章,文章的内容、文章的样式、文章的交互,就该是解耦的,用三种语言很自然。
但前端开发者面对的问题今非昔比,如今我们要开发的,不再是门户网站、博客和论坛,而是各种富交互的“应用程序”。前端开发与桌面 / 移动端 UI 开发越来越像,这要求我们的工具也越来越像 UI 开发工具。这时的 HTML / CSS / JS ,就有点不太够用了。
UI 开发与网页开发有着根本的不同:数据 / 样式 / 交互的解耦不再有意义。在一个应用程序中,应用被分成一个个 UI component ,而一个 UI component ,就该是 self contained 的。习惯于三件套老前端们也许不会有这样的疑问,但为什么写一个 button 需要切换三种语言? button 的 label 写在 HTML 里,button 的颜色写在 CSS 里,button 绑定的事件则要写在 JS 里?
新的需求出现了,我们理应有新的工具。我们本可以开发一样新的技术替代 HTML / CSS / JS ,最终产物可能像是属于 Web 的 Swift UI 或者 Flutter 。但阴差阳错,最终的结果是 JS 一桶浆糊:我们有了 JSX 和 CSS-in-JS 。
回到开头,HTML / CSS / JS 并不适合写 UI ,但 Web 开发无法抛弃 HTML / CSS / JS ,最终我们不得不以某种形式在 JS 里写 HTML ,无论是 vue 还是 JSX 。
这种以 JS 强兼 HTML 的方式总是有某种代价( SEO 、性能等),我们又搞出了各种技术来擦屁股:比如 SSR 和各种 zero-runtime CSS-in-JS 。