Typescript:如何解析node.js的绝对模块路径?
我需要的模块上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 --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
路径。
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
你已经在你的问题所发出的输出基本上证实了这一点为自己。
虽然你是对的,但你并没有真正回答这个问题。 “模块名称是资源标识符,应按原样发出并且不得更改。” 相对路径导致我们可以有无限数量的资源标识符变体的情况。另一方面,绝对路径是唯一标识符,应该是我认为的首选方式。 看来,实现定制(即,外部node_modules)绝对路径的唯一方法是向构建添加另一步骤,例如,的WebPack。 – Kitanotori
我的问题解决了,当我从tsconfig.json – somerandomusername
删除outDir,但比你有生成'.js','.map''.d.ts'污染的src文件夹混乱,而不是所有生成的公共文件夹文件。 – Alkasai