2013-07-18 16 views
8

में निर्यात के लिए कई आंतरिक मॉड्यूल लपेटें मैं नोड के भीतर टाइपस्क्रिप्ट का उपयोग कर रहा हूं, और वर्तमान में ///<reference.../> सिंटैक्स के माध्यम से पूरी तरह से आंतरिक मॉड्यूल का उपयोग कर टाइपस्क्रिप्ट का उपयोग करने के लिए उपयोग किया जाता है। हालांकि बड़ी परियोजनाओं के साथ यह अनावश्यक हो सकता है क्योंकि आपके पास अन्य मॉड्यूल का संदर्भ देने वाले मॉड्यूल हो सकते हैं, जिनमें सभी के पास अंतःक्रियात्मक संदर्भ हैं।टाइपस्क्रिप्ट

इस नोड परियोजना मैं समूह की कोशिश कर सभी तार्किक घटकों बहुत पहले की तरह आंतरिक मॉड्यूल/वर्ग के रूप में के बारे में सोच रहा था के लिए

तो, तो वे आंतरिक रूप से एक दूसरे के संदर्भ सब होगा, लेकिन एक बाहरी मॉड्यूल जो बेनकाब करेंगे के माध्यम से उन्हें बेनकाब

import database = require("my-external-db-module.ts"); 
var connection = new database.Connection(someUrl); 

बजाय

: अंतर्निहित कक्षाएं आदि

इस तरह वाक्य रचना मौजूदा आवश्यकता होती है तंत्र की तरह, नोड्स के बहुत समान होगा

और मैं सोच भी वाक्य रचना होगा कुछ की तरह:

///<reference path="all-my-internal-module-files-etc.ts" /> 
///<reference path="..." /> 
export module SomeExposingModule 
{ 
    // Not quite sure what to put in here to expose the internal modules 
} 

तो वहाँ बात की इस तरह चारों ओर सर्वोत्तम प्रथाओं या किसी अन्य जो कुछ इसी तरह किया है, या हर किसी के बस का उपयोग कर से चिपके है किसी भी प्रकार का कर रहे हैं जटिल सामान के लिए आंतरिक मॉड्यूल?

उत्तर

6

मुझे यकीन नहीं है कि यह बुरा अभ्यास है या नहीं, लेकिन यहां मैंने अपनी समस्या का समाधान कैसे किया है।

पहले फिर से समस्या का त्वरित सारांश:

मैं एकाधिक फ़ाइलों सभी तार्किक ऐसे Framework.Database या Framework.UnitOfWork के रूप में एक नाम स्थान के अंतर्गत वर्गीकृत सभी फाइलों उदाहरण Framework तो के लिए, के तहत वहाँ Framework.* हो जाएगा, है। फिर ये सभी tsc --out framework.js ... के माध्यम से संकलित किए गए हैं, इसलिए मुझे यह सब framework.js फ़ाइल में आउटपुट किया गया है।

अब उपरोक्त ठीक लगता है, हालांकि यह आपको आउटआउट का उपयोग करते समय मॉड्यूल निर्यात करने की अनुमति नहीं देता है क्योंकि यह कई फाइलों को फैलाता है, इसलिए काम करने के लिए नोड के लिए मुझे मॉड्यूल को किसी भी तरह निर्यात करने की आवश्यकता होती है, इसलिए मैंने मूल रूप से एक अतिरिक्त टाइपस्क्रिप्ट संलग्न की फ़ाइल जो मैन्युअल रूप से संकलन में मेरे लिए यह करता है:

// exporter.ts 
module.exports = Framework; 

तो उपलब्ध कराने के इस अंतिम फ़ाइल tsc संकलन को जोड़ा गया आप की तरह कुछ के साथ खत्म हो जाएगा है:

// Framework.js 
var Framework; 
(function (Framework) { 
    // lots of good stuff 
})(Framework || (Framework = {})); 
module.exports = Framework; 

तो यह निर्यात करेगा आंतरिक मॉड्यूल एफ ine और निर्यात घोषणा अब निर्यातक.एस फाइल की वजह से शामिल की जाएगी जो अब शामिल है।

इसलिए मुझे यकीन नहीं है कि यह बुरा अभ्यास है, लेकिन इससे मुझे दोनों दुनिया के सर्वश्रेष्ठ, एक पुनः उपयोग करने योग्य मॉड्यूल जो नामस्थानों के साथ रखा गया है और एक समझदार फ़ाइल संरचना में फैला हुआ है, और एक संकलित एकल मॉड्यूल जिसे संदर्भ या नोडज द्वारा आवश्यक रूप से शामिल किया जा सकता है।

तो उपयोग देखो की तरह होगा:

var Framework = require("./framework"); 
var database = new Framework.Database.DbConnection(); 
+0

मेरे मामले में, यूनिक्स बिल्ड स्क्रिप्ट के साथ, मुझे निम्न आदेश के साथ एक ही परिणाम प्राप्त करना आसान लगता है: echo 'module.exports = Framework;' >> Framework.js –

