javascript - 使用 less.js 获取更少的变量列表

标签 javascript css variables less

我正在使用客户端 less.js。有没有办法从我的 less 文件中获取所有变量。我知道如何修改变量:

less.modifyVars({
  "@var": "#fff"
});

但我想得到所有这些,比如(不工作):

var variables = less.getVars();

最佳答案

这将是一个非常规的答案,因为该数据似乎并未作为面向浏览器的 API 的一部分公开公开。


tl;dr

  • 保存 less.js 文件的本地副本。
  • 在某处添加这个函数定义

    function exposeVars(root) {
         var r=root._variables,n=Object.keys(r),m={}
         for(var k of n){m[k]=r[k].value}
             less.variables = m;
    }
    
  • 在 ~2556 行的 return result 之前添加以下调用 exposeVars(evaldRoot)

  • 现在 less.variables 包含您文件中的所有变量。

免责声明:这样做不是一个好主意!如果您只是玩玩、调试或测试一些东西,这很好,但不要依赖这个 hack 来做任何严肃的事情!


这里的基本目标是在源代码中找到将 .less 文件转换为抽象语法树(或其他形式结构)的点。

直接进入源代码,我发现了一个 ParseTree 类。猜测它将包含解析 less 文件的结果是一个合理的假设。

我编写了一个快速测试文件,并使用适当的标签将其添加到浏览器中。它看起来像这样:

@myvar: red;
@othervar: 12px;

body {
  padding: @othervar;
  background: @myvar;
}

我已经下载了 less.js 的本地副本并在第 2556 行添加了一个断点。

我在本地范围内四处寻找可用的内容,并在名为 evaldRoot 的对象中找到了变量。

evaldRoot = {
  _variables: {
    @myvar: {
      name: '@myvar',
      value: Color
    },
    @othervar: {
      name: '@othervar',
      value: Dimension
    }
  }
}

下一项工作是找出这些数据的去向。似乎 evaldRoot 变量用于生成生成的 CSS(这很有意义,因为它包含变量等信息)。

if (options.sourceMap) {
  sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
  result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
} else {
  result.css = evaldRoot.toCSS(toCSSOptions);
}

无论发生什么情况,变量在用于生成 CSS 字符串作为 result.css 后都会超出范围。

要公开这些变量,脚本需要稍作修改。您必须以某种方式公开公开变量。这是一个这样做的例子。

function exposeVars(root) {
  var varNames = Object.keys(root._variables);

  var variables = varNames.reduce(function(varMap, varName) {
    varMap[varName] = root._variables[varName].value;
  }, {});

  less.variables = variables;
}

这可以添加到带有断点的 return 语句之前。

exposeVars(evaldRoot);
return result;

现在变量将在全局 less 对象的 name: value 对象中可用。

enter image description here

您甚至可以修改 expose 函数以从对 less.getVars() 的调用中返回变量。就像您最初的建议一样。

function exposeVars(root) {
  // ...
  less.getVars = function() {
    return variables;
  };
}

关于javascript - 使用 less.js 获取更少的变量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34153690/

相关文章:

javascript - 创建新的 html 标签(元素)

php - 如何执行一个js函数使用另一个函数的元素带来ajax页面

variables - 使用 'def' 声明变量和使用已知类型声明变量有什么区别吗?

javascript - 从 Rails link_to 调用 jQuery 函数

javascript - 为什么在添加 CSS 后预览空白页?

html - 需要两列堆叠而不是重叠移动

在 onclick 属性内部使用时,JavaScript 函数不起作用

javascript - 选择所有子复选框,选中它们并保存它们的值

扩展名为 .css 的 Javascript 文件

javascript - 在 Ruby 中动态命名数组/哈希