V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
theprimone
V2EX  ›  前端开发

尝试解决原子化 CSS 框架导致的类名单行过长的问题

  •  
  •   theprimone ·
    yunsii · 243 天前 · 1130 次点击
    这是一个创建于 243 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原子化 CSS 框架虽然好用,但是一直以来都有个麻烦的问题,写得太长了怎么办?越来越长这事儿是难以避免的,那应该怎么解决呢?

    VS Code 可以设置单行强制换行,但如果使用了某个不能强制换行的方式查看代码就很尴尬了,另外也不能指望因为这种事儿让关联的所有人都设置这个属性吧,所以这种方式不是很 OK 。

    既然不能从输出的代码解决问题,那就得换个思路了,在输入代码的时候就解决这个问题。Tagged templates 是个好东西,可以基于此来构造类名的模板字符串,说干就干,于是有了 tagged-classnames-free,想叫 tagged-classnames,但是已经被使用了,看起来作者的思路跟我很像,不过我是不太懂为啥他不保证输出结果的顺序,可能是为了性能?

    我是基于 clsxtailwind-merge 分别实现了两个工具函数 clstw,支持了一下单行注释就搞定了。

    另外还有个模板字符串格式化的问题,重构代码的时候难免会让模板字符串的缩进变化,默认模板字符串是不会自动改变缩进长度的,这使得开发体验不甚理想,搜索一番发现了一个 eslint 的 template-indent 规则,用上问题不就搞定了 😎(虽然之前基于 eslint 还是写了一个格式化插件,但是效果不甚理想,还是现成的舒服)。

    最后还有另一个值得考虑的问题,如果模板字符串里只有字符串,一点表达式都没有,那完全可以去掉啊,我只是想用模板字符串的格式化功能而已,特别是对于只做 React 开发的我,老是被重复计算完全没意义。于是又搞了一个 unplugin 插件 unplugin-polish-tagged-templates,可以在编译代码的时候去掉纯字符串的 tagged templates 。

    至此,应该算是彻底解决了类名过长的问题,从开发编译两个环节通过三个工具库解决了问题。完整演示可以访问这个页面 https://tagged-classnames-free.vercel.app/examples 查看效果,查看按钮的对应的 CSS 字符串源码已经被转换成纯字符串了。

    3 条回复    2023-09-08 16:05:23 +08:00
    lyc575757
        1
    lyc575757  
       243 天前 via Android
    可以尝试一下 unocss 的 attributify
    https://unocss.dev/presets/attributify
    theprimone
        2
    theprimone  
    OP
       243 天前
    @lyc575757 之前 windicss 的时候体验过,体验并不太好,配置 TS 和 throwIfNamespace 的问题我依稀记得很头疼 😂
    george2077
        3
    george2077  
       232 天前
    工具函数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2913 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:31 · PVG 22:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.