2017-02-21 13 views
6

निम्नलिखित निर्देशिका संरचना के साथ एक सरल टाइपप्रति परियोजना पर विचार करें:बेसयूआरएल का उपयोग कर मॉड्यूल आयात करते समय पूर्ण पथ को हल करने के लिए टीएससी कैसे प्राप्त करें?

| package.json 
| tsconfig.json 
|    
\---src 
    | app.ts 
    | 
    \---foobar 
      Foo.ts 
      Bar.ts 

tsconfig.json./src/baseUrl होना करने के लिए कॉन्फ़िगर किया गया है।

{ 
    "compilerOptions": { 
     "module": "commonjs", 
     "target": "es6", 
     "noImplicitAny": true, 
     "removeComments": true, 
     "preserveConstEnums": true, 
     "outDir": "./dist/", 
     "baseUrl": "./src/" 
    }, 
    "include": [ 
     "./src/**/*" 
    ], 
    "exclude": [ 
     "node_modules" 
    ] 
} 

अब हम Bar.ts में Foo आयात करना चाहते हैं लगता है। मैं समझता हूँ कि baseUrl की स्थापना करके, अब हम पूर्ण पथ का उपयोग कर सकते मॉड्यूल

import { Foo } from 'foobar/Foo' 

आयात करने के लिए के रूप में संबंधित पथ

import { Foo } from './Foo' 

तो मेरी समझ सही है, टाइपप्रति संकलक में सक्षम होना चाहिए करने का विरोध किया है Bar.ts संकलित करते समय foobar/Foo से ./Foo को स्वचालित रूप से हल करें।

import { Foo } from 'foobar/Foo'; 

export class Bar { 
    foo: Foo; 

    constructor(num: number) { 
    this.foo = new Foo(num); 
    } 
} 

रनिंग tsc त्रुटियों के बिना संकलित करता है। फिर भी, जब हम वास्तव में संकलित Bar.js देखते हैं, तो हम देखेंगे कि पथ सही ढंग से हल नहीं किया गया है, जो हमें प्रदान करेगा यदि हम इसे चलाने के लिए मॉड्यूल त्रुटि नहीं पा रहे हैं।

"use strict"; 
const Foo_1 = require("foobar/Foo"); 
class Bar { 
    constructor(num) { 
     this.foo = new Foo_1.Foo(num); 
    } 
} 
exports.Bar = Bar; 

तो मेरे सवाल है: मैं tsc सही ढंग से पूर्ण पथ को हल करने जब baseUrl का उपयोग कर मॉड्यूल आयात करना कैसे मिल सकता है? या यदि ऐसा कुछ नहीं किया जा सकता है, तो baseUrl का उद्देश्य क्या है?

उत्तर

1

समस्या यह है कि आपका मॉड्यूल लोडर यह नहीं जानता कि पूर्ण पथ foobar/Foo दिए गए मॉड्यूल को कैसे ढूंढें।

टाइपस्क्रिप्ट कंपाइलर (टीएससी) मॉड्यूल पथ को सही ढंग से हल कर रहा है, अन्यथा आपको संकलन त्रुटियां मिलेंगी। लेकिन यह आपके मॉड्यूल लोडर को उचित रूप से कॉन्फ़िगर करने के लिए भरोसा कर रहा है।

उदाहरण के लिए, documentation for RequireJS से:

समर्थित विन्यास विकल्प:

baseurl: रूट पथ सभी मॉड्यूल लुकअप के लिए उपयोग करने के लिए।

टाइपप्रति documentation के बारे में तुम क्यों baseUrl आवश्यकता हो सकती है एक छोटे से बात करती है:

एक baseurl का उपयोग एएमडी मॉड्यूल लोडर जहां मॉड्यूल एक करने के लिए "तैनात" कर रहे हैं का उपयोग कर अनुप्रयोगों में एक आम बात है रन-टाइम पर एकल फ़ोल्डर। इन मॉड्यूल के स्रोत अलग-अलग निर्देशिकाओं में रह सकते हैं, लेकिन एक बिल्ड स्क्रिप्ट उन्हें सभी को एक साथ रखेगी।

+1

धन्यवाद!तो दूसरे शब्दों में, 'tsc' रिश्तेदार पथ पर पूर्ण पथ को परिवर्तित करने के लिए ज़िम्मेदार नहीं है, और मुझे इसके बजाय इसे हल करने के लिए मॉड्यूल लोडर को कॉन्फ़िगर करना है? यदि ऐसा है, तो क्या इसके बजाय सापेक्ष पथ में कनवर्ट करने के लिए 'tsc' प्राप्त करने का कोई तरीका है? – Zsw

+0

नहीं, जहां तक ​​मुझे पता है, 'tsc' आपके लिए पथ परिवर्तित नहीं करेगा। यदि संभव हो, तो अपने 'आयात' कथन में पथों का उपयोग करना आसान होगा जो आपके मॉड्यूल लोडर spec/config के अनुरूप हैं, और फिर तदनुसार मॉड्यूल नामों को हल करने के लिए' tsc' को बताने के लिए विभिन्न कंपाइलर विकल्पों का उपयोग करें। – Seamus

+1

@Zsw एक विकल्प के रूप में, "आउटफाइल" कंपाइलर विकल्प चेकआउट करें। यह मॉड्यूल को एक आउटपुट में जोड़ देगा: https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in- टाइपस्क्रिप्ट#concatenate-amd-and-system-modules-with---outfile – Seamus

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

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