打字稿:如何解析node.js的绝对模块路径?

pie*_*e6k 6 javascript node.js node-modules typescript

我需要基于baseUrl此解析模块,因此输出代码可用于node.js

这是我的 src/server/index.ts

import express = require('express');
import {port, databaseUri} from 'server/config';

...
Run Code Online (Sandbox Code Playgroud)

这是我的 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;
Run Code Online (Sandbox Code Playgroud)

运行tsc我能够编译没有错误的所有文件,但输出:dist/server/index.js

"use strict";
var express = require("express");
var config_1 = require("server/config");

...
Run Code Online (Sandbox Code Playgroud)

结果Cannot find module 'server/config'如果我正在尝试使用它node dist/sever/index.js.

为什么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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

注意:我希望使用../../../../relative的路径.

jmq*_*jmq 7

Microsoft 的 typescript github 上的这篇文章解释了他们的模块解析过程。在评论中,他们解释说您尝试做的事情无法完成。

此功能以及模块解析功能的其余部分仅用于帮助编译器在给定模块名称的情况下查找模块源。输出js代码没有变化。如果您需要“folder2/file1”,它将始终以这种方式发出。如果编译器找不到 folder2/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_modules 来查找依赖项。

这就是它的工作方式。编译器需要找到模块声明的路径。模块名称是资源标识符,应按原样发出,不得更改。 https://github.com/Microsoft/TypeScript/issues/5039#issuecomment-255870508

您基本上已经在问题中发出的输出中为自己确认了这一点。

  • 虽然你是对的,但你并没有真正回答这个问题。“模块名称是资源标识符,应按原样发出,不得更改。” 相对路径导致我们可以拥有无​​限数量的资源标识符变体的情况。另一方面,绝对路径是唯一标识符,在我看来应该是首选方式。似乎实现自定义(即在 node_modules 之外)绝对路径的唯一方法是在构建中添加另一个步骤,例如 Webpack。 (7认同)