关于css:解析异步下载的.less文件

Parse .less files downloaded asynchronously

我在 web 应用程序中使用较少。在开发环境中,我有类似

1
2
3
4
<head>
    <link rel="stylesheet/less" type="text/css" href="test.less"/>      
    <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/3.0.2/less.min.js">
</head>

这工作正常:我的 test.less 文件被下载并通过 less 自动转换为有效的 css。

现在,如果用户在网站的特定部分导航,我需要下载另一个 .less 文件。为此,我像这样动态创建一个元素:

1
<link rel="stylesheet/less" type="text/css" href="test2.less"/>

并将其附加到头部。

这不起作用 - 至少在 Chrome 66.0.3359.117 中 - 因为浏览器根本没有触发文件下载。

我通过修改链接'rel'属性解决了这个问题:

1
<link rel="stylesheet" type="text/css" href="test2.less"/>

这样,浏览器就可以正确下载文件test2.less;但是,它的内容不会被 less 自动解析,因此不会转换为有效的 .css

我认为下载 less.js 时,它会通过搜索所有具有属性 rel ="stylesheet/less" 的元素并解析它们来执行 - 停止。

但在那之后,它"停止"监听其他异步下载的 .less 文件。

有没有办法"触发"更少的解析?

谢谢


好的,到目前为止我已经找到了解决方案。

我敢打赌有更有效的解决方案,但现在我会这样做。

我追加元素

1
<link rel="stylesheet/less" type="text/css" href="test2.less"/>

在文件的头部,这不会触发文件下载。

之后,我调用函数

1
less.registerStylesheets().then(less.refresh);

这导致再次阅读文档的次数减少,请求所有文档并再次解析它们...效率不高,但它有效。

我想知道是否存在一种方法来告诉 less 只导入一个文件...

编辑:一个小改进:

而不是做

1
less.registerStylesheets().then(less.refresh);

我能做到

1
2
less.sheets.push(link);
less.refresh();

link 是对创建的链接的引用。这样less就不会再读一遍所有的文档,搜索链接了;相反,它只会为创建的新链接准备 XHR 并对其进行解析。