On Thu, Jul 11, 2013 at 1:15 PM, Jake Verbaten <rayn...@gmail.com> wrote:

> E for everything!
>
> if your module needs to export multiple functions then use multiple E's
>
> ```js
> var foo = require("module/foo")
> foo()
>
> var bar = require("module/bar")
> bar()
> ```
>
>

This brings up another best practice.  You should *always* include the
extension when referring to a file (module), and only omit it when
referring to a package (looking up the file in package.json's main
property).

require('module/foo.js'); // load a module within a package
require('module');          // load a package's main module

same thing works for local requires (which usually are non packages)

require('./lib/foo.js');

though I sometimes put packages in my local tree

require('./lib/bar'); // loads lib/bar/package.json and resolves to
lib/bar/main.js






>
> On Thu, Jul 11, 2013 at 9:55 AM, Adam Crabtree <atcrabt...@gmail.com>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 <t...@creationix.com> 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. <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.
>>>
>>>
>>>
>>
>>
>>
>> --
>> 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 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.
>
>
>

-- 
-- 
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