2014-10-29 10 views
9

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

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

ऐसा करने का सबसे अच्छा तरीका क्या है? मैं बाहरी टीएस मॉड्यूल का उपयोग कर रहा हूं, लेकिन ये टीएस वर्ग प्रति अलग कॉमनजेएस मॉड्यूल का उत्पादन करते हैं।

उत्तर

14

जहां तक ​​मुझे पता है कि टाइपस्क्रिप्ट बाहरी मॉड्यूल के संयोजन का समर्थन नहीं करता है। codeplex पर उनके विकि से:

TypeScript has a one-to-one correspondence between external module source files and their emitted JS files. One effect of this is that it's not possible to use the --out compiler switch to concatenate multiple external module source files into a single JavaScript file.

हालांकि, अगर आप एक चाल आंतरिक मॉड्यूल टाइपप्रति में का उपयोग करके, के बाद से tsc संकलक उन्हें एक एकल फाइल में संकलित करने के लिए की क्षमता है क्या कर सकते हैं, और फिर आप बस जोड़ सकते हैं module.exports के साथ एक और फ़ाइल को पूरे नामस्थान के लिए एक सामान्यजेएस मॉड्यूल बनाने के लिए निर्देश।

यहां चरण-दर-चरण उदाहरण है।

Validation.ts:

module Validation { 
    export interface StringValidator { 
     isAcceptable(s: string): boolean; 
    } 
} 

ZipCodeValidator.ts

/// <reference path="Validation.ts" /> 
module Validation { 
    var numberRegexp = /^[0-9]+$/; 
    export class ZipCodeValidator implements StringValidator { 
     isAcceptable(s: string) { 
      return s.length === 5 && numberRegexp.test(s); 
     } 
    } 
} 

LettersOnlyValidator.ts

मान लीजिए कि आप निम्न आंतरिक मॉड्यूल तीन फ़ाइलों में विभाजित है चलो
/// <reference path="Validation.ts" /> 
module Validation { 
    var lettersRegexp = /^[A-Za-z]+$/; 
    export class LettersOnlyValidator implements StringValidator { 
     isAcceptable(s: string) { 
      return lettersRegexp.test(s); 
     } 
    } 
} 

यदि आप tsc compiler में इनआउट पैरामीटर के साथ संकलित करते हैं तो आप उन्हें एक फ़ाइल में जोड़ सकते हैं। हालांकि, यह उन्हें एक सामान्यजेएस मॉड्यूल नहीं बनाता है। उन्हें निर्यात करने के लिए आप एक और ts फ़ाइल ValidationExport.ts नाम स्थान के लिए निर्यात के निर्देश युक्त कहा जाता है को जोड़ने के लिए एक चाल का उपयोग करें:

var module: any = <any>module; 
module.exports = Validation; 

और फिर आप एक ही कहा जाता फाइल करने के लिए सब कुछ संकलित करने के लिए tsc आदेश चला सकते हैं "validationmodule.js":

var Validation = require("./validationmodule"); 

var zipCodeValidator = new Validation.ZipCodeValidator(); 
var lettersOnylValidator = new Validation.LettersOnlyValidator(); 

console.log(zipCodeValidator.isAcceptable("16211")); 
console.log(lettersOnylValidator.isAcceptable("5555")); 
+0

देखें, बहुत अच्छी प्रतिक्रिया।मुझे लगता है कि यह मुझे सवाल पर ले जाता है: आंतरिक मॉड्यूल का उपयोग करने में क्या कमी है? मैंने थोड़ी देर पहले उनका उपयोग बंद कर दिया क्योंकि प्रबंधन स्क्रिप्ट निर्भरता एक faff था। – Marcus

+0

आंतरिक मॉड्यूल सिर्फ नामस्थान हैं। उन्हें आपके कोड में कोई सीमा नहीं लगनी चाहिए। मेरे उदाहरण में आपके पास स्क्रिप्ट निर्भरता है और यह ठीक काम करता है। यदि आपके पास एक जटिल जटिलता परिदृश्य है जो काम नहीं करता है तो आप इसे एक प्रश्न के रूप में पोस्ट कर सकते हैं;) –

+0

मुझे इस समाधान को लागू करने में समस्या हो रही है। विशेष रूप से, जब मैं लाइन 'tsc --out validationmodule.js चलाता हूं Validation.ts [...] ValidationExport.ts', tsc त्रुटि को बढ़ाता है' TS2304: नाम 'मॉड्यूल' नहीं मिल सकता है। 'जब यह' प्रमाणीकरण एक्सपोर्ट 'को संसाधित करने का प्रयास करता है .ts' – Jthorpe

1

होने:

tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts 

उत्पादन एक CommonJS मॉड्यूल आपको Node.js में उपयोग कर सकते हैं प्रति फ़ाइल एक अलग कॉमनजेएस मॉड्यूल पूरी तरह से उपयुक्त है। टाइपस्क्रिप्ट में सभी require कॉल जावास्क्रिप्ट में कॉमनजेएस require कॉल में अनुवाद करेंगे, और .d.ts फ़ाइलों को प्रक्रिया में उठाया जाएगा। (यदि आप अपनी स्रोत निर्देशिका के बाहर require आईएनजी कक्षाओं जैसे कुछ मूर्खतापूर्ण कर रहे हैं ... रोकें।)

यदि आप अन्य अनुप्रयोगों में इस एनपीएम पैकेज का उपयोग करना चाहते हैं तो आपको केवल पैकेजिंग चरण पर विचार करना होगा, इस मामले में Browserify

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