【问题标题】:Why is there a javascript failure while trying to "node compile.js" for my custom dijit theme?为什么在为我的自定义 dijit 主题尝试“node compile.js”时出现 javascript 失败?
【发布时间】:2015-02-01 05:15:26
【问题描述】:

我刚刚了解到使用带有“less”的 Node.js 工具来生成自定义 Dojo Dijit 主题的能力。我下载了 Node,并且全局安装了不太像:

npm install -g less

然后更新 variables.less 和其他几个小部件 .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”变量出现“未定义”错误:

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”命令之前我应该​​配置不同的东西?

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

提前致谢,

格雷戈

【问题讨论】:

    标签: dojo themes less npm


    【解决方案1】:

    找到问题了!

    经过更多搜索,我终于在以下位置找到了其他几个相同类型错误的报告:

      https://github.com/phiamo/MopaBootstrapBundle/issues/975 
      https://github.com/gruntjs/grunt-contrib-less/issues/224
    

    这表明他们正在使用一个太新的“less”模块;他们不得不降级到 1.7.5 版。我找到了那个版本并从以下位置下载了它:

      https://www.versioneye.com/nodejs/less/1.7.5 
    

    然后在网站的帮助下安装它:

      https://docs.npmjs.com/cli/install 
    

    安装后我重新运行命令:

      node compile.js
    

    而且效果很好!!!

    所以 - 问题是默认安装的 less 版本 (2.3.1) 对于 claro 主题附带的 compile.js 来说太新了。一旦我将 less 降级到 1.7.5 版本,less 解析器就会按预期工作!

    希望这对某人有所帮助。

    【讨论】:

    • FWIW,compile.js 中的 ../../../util/less/lib/less 已经引用了特定版本的 less,该版本随 Dojo 的 util 软件包一起提供,该软件包包含在完整的 Dojo 工具包中。如果您有完整的工具包,compile.js 应该可以工作。
    • 谢谢。后来我意识到“util”包没有包含在我最初下载的发布存档包中。 “util”包只存在于我没有下载的源存档包中。我会记住这一点,以便以后下载。
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多