Typescript:如何解析 node.js 的绝对模块路径?
Posted
技术标签:
【中文标题】Typescript:如何解析 node.js 的绝对模块路径?【英文标题】:Typescript: How to resolve absolute modules paths for node.js? 【发布时间】:2017-05-01 12:22:02 【问题描述】:我需要根据 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");
...
如果我尝试将它与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
路径。
【问题讨论】:
当我从 tsconfig.json 中删除 outDir 时,我的问题解决了 但是您的 src 文件夹被生成的.js
、.map
.d.ts
污染了,而不是所有生成文件的公共文件夹。
【参考方案1】:
Microsoft 的 typescript github 上的This post 解释了他们的模块解析过程。在 cmets 中,他们解释说您尝试做的事情无法完成。
此功能以及模块分辨率的其余部分 能力,只是帮助编译器找到模块源 给定一个模块名称。输出 js 代码没有变化。如果你需要 “folder2/file1”总是以这种方式发出。你可能会得到 如果编译器找不到文件夹 2/file1.ts,则会出错,但没有 更改为输出。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-206451221
和
编译器不会重写模块名称。模块名称是 考虑资源标识符,并映射到输出,因为它们 出现在源码中 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-232470330
因此,从 typescript 发出的 JS 不会重写您提供给 require
的已发现模块的模块路径。如果您在编译后在node
中运行您的应用程序(看起来您使用的是 express),那么它将在 typescript 编译后使用node module system 来解析模块引用。这意味着它只会尊重你模块中的相对路径,然后它会回退到 node_modules 来查找依赖项。
这就是它的工作方式。编译器需要找到的路径 你的模块的声明。模块名称是资源标识符 并且应该按原样发出而不是改变。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508
您已经在问题的输出输出中基本确认了这一点。
【讨论】:
虽然你是对的,但你并没有真正回答这个问题。 “模块名称是资源标识符,应该按原样发出而不是更改。”相对路径导致我们可以拥有无限数量的资源标识符变体的情况。另一方面,绝对路径是唯一标识符,在我看来应该是首选方式。似乎实现自定义(即在 node_modules 之外)绝对路径的唯一方法是在构建中添加另一个步骤,例如网页包。以上是关于Typescript:如何解析 node.js 的绝对模块路径?的主要内容,如果未能解决你的问题,请参考以下文章
如何清理 Node.js 和 Typescript 中的响应正文
如何使用 TypeScript 导入自定义 node.js 插件模块
Typescript / Node.js - 如何模拟集成测试的传递依赖项?
如何使用 Node.js 包中的 TypeScript 键入信息?