这是未来的趋势所向,如是我行。

注意:原文发表于 2017-9-6,随着框架不断演进,部分内容可能已不适用。

CSS 日渐惹人憎恶。

究其原因颇多,归根结底,皆因 CSS 给人的感觉总是飘渺迷蒙、变幻莫测。

譬如微调某个样式后,却出乎意料地殃及一些看似毫无瓜葛的布局,尤其是准备部署之时。

这类经验如果你从未体会过的话,你要么是不明就里的新手,要么是登峰造极的高人。

故此 JavaScript 社区又开始撸起袖子着手炮制,只消数载,各色各样的 CSS 库宛如雨后春笋不断涌现,它们统称为 CSS-in-JS。

然而 CSS 最棘手的问题也许并不需要 CSS-in-JS 亦可解决,对此你可能还不知情。

倘若果真如此,那么编写 CSS 将是一种惬意的享受,而非痛苦的忍受,此外,CSS-in-JS 也会产生新的问题要去解决,未免有点旁生枝节。

本文并非要和 CSS-in-JS 针锋相对,也不否定社区所做的努力,它在 JS 生态中如此活跃,且每周都有新的想法出现。

其实我目的是想介绍一种让人更加愉快的替代方案 —— 它就是带有真正 CSS 的单文件组件!

CSS 最大的问题

CSS 中的一切都是全局的,正因如此,为某个标记上编写的样式,可能会使另一个标记受到牵连。

也正因如此,开发者经常借助于各种命名空间的约定(而非“规则”,因为难以实施),但此法只会徒增 RSI 的风险。

如果你置身于团队之中,情况愈加恶劣。他人所写的样式无人敢改,通常无法猜测它们是做什么用的,应用在哪些标记了,以及如果删掉会带来什么灾难。

其结果是:样式表必须只增不减

你无法得知哪些代码可以安全地删除。因此常见的做法是用一些更具体的样式来覆盖现有样式,哪怕是在相对较小的项目上亦是如此。

单文件组件扭转乾坤

SFC 背后的思想十分简单:在一份 HTML 文件中编写组件,该文件可以包含描述组件样式的 <style> 和描述行为的 <script> 标记。

Svelte、Ractive、Vue 以及 Polymer 都是遵循这种模式。

(显然我们在文章其余内容都将使用 Svelte,但是如果使用模板会让你胆战心惊的话,其实你的担心是多余的,不过这又是另一个话题了,那你可以使用 Vue,它允许你在 SFC 中编写 JSX)

如果你从未接触过 Svelte,不妨先参看这篇文章:无招胜有招:为何我们没有及早悟到这个办法?,或者看看用户评价

应用这种模式,结果会发生几件美妙的事情:

  • 组件的样式都是局部样式(scoped),不会向外泄露,没有不可预知的级联情况,彻底摆脱为了防止名称冲突而硬取的超级啰嗦的类名。
  • 你无需再去文件夹中苦苦追查那些破坏你样式的规则。
  • 编译器(例如 Svelte)能够识别和删除无效的样式,从此不再是“只增不减”了!

下面我们来试试探明究竟。

< 因不支持插入视频,点击此处观看视频 >

这就是所谓的 “use the platform”?

所有代码编辑器都能识别这些 CSS,其内置了自动完成、监测、语法高亮等等功能,无需额外的 JS 各种庞杂的工具。

同时,这些都是真正的 CSS,并非那些使用了驼峰命名及双引号无处不在的鱼目混珠的东西。

我们可以在 devTools 中对样式进行修葺调整,再复制粘贴回代码中,如此行云流水的工作方式,我再也无法离开这种酸爽。

不得不说,CSS source maps 功能已是开箱即用的,因此你能快速定位问题所在的行。

其重要性不言而喻:

当你使用所见即所得(WYSIWYG)的模式之时,你不会从组件树的角度去思考问题的,因此亟需一个万全之策使有问题的样式原形毕露。

如果组件本就出自他人之手,情况尤其堪忧。(我敢保证,这种 CSS 工作方式能极大提升你的生产力,离开 source maps,毋庸置疑你是在虚耗光阴,因为我曾经就是如此。)

Svelte 转译你的 CSS 选择器来实现让样式只应用在局部范围内,它同时也适用于受影响的元素的属性,尽管确切的机制无关紧要,并且可能会有所变化。

未使用的规则会被移除并发出警告,然后你可以将精简后的结果写到 .css 文件中。

还有一个实验性的新功能,就是可以编译组件为 Web Components,然后将样式封装到 shadow DOM 中(如果这刚好就是你所期望的话)。

一切皆有可能,因为你的 CSS 在标记的上下文中被解析(使用 css-tree)和静态分析。

静态分析为未来各种令人振奋的可能性打开大门:更智能的优化手段,各种提示……

但是如果你的样式需要在运行时才去动态计算的话,则做这些事情要困难得多。

我们也才刚刚开始。

但我们也可以借助工具来做啊 [X]!

如果你看了视频后的反应是:“很好,但是 —— 我们使用 TypeScript,且为各种编辑器编写插件,也能获得自动完成和语法高亮的功能啊。”

换而言之,为了获得与 CSS 等价的效果,而去折腾构建、文档、推进及维护等等一堆辅助性的项目,如果你认为这些事情意义重大……

