2016-12-15 64 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

相关问题