1

आप क्या कर सकते हैं यह है कि टीएस फ़ाइलों के एक सेट को .js + d.ts संयोजन में संकलित करें। जैसे निम्नलिखित out.js और out.d.ts

tsc a.ts b.ts --out mod.js --declaration 

और फिर बनाता है (उम्मीद) निम्नलिखित काम करेगा:

///<reference path="mod.d.ts"> 
var mod = require('mod') 
+1

एएच दिलचस्प बात आप को बढ़ाने पर मैं अपने वर्तमान पाइपलाइन से एक * .d.ts उत्पन्न करते हैं। इसलिए यदि मैं उन्हें सभी को आंतरिक मॉड्यूल के रूप में संकलित करना चाहता था तो उन्हें उन डी.एस.एस. के माध्यम से आवश्यकता होती है जो मुझे इंटेलिजेंस देते हैं और समय सुरक्षा को संकलित करते हैं, लेकिन मैं '/// 'वाक्यविन्यास का उपयोग करने से दूर होने की उम्मीद कर रहा था। इस विचार के साथ एक नाटक होगा हालांकि यह बेहतर लगता है अगर मुझे अपने आंतरिक मॉड्यूल के लिए एक रैपर लिखने के बजाय डी.एस.एस. फ़ाइल को एक निर्यातित मॉड्यूल के रूप में आवश्यकता हो सकती है। – Grofit

2

कुछ विचार है कि इन मुद्दों में से कुछ चिकनी करने में मदद कर रहे हैं।

यदि आपके पास बहुत सारे संदर्भ हैं, तो आप उन्हें प्रबंधित करने के लिए संदर्भ फ़ाइल का उपयोग कर सकते हैं। उदाहरण के लिए:

references.ts

///<reference path="a.ts" /> 
///<reference path="b.ts" /> 
///<reference path="c.ts" /> 
///<reference path="d.ts" /> 

अन्य सभी फाइलें ...

///<reference path="references.ts" /> 

अब आप अपने संदर्भ की एक केंद्रीय सूची, जिस पर संदर्भ की सूची बुनाई की तुलना में बहुत आसान है प्रत्येक फ़ाइल के शीर्ष।

आपके विशिष्ट मामले में, मैं import कथन का उपयोग करने के इच्छुक हूं और मेरे लिए मॉड्यूल लोड करने के लिए नोडजेएस प्राप्त करूंगा - और मैं फ़ाइल सिस्टम का उपयोग करके मॉड्यूल समूहित करूंगा।

+0

मेरी समस्या संदर्भों के प्रबंधन के बारे में बहुत कुछ नहीं है, जैसा कि मेरे वर्तमान प्रोजेक्ट में मैं करता हूं जैसा कि आप कहते हैं और यह * ठीक * काम करता है, इसलिए मेरे पास प्रोजेक्ट में छिड़काई गई फाइलों का एक भार है और मैं एक प्रकार का निर्माण करने के लिए एक बिल्ड स्क्रिप्ट का उपयोग करता हूं परियोजना स्तर संदर्भ लुकअप फाइलें। इस दृष्टिकोण के साथ मुझे जो समस्या मिलती है, वह यह है कि यदि मेरे पास डेटाबेस प्रोजेक्ट और एक तर्क प्रोजेक्ट है जो उपरोक्त दृष्टिकोण का उपयोग कर डेटाबेस पर निर्भर करता है, तो मेरी logic.js संकलित फ़ाइल में डेटाबेस ts फ़ाइलों और तर्क ts फ़ाइलों दोनों की सामग्री होती है , जबकि मैं इस अतिरिक्त संकलन से बचने के लिए बाहरी मॉड्यूल का उपयोग करने की उम्मीद कर रहा हूं * guff * – Grofit

+0

टिप्पणी पोस्ट करने के लिए खेद है लेकिन जारी रखने के लिए, इसलिए आंतरिक '/// ' के इस स्नोबॉल प्रभाव से बचने के लिए मैं इस नई परियोजना में उम्मीद कर रहा था बाहरी मॉड्यूल को अपनाने के लिए logic.js में केवल तर्क फाइलों से संकलित जेएस शामिल होंगे, और केवल अन्य मॉड्यूल का संदर्भ लेंगे, एक सरल प्रकार की रनटाइम निर्भरता बनाने के लिए एक संकलन समय नहीं होगा। मैंने उपरोक्त दृष्टिकोण की समस्याओं का उल्लेख किया है जो मैंने उठाए गए अच्छे लोगों के साथ उठाए गए अच्छे लोगों के साथ उठाया है। https://typescript.codeplex.com/workitem/923 मैं बाहरी मॉड्यूल – Grofit

+0

के साथ वर्णित समस्या को दूर करने की उम्मीद कर रहा था हां, आपके मामले में मैं पूरी तरह से मांग पर बाहरी मॉड्यूल लोड करने के लिए प्रतिबद्ध हूं क्योंकि यह अंतर्निहित नोडजेएस सुविधाओं पर निर्भर करता है। – Fenton