0

我在脚本中加载了一个节点库,并且在加载了一些依赖于该库的自定义之后立即加载:

var somelib = require('somelib');

// some customizations made to
// somelib's methods
require('./somelib.custom');

somelib.SomeObject = ...
^
ReferenceError: somelib is not defined

我不断收到异常,因为加载是异步完成的,而第二次require发生在第一次被正确命名之前。有什么好办法解决这个问题?谢谢。

编辑:我的原始代码

我正在尝试使用fabric.js节点包(基于包站点中的文章)从 json 数据创建 PNG 图像。这是通过使用最初在客户端生成的 JSON 数据加载服务器端结构画布,然后写入文件流来完成的:

var path     = require('path');
var fs       = require('fs');
var fabric   = require('fabric').fabric;
require('./fabric.custom');

var canvas   = fabric.createCanvasForNode(400, 400);
var outfile  = fs.createWriteStream("image.png");
var filepath = "/path/to/file.json";

fs.readFile(filepath, 'utf8', function(err, json) {
  canvas.loadFromJSON(json, function() {
    var stream = canvas.createPNGStream();
    stream.on('data', function(chunk) {
      outfile.write(chunk);
    });
  });
});

“fabric.custom”文件包含几个自定义织物画布对象,这些对象覆盖了一些织物原型默认值。它们在客户端上运行良好,并且是正确渲染画布所必需的。它看起来像这样:

fabric.TextBox = fabric.util.createClass(fabric.Text, {

  type: 'text-box',
  // more object specific stuff ...
});

谢谢。

4

1 回答 1

5

与其依靠 a 中的副作用require来改变您的fabric对象,不如让fabric.custom.js文件导出修改后的fabric,像这样?

面料.custom.js:

var fabric = require('fabric').fabric;
fabric.myCustomMethod = function(){ ... }
...
module.exports = fabric; // the modified fabric

在你的主文件中:

var path     = require('path');
var fs       = require('fs');
// var fabric   = require('fabric').fabric; No need for this line anymore
var modifiedFabric = require('./fabric.custom');

...
modifiedFabric.myCustomMethod( ... ); // should now be available
于 2014-04-14T13:54:23.803 回答