2011-08-31 19 views
15

में कई मॉड्यूल की आवश्यकता के लिए मैं बहुत मानक तरीका मॉड्यूल की आवश्यकता होती है, जो कुछ इस तरह चला जाता है पसंद नहीं:सबसे अच्छा तरीका है NodeJS

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

यह बिल्कुल सूखी नहीं है। एक मामूली कॉफीस्क्रिप्ट सर्वर में, नृत्य की आवश्यकता पूरी लिपि का एक उचित हिस्सा लेती है! मैं निम्नलिखित विकल्प के साथ toying किया गया है:

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

के बाद से मैंने नहीं देखा है लोगों को मानक दृष्टिकोण refactor करने के लिए प्रयास करते हैं, मैंने सोचा था कि यदि ऐसा करना उचित लगता है मैं पूछता हूँ चाहते हैं, और यदि हां, तो कर रहे हैं ऐसा करने के लिए कोई बेहतर तरीका है?

+3

इंटेलिजेंट सवाल। कुछ शांत सीखने की आशा में अनुकूल: डी – Kheldar

+0

@mahemoff वैश्विक दायरा :( – Raynos

+0

मुझे वैश्विक दायरे के तर्क के बारे में आश्वस्त नहीं है। आखिरकार, एनपीएम का मतलब वैश्विक नामस्थान का तात्पर्य है। यह निश्चित रूप से एक व्यापार-बंद है बुनियादी ढांचे-स्तर की आवश्यकता बयान करने के लिए व्यवसाय/एप्लिकेशन तर्क के आपके सामने के बाधा के लिए स्पष्ट डाउनसाइड्स हैं। – mahemoff

उत्तर

5

ध्यान दें कि coffee-script एक वैध पहचानकर्ता है, तो आपके कोड वास्तव में यह ठीक से आयात नहीं है नहीं है। आप इस सुंदरता को अच्छी तरह से संभालने के लिए कॉफीस्क्रिप्ट के लचीले ऑब्जेक्ट अक्षरों का उपयोग कर सकते हैं। अनावश्यक रूप से पुन: आयात करने वाले मॉड्यूल से बचने के लिए मैं ?= का भी उपयोग करूंगा। 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

यह मान्य है पहचानकर्ता। आपको इसे 'ग्लोबल ["कॉफी-स्क्रिप्ट"] ' – Raynos

+2

@ रेयोनोस के रूप में संदर्भित करने की आवश्यकता है: आप इसे इसके संदर्भ के रूप में उपयोग कर सकते हैं, लेकिन ऐसा नहीं है कि इसका पहचानकर्ता (ईसीएमए -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), [ सेकंड टियन 11.1.2] (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' 

आप केवल एक बार कर रहे हैं, सार संक्षेप यह सिर्फ अनावश्यक जटिलता है।

संबंधित मुद्दे