很多Less新手都会遇到一个常见问题:URL路径里的特殊字符该如何处理?当路径中包含@、空格、反斜杠这类字符时,Less编译器会尝试解析它们,导致路径错乱。这个问题其实有明确的解决方案,但不少人第一反应是去找escape()函数,这个做法并不正确。 为什么不应使用escape()函数处理URL路径
很多Less新手都会遇到一个常见问题:URL路径里的特殊字符该如何处理?当路径中包含@、空格、反斜杠这类字符时,Less编译器会尝试解析它们,导致路径错乱。这个问题其实有明确的解决方案,但不少人第一反应是去找escape()函数,这个做法并不正确。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
escape()函数处理URL路径很多人一看到“特殊字符”就想到编码,于是翻看Less手册找到escape()。但escape()并非为URL路径场景设计,它只是早期Less留下的一个字符串编码函数,作用非常有限——比如只把空格转成%20,仅此而已。
关键在于,escape()的输出不遵循RFC 3986标准,遇到Unicode字符时无法正确处理。更严重的是,它在Less 4.0+中已被标记为废弃,编译时会产生warning,下个版本将会移除。因此这条路行不通,必须换用其他方法。
~""包裹才是正确做法真正的解决方案是~""。这个符号的作用是告诉Less编译器:“不要改动这段内容,原样透传出去。”
为什么需要这样做?因为Less编译器遇到url()里面的内容时,默认会尝试解析括号、变量和运算符。例如,你写url("assets/icon@2x.png"),其中的@会被当作变量起始符,从而解析报错。又如url("fonts/Inter\ 300.woff2"),空格和反斜杠也会触发语法错误。
使用~""包裹后,问题即可解决。来看几个典型写法:
background: url(~"assets/icon@2x.png"); → 输出background: url("assets/icon@2x.png");src: url(~"fonts/Inter\ 300.woff2"); → 输出src: url("fonts/Inter\ 300.woff2");(反斜杠保留,由浏览器解析)@font-path: "fonts/Inter-Italic.woff2"; font-family: url(~"@{font-path}");这里有一个容易犯的错误:不要写url(~"fonts/@{name}.woff2")!因为~""内部不支持插值,@{name}不会被替换,结果会输出字面量url("fonts/@{name}.woff2"),完全不是你想要的效果。
话说回来,在实际开发中,导致URL失效的往往不是特殊字符编码问题,而是路径写错了。Less本身不关心文件系统,它只管字符串输出。因此真正的问题是:你写的路径相对于最终CSS文件的位置是否正确?
@icon-url: "../images/icons.svg"; background: url(~"@{icon-url}"); —— 这个路径必须根据生成后的CSS文件位置来写,而不是Less源文件的位置。less-loader环境下,如果使用了public目录,路径可能需要改成/icons.svg并加~""包裹。resolve-url-loader可以自动重写相对路径,但需要配合less-loader的paths选项。最简单的检查方法:打开编译后的CSS文件,复制url()里的完整路径,粘贴到浏览器地址栏,看是否能直接访问到资源。能访问到,才是真正有效的路径。
最后提醒一句:~""只管Less编译阶段的解析冲突,不管运行时URL的合法性。如果路径中确实包含中文或#这类字符,仍然需要服务端或前端JavaScript做encodeURIComponent()处理——那是HTTP层的职责,Less无法处理。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述