2016-12-15 15 views
5

मैं मॉड्यूल baseUrl तो उत्पादन कोड पर आधारित समाधान आवश्यक यह मेरा src/server/index.tsटाइपस्क्रिप्ट: node.js के लिए पूर्ण मॉड्यूल पथ को कैसे हल करें?

import express = require('express'); 
import {port, databaseUri} from 'server/config'; 

... 

है Node.js

के लिए प्रयोग करने योग्य है और यह मेरा src/server/config/index.ts

export const databaseUri: string = process.env.DATABASE_URI || process.env.MONGODB_URI; 
export const port: number = process.env.PORT || 1337; 

रनिंग tsc मैं है 'मिली त्रुटियाँ बिना सभी फाइलों को संकलित करने में सक्षम हूँ, लेकिन उत्पादन: dist/server/index.js

है
"use strict"; 
var express = require("express"); 
var config_1 = require("server/config"); 

... 

Cannot find module 'server/config' के साथ परिणाम यदि मैं इसे node dist/sever/index.js के साथ उपयोग करने का प्रयास कर रहा हूं।

क्यों server/config पथ किसी भी तरह से हल नहीं होती है, तो यह संभव होगा संकलित उपयोग करने कोड या कि यह कैसे इसे हल करने के लिए। या मैं गलत तरीके से क्या कर रहा हूं या सोच रहा हूं?

मेरे tsc --version2.1.4

है यह मेरा tsconfig.json है:

{ 
    "compileOnSave": true, 
    "compilerOptions": { 
     "baseUrl": "./src", 
     "rootDir": "./src", 
     "module": "commonjs", 
     "target": "es5", 
     "typeRoots": ["./src/types", ".node_modules/@types"], 
     "outDir": "./dist" 
    }, 
    "include": [ 
     "src/**/*" 
    ], 
    "exclude": [ 
     "node_modules", 
     "**/*.spec.ts" 
    ] 
} 

नोट मैं ../../../../relative रास्तों का उपयोग नहीं करना चाहती।

+0

मेरी समस्या हल हो गई जब मैंने हटा दिया, tsconfig.json से हटाएं – somerandomusername

+0

लेकिन आपके द्वारा जेनरेट किए गए '.js', '.map'' .d.ts' के साथ प्रदूषित src फ़ोल्डर को संकलित किया गया है, सभी जेनरेट किए गए एक सामान्य फ़ोल्डर के बजाय फ़ाइलें। – Alkasai

उत्तर

2

This post माइक्रोसॉफ्ट के टाइपप्रति पर GitHub उनके मॉड्यूल संकल्प प्रक्रिया बताते हैं। टिप्पणियों में वे बताते हैं कि आप जो करने की कोशिश कर रहे हैं वह नहीं किया जा सकता है।

इस सुविधा, मॉड्यूल संकल्प क्षमताओं के आराम के साथ साथ, संकलक मॉड्यूल स्रोत एक मॉड्यूल का नाम दिया पाने में आपकी मदद के लिए एक ही कर रहे हैं। आउटपुट जेएस कोड में कोई बदलाव नहीं। यदि आपको "फ़ोल्डर 2/फ़ाइल 1" की आवश्यकता है तो यह हमेशा इस तरह से उत्सर्जित होगा। यदि संकलक एक folder2/file1.ts नहीं पा सके आप त्रुटियों मिल सकता है, लेकिन उत्पादन के लिए कोई परिवर्तन। https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-206451221

और

संकलक मॉड्यूल नाम पुनर्लेखन नहीं है। मॉड्यूल नाम माना संसाधन पहचानकर्ता हैं, और उत्पादन के लिए मैप किया जाता है के रूप में वे स्रोत में प्रदर्शित https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-232470330

तो, उत्सर्जित जे एस टाइपप्रति की खोज की मॉड्यूल आप require को देने के लिए मॉड्यूल पथ पुनर्लेखन नहीं करता से । आप संकलन (जो ऐसा लगता है कि आप एक्सप्रेस के साथ कर रहे हैं) के बाद node में अपने एप्लिकेशन को चलाने के हैं, तो यह टाइपप्रति संकलन के बाद मॉड्यूल संदर्भ को हल करने node module system का प्रयोग करेंगे। इसका मतलब यह है कि यह केवल आपके मॉड्यूल में सापेक्ष पथ का सम्मान करेगा और फिर निर्भरताओं को खोजने के लिए यह node_modules पर वापस आ जाएगा।

वह यह है कि यह कैसे काम करने के लिए है।कंपाइलर को आपके मॉड्यूल की घोषणा खोजने के पथों की आवश्यकता है। मॉड्यूल नाम संसाधन पहचानकर्ता हैं और इसे उत्सर्जित किया जाना चाहिए और परिवर्तित नहीं किया जाना चाहिए। https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508

आप मूल रूप से अपने प्रश्न में उत्सर्जित उत्पादन में खुद के लिए यह पुष्टि की है।

+1

हालांकि आप सही हैं, आप वास्तव में सवाल का जवाब नहीं देते हैं। "मॉड्यूल नाम संसाधन पहचानकर्ता हैं और इसे उत्सर्जित किया जाना चाहिए और परिवर्तित नहीं किया जाना चाहिए।" सापेक्ष पथ ऐसी स्थिति का कारण बनते हैं जहां हमारे पास संसाधन पहचानकर्ता की असीमित विविधताएं हो सकती हैं। दूसरी तरफ, पूर्ण पथ अद्वितीय पहचानकर्ता हैं, और मेरी राय में पसंदीदा तरीका होना चाहिए। ऐसा लगता है कि कस्टम प्राप्त करने का एकमात्र तरीका (यानी node_modules के बाहर) पूर्ण पथ निर्माण के लिए एक और कदम जोड़कर है, उदा। Webpack। – Kitanotori

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