为什么在尝试"节点compile.js"时会出现javascript失败?为我的自定义dijit主题?

时间:2015-02-01 05:15:27

标签: dojo themes less npm

我刚学会了使用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'命令之前,我是否错过了应该以不同方式配置的内容?

非常感谢任何帮助。我一直在网上搜索任何类似的编译错误,但到目前为止还没有找到任何人解释相同类型的问题。如果有任何其他信息我可以给你,请告诉我。

提前致谢,

格里

1 个答案:

答案 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,解析器就会按预期工作得更少!。

希望这有助于某人。