我刚学会了使用Node.js工具和“less”来生成自定义Dojo Dijit主题的能力。我下载了Node,并且全局安装不像:
npm install -g less
然后更新variables.less和其他一些widget .less文件,然后运行编译命令:
node compile.js
来自我的“claro”Dijit主题目录的副本。我是从Windows7平台运行的。我正在从CMD窗口运行它,但之前也在我的CYGWIN窗口中尝试过它。由于找不到“less”模块的compile.js路径,它立即失败了:
less = require('../../../util/less/lib/less');
所以我搜索了新下载的节点和npm文件夹,发现当我更改require调用时使用此路径:
less = require('C:/Users/okorng/AppData/Roaming/npm/node_modules/less');
它进一步发展了。它在该位置找到了“less”模块,但是在解析第一个文件的调用期间compile.js失败了:
new(less.Parser)({
paths: [path.dirname(fname)],
optimization: options.optimization,
filename: fname
}).parse(data, function(err, tree){
在输入一些调试console.log()语句,然后还要弄清楚如何使用Chrome浏览器进行node-debug以通过Chrome开发人员工具调试脚本时,我发现了对Parser的调用。 parse()函数失败,“imports”变量出现“undefined”错误:
parse: function (str, callback, additionalData) {
var root, error = null, globalVars, modifyVars, preText = "";
globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + '\n' : '';
modifyVars = (additionalData && additionalData.modifyVars) ? '\n' + Parser.serializeVars(additionalData.modifyVars) : '';
if (globalVars || (additionalData && additionalData.banner)) {
preText = ((additionalData && additionalData.banner) ? additionalData.banner : "") + globalVars;
imports.contentsIgnoredChars[fileInfo.filename] = preText.length;
}
str = str.replace(/\r\n/g, '\n');
// Remove potential UTF Byte Order Mark
str = preText + str.replace(/^\uFEFF/, '') + modifyVars;
---> imports.contents[fileInfo.filename] = str;
向控制台报告的错误是:
C:\Users\okorng\AppData\Roaming\npm\node_modules\less\lib\less\parser\parser.js:112
imports.contents[fileInfo.filename] = str;
^
TypeError: Cannot read property 'contents' of undefined
at Object.Parser.parse (C:\Users\okorng\AppData\Roaming\npm\node_modules\less\lib\less\parser\parser.js:112:20)
at C:\COMPASS\URS\trunk\dev\src\IBM\RAD\webapps\CompassThemesURS\WebContent\themes\html\commonurs\dojo\1.9.1\dijit\themes\jelam\compile.js:43:6
at fs.js:272:14
at Object.oncomplete (fs.js:108:15)
我发现“imports”变量是less parser.js文件中Parser构造函数中的参数之一:
var Parser = function Parser(context, imports, fileInfo) {
当我转储这些构造函数参数的值时,“imports”和“fileInfo”都是未定义的。
这个Parser构造函数是从Dijit claro主题附带的compile.js文件中调用的。这个compile.js文件是错误的吗?在运行'node compile.js'命令之前,我是否错过了应该以不同方式配置的内容?
非常感谢任何帮助。我一直在网上搜索任何类似的编译错误,但到目前为止还没有找到任何人解释相同类型的问题。如果有任何其他信息我可以给你,请告诉我。
提前致谢,
格里
答案 0 :(得分:1)
发现了问题!
经过更多搜索后,我终于在以下网站找到了其他一些相同类型错误的报告:
https://github.com/phiamo/MopaBootstrapBundle/issues/975
https://github.com/gruntjs/grunt-contrib-less/issues/224
这表明他们使用的是一个太少新的“少”模块;他们不得不降级到版本1.7.5。我找到了该版本,并从以下网址下载:
https://www.versioneye.com/nodejs/less/1.7.5
然后在网站的帮助下安装它:
https://docs.npmjs.com/cli/install
安装完成后,我重新运行命令:
node compile.js
它刚刚奏效!!!
所以 - 问题是默认情况下安装的较少版本(2.3.1)对于claro主题附带的compile.js来说太新了。一旦我将较少的版本降级到版本1.7.5,解析器就会按预期工作得更少!。
希望这有助于某人。