sa125
sa125

Reputation: 28971

Synchronously load a dependency in node.js

I'm loading a node library in script and immediately after loading some customization that depends on that library:

var somelib = require('somelib');

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

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

I keep getting an exception since the loading is done asynchronously and the second require happens before the first is namespaced correctly. What's a good way to resolve this? thanks.

EDIT: My original code

I'm trying to create a PNG image from json data using fabric.js node package (building on the article in package site). This is done by loading the server-side fabric canvas with JSON data that was originally generated on the client, then writing to a file stream:

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);
    });
  });
});

The "fabric.custom" file holds several custom fabric canvas objects that override some fabric prototype defaults. They work well on the client, and are needed to properly render the canvas. It looks something like this:

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

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

Thanks.

Upvotes: 0

Views: 4538

Answers (1)

bantic
bantic

Reputation: 4964

Rather than relying on side effects in a require to mutate your fabric object, how about having the fabric.custom.js file export the modified fabric, like so?

fabric.custom.js:

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

And in your main file:

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

Upvotes: 5

Related Questions