On Thu, Jul 11, 2013 at 1:15 PM, Jake Verbaten <[email protected]> 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 <[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.
>
>
>
--
--
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.