Best way to require several modules in NodeJS
Problem
I don't much like the standard way to Require modules, which goes something like this:
connect = require 'connect'
express = require 'express'
redis = require 'redis'
sys = require 'sys'
coffee = require 'coffee-script'
fs = require 'fs'
It's not exactly DRY. In a modest CoffeeScript server, the require dance takes up a fair chunk of the entire script! I've been toying with the following alternative:
"connect,express,redis,sys,coffee-script,fs"
.split(',').forEach (lib) -> global[lib] = require lib
Since I haven't seen people try to refactor the standard approach, I thought I'd ask if it seems reasonable to do so, and if so, are there any better ways to do it?
Solution
Note that coffee-script
isn't a valid identifier, so your code isn't really importing it properly. You can use CoffeeScript's flexible object literals to handle this pretty nicely. I'd also use ?=
to avoid unnecessarily re-importing modules. Building off of user211399's answer:
global[id] ?= require name for id, name of { "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" } [Compile to JS]
Since I'm allowing you to import with different identifiers in different modules, using the global namespace feels particularly unsafe. I'd import them locally instead, as shown below. Be aware that because this uses eval
it might not fail gracefully if you specify an illegal identifier.
eval "#{id} = require(#{JSON.stringify name})" name for id, name of { "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" } [Compile to JS]
Discussion
View additional discussion.