2

I have a very simple module that I am bundling with Browserify. I want to use that bundle both in the browser as well as in node. In node, it works just fine if I require the non-bundled module; however, if I require the browserified bundle, require returns an empty object. Here's a reproduction:

Simple module

function Foo(bar) {
    this.bar = bar;
}

module.exports = Foo;

Test script

var Foo = require("./foo"); // not bundled with Browserify
var Foob = require("./foob"); // bundled with Browserify

console.log("Foo =", Foo);
console.log("Foob =", Foob);

Executed thusly

browserify foo.js -o foob.js
node foo-test.js 

Output

Foo = function Foo(bar) {
    this.bar = bar;
}
Foob = {}

You can see that Foo (the non-bundled version) is the expected function but Foob (the bundled version) is a sad and empty object.

So the question is why isn't the browserified module working in node?

Clarification: I'm using browserify to bundle my webapp and I use its paths options to simplify paths in my app's require statements and avoid relative path hell. However, I'm trying to use tap to do unit testing, but it doesn't seem to have a similar configuration feature. Because of this, trying to require non-bundled files when using tap causes everything to break.

9
  • 1
    You don't require a Browserify-ied bundle file Commented Nov 25, 2014 at 10:54
  • foob.js is bundled with browserify. Commented Nov 25, 2014 at 11:00
  • Yes, I can see that, but you're not supposed to use require with an already bundled module. Commented Nov 25, 2014 at 11:05
  • Is it impossible then to use bundles built with browserify in node? Commented Nov 25, 2014 at 11:18
  • 1
    That's not the intended use of Browserify. Browserify was built to emulate Node's require but for browser environments. So to use Browserify within Node would be completely ass-backwards. Commented Nov 25, 2014 at 11:29

2 Answers 2

9

I found a way around this. The solution is to use browserify's --standalone option when bundling. This will add the necessary module.exports statement in the bundled output.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for this. This is what solved it for me when creating an NPM client-side library.
0

You want to nest browserify bundles. In this case, ensure that your nested bundles actually have module.exports defined.

For instance in the main file of your foob.js bundle, be sure to return a function you can use externally (using module.exports)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.