2016-12-15 70 views
5

我需要的模塊上baseUrl所以輸出代碼來解決築底是node.js的Typescript:如何解析node.js的絕對模塊路徑?

可這是我的src/server/index.ts

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

... 

,這是我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"); 

... 

如果我試圖將其與node dist/sever/index.js一起使用,則結果爲Cannot find module 'server/config'

爲什麼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

刪除outDir,但比你有生成'.js','.map''.d.ts'污染的src文件夾混亂,而不是所有生成的公共文件夾文件。 – Alkasai

回答

2

This post微軟的打字稿github解釋了他們的模塊解析過程。在評論中,他們解釋說,你正在努力做的事情是無法完成的。

此功能,與模塊分辨率 能力的其餘一起,都只是爲了幫助編譯器找到一個給定的模塊名稱模塊源 。沒有更改輸出js代碼。如果您需要 「folder2/file1」,它將始終以這種方式發射。如果編譯器找不到文件夾2/file1.ts,但沒有 更改爲輸出,則可能會收到 錯誤。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-206451221

編譯器不重寫模塊名稱。模塊名稱是 考慮資源標識符,並映射到輸出,因爲他們 出現在源 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-232470330

因此,所發射的JS從打字稿不改寫爲發現模塊,你給require模塊路徑。如果您在編譯後運行node的應用程序(它看起來像使用express),那麼它將使用node module system來解析打字稿編譯後的模塊引用。這意味着它只會尊重模塊中的相對路徑,然後它會回退到node_modules來查找依賴關係。

這就是它是如何工作的。編譯器需要找到 模塊聲明的路徑。模塊名稱是資源標識符 ,應按原樣發出並且不得更改。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508

你已經在你的問題所發出的輸出基本上證實了這一點爲自己。

+1

雖然你是對的,但你並沒有真正回答這個問題。 「模塊名稱是資源標識符,應按原樣發出並且不得更改。」 相對路徑導致我們可以有無限數量的資源標識符變體的情況。另一方面,絕對路徑是唯一標識符,應該是我認爲的首選方式。 看來,實現定製(即,外部node_modules)絕對路徑的唯一方法是向構建添加另一步驟,例如,的WebPack。 – Kitanotori

相關問題