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 --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 路径。

【问题讨论】:

当我从 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 键入信息?

如何删除多行 typeorm - postgresql 和 node.js(typescript)

Node.JS + TypeScript如何从堆栈跟踪中跟踪源代码?