在NodeJS中需要多个模块的最佳方法

时间:2011-08-31 20:16:29

标签: javascript coding-style node.js dry coffeescript

我不太喜欢需要模块的标准方法,如下所示:

connect = require 'connect'
express = require 'express'
redis = require 'redis'
sys = require 'sys'
coffee = require 'coffee-script'
fs = require 'fs'

这不完全是DRY。在一个适度的CoffeeScript服务器中,require舞蹈占据了整个脚本的一大块!我已经toying使用以下替代方法:

"connect,express,redis,sys,coffee-script,fs"
  .split(',').forEach (lib) -> global[lib] = require lib

由于我没有看到人们尝试重构标准方法,我想我会问这样做是否合理,如果是这样,有没有更好的方法呢?

3 个答案:

答案 0 :(得分:5)

请注意,coffee-script不是有效的标识符,因此您的代码并未真正正确导入它。您可以使用CoffeeScript灵活的对象文字来处理这个问题。我还使用?=来避免不必要地重新导入模块。建立user211399's answer

global[id] ?= require name for id, name of {
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" }

                                                                    [Compile to JS]

由于我允许您使用不同模块中的不同标识符导入,因此使用全局命名空间会感觉特别不安全。我会在本地导入它们,如下所示。请注意,因为它使用eval,如果您指定了非法标识符,它可能不会正常失败。

eval "#{id} = require(#{JSON.stringify name})" name for id, name of {
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" }

                                                                    [Compile to JS]

答案 1 :(得分:4)

前段时间我玩弄了这个想法,结果就是这样:

global[mod.replace /\W/g, ''] = require mod for mod in [
    "connect"
    "express"
    "redis"
    "sys"
    "coffee-script"
]

结束抓它并按照通常的方式做 - 它最终成为一个更大的麻烦。有很多时候您需要获取模块的属性或使用不同的命名方案。此外,分配到全局范围与" normal"不同。 require。对齐分配使其更易于阅读:

connect  = require 'connect'
express  = require 'express'
mongoose = require 'mongoose'
coffee   = require 'coffee-script'
fs       = require 'fs'
{ exec } = require 'child_process'

你只做过一次,抽象它只是不必要的复杂性。

答案 2 :(得分:3)

global[lib] = require lib for lib in "connect,express,redis,sys,coffee-script,fs".split ','