动态加载 less.js 规则

IT技术 javascript css less
2021-03-03 08:02:40

我正在考虑使用lessjs(看起来不错),但我们的网站要求在初始页面加载后动态加载某些样式。然而,似乎所有 LESS 样式表都必须在加载 less.js 脚本之前加载。即这有效

<link rel="stylesheet/less" href="/static/less/style.less"/>
<script src="http://lesscss.googlecode.com/files/less-1.0.30.min.js"></script>

但是如果换行,它就会失败,除非它们的顺序正确,否则 firefox 和 chrome 似乎都不会尝试加载“style.less”。本教程中明确指出了订购要求

有没有办法在初始页面加载后加载更少的样式表?

请注意,此博客描述了“观看”功能 -

每当您保存 LESS 代码时,它将自动刷新 CSS

所以期望我可以在页面加载后添加一些 LESS 规则似乎是合理的。感觉好像我错过了什么。

干杯,

科林

更新:用于测试注释中描述的行为的代码(脚本后列出的样式表较少)-

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Simple</title>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  <script src="/static/js/less-1.0.31.min.js"></script> 
  <link rel="stylesheet/less" href="/static/less/style.less" id="abc123"/>
</head>
<body>
  <div id="container">
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
  </div>
  <div id="#abc">Bingo</div>
</body>

<script>
console.log("refreshing styles...");
less.sheets.push(document.getElementById('abc123'));
//var lessStyle = $("<style>#abc { color: blue; }</style>").attr("id", "less:static-less-style").attr("type", 'text/less');
//$("head").append(lessStyle);
less.refresh(true);
console.log("refreshed...");
</script>
</html>

和较少的样式表

@primary_color: green;

.rounded(@radius: 5px) {  
  -moz-border-radius: @radius;  
  -webkit-border-radius: @radius;  
  border-radius: @radius;  
}

#container {
  background: @primary_color;
  .rounded(5px);

  div {
    color: red;
  }
}
4个回答

我刚刚推送了 1.0.31——它有一个方法:less.refreshStyles()它会重新编译<style>标签type="text/less"——试试看,让我知道它是否有效。

嗨 - 感谢您的回复。我应该提到通过将 <link rel="stylesheet/less" href="/static/less/style.less"/> 动态附加到文档头部来加载 css - 所以它不包含在 <style> 中标签。我想我可以将较少的文档作为原始文本加载并将原始样式标签写入文档头部 - 您认为可以使用 <link/> 标签吗?谢谢
2021-04-29 08:02:40
我对这两种方法进行了快速测试 - 首先是动态添加的 <style/> 标签 - 我遇到的问题是我似乎无法附加带有 type='text/less' 的样式标签(使用jquery) - 它总是在 Firefox 和 chrome 中恢复为 'text/css'。我可以看到一个加载了 <link/> 的文档的样式标签,它有 id='less:static-less-style',但它也有一个“text/css”类型,所以它看起来与 jQuery 无关. 对于使用 less.refresh() 的第二种方法 - 我无法让它适用于 <link/> 到 less.js 脚本导入后出现的头部较少文档。
2021-04-30 08:02:40
@cloudhead,你能告诉我如何在 React 中导入更少的实例吗?我的意思是,在调用 less.refreshStyles() 之前,您需要一个 less 实例。实例来自哪里?
2021-05-06 08:02:40
出于兴趣,是否可以在不刷新所有内容的情况下处理单个工作表 - 例如 less.sheets.push(mySheet); less.loadStyleSheet(mySheet); ? 对于我的用例,现有工作表永远不会依赖于新加载的工作表......
2021-05-09 08:02:40
抱歉 - 我误读了你的最后一条评论 - less.sheets.push() 效果很好 - 我已经编辑了原始问题中的代码以显示它可以正常工作 - 谢谢。
2021-05-13 08:02:40

感谢您提出这个问题——它对我帮助很大。我只是更新主题以展示我是如何动态添加 CSS 文件的。

我使用了 LESS (1.3.3) 的最新版本。

var stylesheetFile = 'file.css';
var link  = document.createElement('link');
link.rel  = "stylesheet";
link.type = "text/less";
link.href = stylesheetFile;
less.sheets.push(link);

less.refresh();
我可以知道较少的实例来自哪里吗?我正在使用反应。我的意思是..你必须少从某个地方进口,对吗?
2021-05-09 08:02:40

您可以使用这个轻量级 (3k) 库来延迟加载 less / css 和 js 文件(免责声明:我是作者)。

这很简单:

lazy.load('/static/less/style.less');

它还可以接收回调,加载更多具有依赖项的资产并处理缓存。

我发现该脚本的最新版本与 LESS 文件完美配合:

  <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/3.0.0/less.min.js"></script>

而是使用

less.refreshStyles()

利用

less.refresh()