2017-12-20 293 views
5

Obecnie używa maszynopisu w aplikacji node.js. Skompilowałem swoją aplikację i używam typescript's path mapping feature.Mapowanie ścieżek maszynopisu nie jest tłumaczone w aplikacji węzła

"api/*" powinno zamiast tego wyglądać w folderze głównym. Używanie następujących w prace rozwojowe:

nodemon --watch src -e ts,tsx --exec ts-node -r tsconfig-paths/register --disableWarnings ./src/index.ts 

tsconfig-paths/register pozwala wymagać, aby być prawidłowo przetłumaczone i TS-węzeł będzie wykonywał/uruchomić aplikację poprawnie. Teraz pojawia się problem, kiedy przechodzę do produkcji. Kiedyś w produkcji po prostu uruchamiałem tsc w folderze i przeniesiono zawartość outDir (dist /) do/app w moim obrazie doka, i uruchomiłem node /app/index.js. To działało, dopóki nie zacząłem używać funkcji mapowania ścieżek maszynopisu. Teraz po prostu pojawia się błąd:

Error: Cannot find module 'api/module/path/here'

Od this github comment nazwy modułu nie są widocznie odwzorowany na wyjściu skompilowany javascript.

Mój plik tsconfig.json:

{ 
    "compilerOptions": { 
     "target": "es2015", 
     "module": "commonjs", 
     "moduleResolution": "node", 
     "allowSyntheticDefaultImports": true, 
     "jsx": "react", 
     "allowJs": true, 
     "alwaysStrict": true, 
     "sourceMap": true, 
     "forceConsistentCasingInFileNames": true, 
     "noFallthroughCasesInSwitch": true, 
     "noImplicitReturns": true, 
     "noUnusedLocals": true, 
     "noUnusedParameters": true, 
     "noImplicitAny": false, 
     "noImplicitThis": false, 
     "strictNullChecks": false, 
     "experimentalDecorators": true, 
     "emitDecoratorMetadata": true, 
     "lib": ["es2017", "dom"], 
     "baseUrl": "src", 
     "outDir": "dist", 
     "types": [ 
     "node" 
     ], 
     "paths": { 
     "universal/*": ["../../universal/*"], 
     "api/*": ["*"], 
     "*": ["node_modules/*"] 
     }, 
     "typeRoots": [ 
     "./node_modules/@types", 
     "./src/types" 
     ] 
    }, 
    "include": [ 
     "src/**/*" 
    ] 
} 

Jakie jest zalecane podejście do korzystania ścieżkę względną mapowanie w node.js środowiska? Jeśli maszynopis zastępuje rozwiązanie, dlaczego nie powinien przepisać instrukcji wymagających? Głupie jest angażowanie kolejnego kroku, takiego jak babel czy webpack, tylko po to, aby dodać funkcjonalność, jaką maszynopis zapewnia rozdzielczości modułu.

EDYCJA: Po dodatkowym kopaniu znalazłem, że mogę użyć -r tsconfig-paths/register w moim środowisku węzła (po prostu muszę skopiować w moim pliku tsconfig.json). Mogę przełączyć mojego punktu wejścia w dokowanym do:

ENTRYPOINT [ "node", "-r", "tsconfig-paths/register", "index.js" ] 

Problem polega na tym, że teraz trzeba zmodyfikować moje tsconfig.json baseURL, jako katalog src/ nie istnieje. Zauważyłem także, że rozdzielczość nie działa dla modułu "util" (najwyraźniej używa on util w folderze node_mulules zamiast biblioteki util.js), co powoduje awarię mojej aplikacji.

Odpowiedz

1

Według źródła podałeś, może być w stanie wykorzystać (np rozwiązać ostatnią ścieżkę pierwszej ścieżce):

"rootDirs": [ 
     "src/api/module/path/here", 
     "api/module/path/here" 
    ] 

The problem is, I now need to modify my tsconfig.json baseUrl, as the directory src/ doesn't exist.

typescript's path mapping feature Zjednoczone:

The flexibility of rootDirs is not limited to specifying a list of physical source directories that are logically merged. The supplied array may include any number of ad hoc, arbitrary directory names, regardless of whether they exist or not. This allows the compiler to capture sophisticated bundling and runtime features such as conditional inclusion and project specific loader plugins in a type safe way.

także , sprobowałeś Rozdzielczość modułu śledzącego: tsc --traceResolution

+0

Węzeł ts kompiluje się i działa poprawnie z bieżącą konfiguracją. – FrankerZ