那么,多说无益,你和我是道不同,不相为谋了!

我们仍然没有全部答案

综上所述。

诚然,CSS-in-JS 确实对一些悬而未决的问题给出了答案:

  • 如何从 npm 安装样式?
  • 我们如何重用一些定义在同一个地方的常量?
  • 如何组合声明?

就个人而言,我认为所得的好处,没有超出上述这些问题的范围。

你的选择可能有不同的优先次序,使你放弃 CSS 有足够的理由。

但总的来说,你还是必须了解 CSS 的,不论热爱还是憎恶,最终都在所难免要学习它。

作为 Web 的守望者,我们可以做选择:

创建高深莫测的抽象,让 Web 开发者的学习曲线更加陡峭,或者一起解决 CSS 糟粕部分。

怎么选择,我已心中有数。

<The End>

CSS 书写禅机的更多相关文章

  1. CSS书写顺序

    CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, margin, padding)3. ...

  2. CSS书写规范、命名规范、网易CSS框架NEC

    网易CSS框架NEC:http://nec.netease.com/ NEC框架的CSS规范:  CSS规范 - 分类方法 CSS规范 - 命名规则 CSS规范 - 代码格式 CSS规范 - 优化方案 ...

  3. html和css书写规范

    HTML 规范 分离的标记.样式和脚本 结构.表现.行为分离 在可能情况下验证你的标记 使用编辑器验证你的标记是否正确,一般编辑器都自带有这个功能. 技术不支持的时候使用备胎,如canvas 编码格式 ...

  4. CSS书写规范

    一.CSS书写顺序 1.位置属性(position,top,right,z-index,display,float等) 2.大小(width,height,padding,margin) 3.文字系列 ...

  5. css书写规范及特殊样式

    1.CSS书写顺序: (1)位置:position.top.right.z-index.display.float (2)大小:width.height.padding.margin (3)文字系列: ...

  6. 推荐大家使用的CSS书写规范、顺序

    写了这么久的CSS,但大部分前端er都没有按照良好的CSS书写规范来写CSS代码,这样会影响代码的阅读体验,这里总结一个CSS书写规范.CSS书写顺序供大家参考,这些是参考了国外一些文章以及我的个人经 ...

  7. 分享给大家的CSS书写规范、顺序

    写了这么久的CSS,但大部分前端er都没有按照良好的CSS书写规范来写CSS代码,这样会影响代码的阅读体验,这里总结一个CSS书写规范.CSS书写顺序供大家参考,这些是参考了国外一些文章以及我的个人经 ...

  8. CSS书写规范及顺序

    CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, padding, margin)3. ...

  9. CSS书写建议参考

    总结一些CSS书写建议提供大给家参考,这些是参考了一些文章以及我的个人经验总结出来. 1.能缩写的就尽量缩写吧,毕竟谁都不想多些一些也可以提高阅读体验.包括类名.颜色和css属性.

随机推荐

  1. k8s 调度 GPU

    最近公司有项目想在 k8s 集群中运行 GPU 任务,于是研究了一下.下面是部署的步骤. 1. 首先得有一个可以运行的 k8s 集群. 集群部署参考 kubeadm安装k8s 2. 准备 GPU 节点 ...

  2. unix环境高级编程第四章笔记

    文件和目录 start fstart lstart函数 一旦给出pathname, start函数就返回了与此命名文件有关的信息结构 #include <sys/start> int st ...

  3. 牛客网暑期ACM多校训练营(第二场)carpet

    传送门:carpet 题意 有一个n*m的地毯,aij表示地毯每格的元素,bij表示地毯每格的价格,要求选取一块价格最大值最小的地毯,并且这块地毯无限铺开之后,原地毯是其子矩阵. 题解 先找到这个矩阵 ...

  4. 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}

    P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...

  5. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  6. 【uva 11054】Wine trading in Gergovia(算法效率--等价转换)

    题意:N个等距村庄,买(>0)卖(<0)酒,供需平衡,运K则需K劳动力.问所需的最小劳动力. 解法:由于运出或运入1的都需经过2,所以无论如何,都可以等价于从2本身运入或运出.因此可以将1 ...

  7. hdu3461 Code Lock

    Problem Description A lock you use has a code system to be opened instead of a key. The lock contain ...

  8. AcWing 243. 一个简单的整数问题2 (树状数组,区间更新/询问)

    题意:区间更新,区间询问. 题解;对于区间更新,我们还是用差分数组\(b_i\)来更新,区间询问时,我们的答案是:\(\sum_{i=l}^{r}\sum_{j=1}^{i}b_j\), 所以,我们搞 ...

  9. Lightoj 1038 - Race to 1 Again【期望+dp】

    题目:戳这里 题意:一个数字n不断迭代地除以自身的因子得到1.求这个过程中操作除法次数的期望. 解题思路: 求概率基本都是从一个最基础的状态开始延伸推出公式,得出答案.因为每个数都有个共同的最终状态1 ...

  10. ysoserial Commons Collections3反序列化研究

    0x00 前言 在ysoserial中,官方是没给gadget,这儿经过文章分析我认为的gadget,继承自AbstractTranslate的类被Javassist插桩后返回一个被修改过的templ ...