Besides simplicity, there are several reasons to simply export a function
that accepts config options and returns an instance of the module.

 - Instanceof is dangerous and doesn't work cross-context or if you have
more than one copy of a module (something that's very common in the default
behavior or npm)
 - If your module does one thing and one thing only, why expose that one
thing as a property, just expose that one thing.
 - Don't oversimplify it to the point of `var foo = module` because then
you have this weird almost singleton (remember there can be multiple
instances of your module in somebody's dependency tree)
 - Pass in dependent interfaces in your setup function.

For example, in jsgit I have an fs interface.  To create an instance of it
for node, you would do:

    var fs = require('simple-fs')('/my/base/path');

Then later I have a git database module that creates a real git repo on the
filesystem.  Instead of hard-coding a dependency on node's fs module, I
pass in an instance of the git fs interface.  That way the same code can
work in the browser.

    var db = require('git-fs-db')(fs);

Many of my modules are helper functions and so I export the function
directly:

    var pushToPull = require('push-to-pull');

Then later when I have a codec implemented in push style, but I need to
consume it pull style, I can do simply.

    var parse = pushToPull(require('git-pack-parse'));

Keep it simple.  As simple as possible, but no simpler.



On Wed, Jul 10, 2013 at 5:39 PM, Andy W. <awillson...@gmail.com> wrote:

> I have seen a wide variety in different style for creating custom Node
> modules. What style do you prefer or are there any best practices? I'm
> fairly new to the Node community.
>
> var module = require('module');
>
> // A
> var foo = new module.Foo();
>
> // B
> var foo = module.foo();
>
> // C
> var foo = module.createFoo();
>
> // D
> var foo = Module.Foo.create();
>
>  --
> --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to nodejs@googlegroups.com
> To unsubscribe from this group, send email to
> nodejs+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>
> ---
> You received this message because you are subscribed to the Google Groups
> "nodejs" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to nodejs+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nodejs+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to