398 - 《一个 Less 问题的排查过程》

发布于 2024年1月4日

一个问题的排查过程,绕了一圈,原来解法很简单。但一个收获是把 Less 的插件机制搞透了。

1、问题。

昨天用户遇到一个问题,使用 Mako 时遇到 Less 的使用问题。

目录结构如下。

+ bar
	- bar.less
	- zzz.css
- index.js
- index.less

代码如下。

// index.js
import './index.less';
// index.less
import './bar/bar.less';
// bar/bar.less
@import './zzz.css'

抛开 index.js,直接用 lessc 编译 less,执行 lessc index.less,得到结果如下。

@import './zzz.css';

less 编译后保留 css 的 import 是符合预期的,但是路径原样保留下来,回到 index.less 的编译结果时,他去找 ./zzz.css 就会从当前目录去找,而根目录不存在 zzz.css,然后就有问题了。

但是 webpack 是好的。

2、思路。

两个思路,1)排查为啥 webpack 是好的,Mako 的 less 插件是抄的 less-loader,理论上不应该存在差异,2)用我自己的思路去解,通过 less 的插件,加 visitor,找到 @import 语句的 ast 节点,用 enhanced-resolve 库去找下依赖,然后替换为绝对路径。

3、过程。

我先用自己的思路去解,跑通了,写了一个 less 插件如下,运行良好,用例也过了。(为了写 less 插件,还把 less 插件完整地重新过了一遍,花了 1 个多小时)

class CSSImportVisi

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。