2011-08-31 44 views
15

我不太喜歡,要求模塊的標準方法,這是這樣的:最好的辦法需要幾個模塊的NodeJS

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

它不完全乾燥。在一個適中的CoffeeScript服務器中,require舞需要佔用整個腳本的一小部分!我一直toying以下替換:

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

因爲我還沒有看到人們試圖重構標準的做法,我認爲我會問,如果它似乎是合理的話,如果是的話,有沒有更好的方法來做到這一點?

+3

智能問題。希望學習的東西很酷:D – Kheldar

+0

@mahemoff全球範圍:( – Raynos

+0

我不相信全球範圍的論點。畢竟,NPM意味着全球命名空間無論如何。 這當然是一個權衡考慮作爲對於執行基礎設施級需求聲明的業務/應用程序邏輯在面臨中斷時存在明顯的缺點 – mahemoff

回答

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 ] 
+0

它是有效的您只需將其稱爲'global [「coffee-script」]' – Raynos

+2

@Raynos:您可以使用它作爲參考,但這並不意味着它是一個標識符(ECMA-262 5e [第7.6節](http://ecma262-5.com/ELS5_Section_7.htm#Section_7.6),[第10.3.1節](http://ecma262-5.com/ELS5_Section_10.htm#Section_10.3.1),[二段(http://ecma262-5.com/ELS5_Section_11.htm#Section_11.1.2))。如果你正常導入它,這也不是你如何引用它的原因,這就是爲什麼我不認爲它是「真正地導入它」的原因。 –

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

我的想法前段時間把玩,並結束了與此:

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

端起來劃傷,只是做的常見方式 - 它最終被一個更大的麻煩。有很多時候你需要抓住一個模塊的屬性或使用不同的命名方案。此外,分配到全局範圍不同於「正常」require。對齊作業使得它更易於閱讀:

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

你只做了一次,抽象它只是不必要的複雜性。