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

时间:2016-12-15 19:30:40

标签: javascript node.js typescript node-modules

我需要基于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 --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路径。

2 个答案:

答案 0 :(得分:4)

关于Microsoft的打字稿github的

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