Remember that you can always add more properties to your exported function
in option E.  I've seen many module that do this.

Sometimes I'll have a variant of my module and instead of passing in an
argument, I'll just tack a new function as a property on my exported
function.

```js
var resolveModule = require('resolve-module');  // resolve a module to a
path using sync I/O
var resolveModuleAsync = require('resolve-module').async; // Same thing,
but using async I/O.
```



On Thu, Jul 11, 2013 at 11:55 AM, Adam Crabtree <[email protected]>wrote:

> I also prefer E, but as a close second to A.
>
> I prefer A because in practice, your application modules evolve as your
> application grows in scope and understanding. So a "usermodel" may
> eventually also find it necessary to export utility functions like
> validation. In this case, ABCD are all more flexible, not requiring you to
> update all your requires everywhere.
>
> WRT ABCD, I consider A idiomatic JavaScript, but there are unresolved
> opinions like, do you capitalize factory functions or only constructors
> where instanceof works. Tim's point about instanceof failing across npm
> installs is accurate, but usually doesn't apply to application code (not
> installed via npm). I would at least rule out B though, as your functions
> should indicate in some way if they're intended to be used as a factory.
>
> Summary: A for constructors or factories, E for everything else.
>
> Cheers,
> Adam Crabtree
>
>
> On Thu, Jul 11, 2013 at 9:16 AM, Tim Caswell <[email protected]> wrote:
>
>> 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. <[email protected]> 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 [email protected]
>>> To unsubscribe from this group, send email to
>>> [email protected]
>>> 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 [email protected].
>>> 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 [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> 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 [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>
>
> --
> Better a little with righteousness
>        than much gain with injustice.
> Proverbs 16:8
>
> --
> --
> 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 [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected].
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to