我需要基于baseUrl
解析模块,因此输出代码可用于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");
...
如果我尝试将其与Cannot find module 'server/config'
一起使用,则会产生node dist/sever/index.js
。
为什么server/config
路径未以任何方式解析,因此可以使用已编译的代码或如何解决它。或者我在做什么或者想错了什么?
我的tsc --version
是2.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 :(得分:4)
This post解释了他们的模块解析过程。在评论中,他们解释说,您尝试做的事情无法完成。
此功能以及模块分辨率的其余部分 功能,只是帮助编译器找到模块源 给出一个模块名称。输出js代码没有变化。如果你需要的话 "文件夹2 / file1的"它将始终以这种方式发射。你可能会得到 如果编译器找不到folder2 / file1.ts错误,但没有 改变输出。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-206451221
和
编译器不会重写模块名称。模块名称是 考虑资源标识符,并按原样映射到输出 出现在源中 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-232470330
因此,typescript中发出的JS不会重写您为require
提供的已发现模块的模块路径。如果您在编译后在node
中运行您的应用程序(它看起来像是快递),那么它将使用node module system在打字稿编译后解析模块引用。这意味着它只会尊重模块中的相对路径,然后它将回退到node_modules以查找依赖项。
这就是它的工作方式。编译器需要查找路径 你的模块的声明。模块名称是资源标识符 并应按原样发射,不得改变。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508
您已基本确认了问题中的发出输出。
答案 1 :(得分:0)
我也已经研究了该主题,并且似乎到目前为止,还没有开箱即用的解决方案:(
尽管我已经使用module-alias npm软件包设法或多或少地获得了预期的结果-有关详细信息,请参见this blog post。