百科问答小站 logo
百科问答小站 font logo



为什么一直没有出现一个可以把现代 CSS 编译为支持老版本浏览器 CSS 的编译工具? 第1页

  

user avatar   he-shi-jun 网友的相关建议: 
      

题主的思路不错,不过实践起来可不容易。


其实类似的实践早已有之,如 Dean Edwards 著名的 IE7 项目(2003年)。但该项目并非预编译,而是在运行时解析 CSS 并实现效果。

我受到 IE7 项目的启发,描述过另一种让IE6浏览器支持多class选择器的方法(

面向未来的CSS实践

,2006年),更靠近静态而非运行时,相对更接近题主预编译思路。

CSS 预处理器/后处理器及其库或扩展其实包含了类似的功能,比如将 flex 转换为几种不同草案语法。

今天 ShadowDOM 的 polyfill 方案,是最典型的符合题主预期的样式编译步骤。


但是这些工具要么是用途局限,要么是效果有限,很难完全达到题主期望的目标。原因如下:


1. CSS 与 JS 非常不同。ES6 的新特性许多是语法糖,或者说很容易有语义等价或近似等价的 ES5 形式。但是 CSS 的新特性中,除了极少数(如 hsl => rgb,草案的语法变迁,属性拆解等)有等价或近似等价转换,绝大多数是不可能映射到既有特性上的(如果可以的话,也就没有必要加新特性)。像 flex 写成 float ,只是在满足许多先决条件的情况下效果类似,但实际行为的差别是巨大的。

2. CSS 很复杂,每个特性可能有许多隐含的效果。比如用 float 之后,就产生了 BFC 从而会影响许多其他属性的行为。更不用说你征用了某个属性去达到其他效果之后,与其他需要该属性的需求可能产生冲突。

3. 即使只考虑效果类似,很可能需要牵涉 HTML 和 JS 辅助,单单编译样式表是不够的。这是为什么 IE7 等许多 patch 方案都是基于运行时而不是预编译,而我写的多class兼容方案也是同时需要样式表预编译和运行时的 htc 组件。

4. 有许多特性即使预编译和运行时都用上,也实现不出来,或者性能负担太高,比如 Shadow DOM 的一些样式支持,限制非常多,以至于在工程上不实用 —— 因为使用者需要理解太多实现细节,要考虑多种情况下降级后的效果——这样额外的负担已经消解了引入这样方案的目的(不需要太多考虑老浏览器)。


尽管如此,这样的思路仍然值得嘉许。大部分前端码农苦逼兮兮得搞兼容性好多年,只会骂IE,或者骂标准不实用,却从来没有想过工程上类似解决方案的可能性。题主在境界上已经超过了80%的前端。我本人是在看到IE7项目后才脱胎换骨的,题主如果是自己悟出来的,悟性胜过我当年许多!

所以,少年,努力吧!(欢迎投递简历 johnhax at gmail dot com)




  

相关话题

  如果工作一年经验的前端开发人员比工作两年的功能测试人员工资低,你还愿意待在那家公司吗? 
  前端程序员刚进入公司上来给我了一套五年前的管理系统代码让我吃透了改bug,根本看不懂想离职了怎么办? 
  有哪些效果拔群的 WebAssembly 应用? 
  为什么能够提供BFC的inline-block元素却不能嵌套block元素? 
  有哪些 Bootstrap 的学习案例? 
  如何看待react被围攻?技术中立存在吗? 
  vue等前端框架最直接的作用是什么?有大佬发表高见吗? 
  前端短时间内发送两个http请求,如何确保获取后发请求的响应? 
  C++底层是如何实现的? 
  如何看待react被围攻?技术中立存在吗? 

前一个讨论
关于C#异步编程Task的一个疑问?
下一个讨论
在测试驱动开发中 如果测试写错了导致单元测试过不了怎么办?如何保证测试的正确性呢?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利