2016-12-15 26 views
5

muszę moduły, które należy rozwiązać w oparciu o baseUrl kodu tak wyjściowym jest użyteczny dla node.jsMaszynopis: Jak rozwiązać bezwzględne ścieżki modułów dla pliku node.js?

to moja src/server/index.ts

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

... 

a to mój 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; 

Running tsc I "jestem w stanie skompilować wszystkie pliki bez błędów, ale wyjście: dist/server/index.js jest

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

... 

Wynik z Cannot find module 'server/config', jeśli próbuję użyć go z node dist/sever/index.js.

Dlaczego ścieżka nie jest rozwiązana w żaden sposób, aby można było użyć skompilowanego kodu lub jak go rozwiązać. Albo co robię lub myślę w niewłaściwy sposób?

My tsc --version jest 2.1.4

To jest mój 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" 
    ] 
} 

Uwaga I nie chcesz korzystać ../../../../relative ścieżek.

+0

Mój problem został rozwiązany po usunięciu OutDir z tsconfig.json – somerandomusername

+0

, ale zamiast tego masz zagracony folder src zanieczyszczony wygenerowanym '.js',' .map' '.d.ts', zamiast wspólnego folderu dla wszystkich wygenerowanych akta. – Alkasai

Odpowiedz

2

This post na maszynopisie Microsoft github wyjaśnia ich proces rozwiązywania modułów. W komentarzach tłumaczą, że tego, co próbujesz zrobić, nie można zrobić.

ta cecha, wraz z resztą uchwały modułu możliwości, są tylko pomóc kompilator znaleźć źródło modułu nadać nazwę modułu. brak zmian w kodzie wyjściowym js. jeśli potrzebujesz "folder2/plik1", zawsze będzie emitowany w ten sposób. mogą wystąpić błędy , jeśli kompilator nie może znaleźć folderu folder2/plik1.ts, ale nie zmieni się na dane wyjściowe na . https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-206451221

i

Kompilator nie przepisać nazwy modułu. Nazwy modułów są uważane identyfikatory zasobów i są odwzorowywane na wyjściu jako pojawiają się one w źródle https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-232470330

Tak, emitowany JS od maszynopisu NIE przepisać ścieżkę modułów dla wykrytych modułów dajesz do require . Jeśli po kompilacji uruchomisz swoją aplikację w node (która wygląda na ekspresową), to użyje ona node module system, aby rozwiązać odniesienia do modułów po kompilacji maszynopisu. Oznacza to, że będzie przestrzegać tylko względnych ścieżek w twoim module, a następnie powróci do node_modules, aby znaleźć zależności.

tak to ma działać.kompilator potrzebuje ścieżek, aby znaleźć deklarację swojego modułu. nazwy modułów to identyfikatory zasobów i powinny być emitowane bez zmian. https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508

Masz w zasadzie potwierdził to sam w emitowanej mocy w swoim pytaniu.

+1

Chociaż masz rację, tak naprawdę nie odpowiadasz na pytanie. "Nazwy modułów są identyfikatorami zasobów i powinny być emitowane w niezmienionej postaci." Względne ścieżki prowadzą do sytuacji, w której możemy mieć nieograniczoną liczbę odmian identyfikatora zasobu. Natomiast ścieżki bezwzględne są unikalnymi identyfikatorami i moim zdaniem powinny być preferowanym sposobem. Wydaje się, że jedynym sposobem uzyskania bezwzględnych ścieżek niestandardowych (tj. Poza węzłem_modul) jest dodanie kolejnego kroku do kompilacji, np. Webpack. – Kitanotori

Powiązane problemy