86

我目前正在开发一个 TypeScript 应用程序,该应用程序由多个用 TypeScript 编写的 Node 模块组成,这些模块安装在node_modules目录中。

在继续之前,我想指出我正在使用 TypeScript 2.0,如果需要的话,我也不反对使用 2.1 开发版本。我只是想让这个工作。

每个 Node 模块的结构大致如下:

dist/
    es2015/
        index.js
        utils/
            Calculator.js
            Calculator.d.ts
            Date.js
            Date.d.ts
            Flatpack.js
            Flatpack.d.ts
src/
    index.ts
    utils/
        Calculator.ts
        Date.ts
        Flatpack.ts

dist 文件夹是生成的源,此路径是outDir在我的tsconfig.json文件内部配置的。我还将我的main属性配置package.jsondist/es2015/index.js.

需要注意的重要事项:

  • 在我的项目中,我使用moduleResolution的是node
  • 我正在使用 TypeScript 2.0
  • 我不是在问如何从包中导入文件。我通过 Npm 安装包,然后packagename/从使用此模块的应用程序中导入它。

现在是我的问题/问题。从这个模块导入文件时,我希望能够做到这一点:

import {Sin, Cos, Tan} from "common-utils/utils/Calculator";

但是,该文件无法解析到该dist/es2015/utils目录。理想情况下,我希望我的导入从这个特定dist文件夹而不是从根目录解析,这似乎正在发生。

上面的导入需要写成下面这样才能让它工作:

import {Sin, Cos, Tan} from "common-utils/dist/es2015/utils/Calculator";

但是,dist/es2015每次都写并不理想,它只会让一些导入看起来很长。有没有办法可以配置我的模块以解析到dist/es2015目录?我不想在我的项目中添加覆盖,理想情况下每个模块都会指定从哪里解析文件。

如果您在创建要与 Jspm 一起使用的插件/模块时在 Jspm 中仍然不确定我在问什么(如果这令人困惑,我深表歉意),您可以package.json在模块内部指定如下内容:

  "jspm": {
    "registry": "npm",
    "jspmPackage": true,
    "main": "my-module",
    "format": "amd",
    "directories": {
      "dist": "dist/amd"
    },

我正在 TypeScript 中寻找与上述内容相同的内容(如果存在)。映射指令,因此当最终用户运行npm install my-cool-package然后在他们的应用程序中尝试导入某些内容时,默认情况下所有导入都解析到commonjs目录(上面的 Jspm 示例使用 amd,但前提相同)。

这是可能的还是我在这里误解了什么?我知道最新版本中添加了一些新的路径映射功能,但几乎不存在使用它们的文档。

4

2 回答 2

168

因此,在阅读您的评论后,我意识到我误解了您的问题!如果您想从导入包的角度控制路径,只需将main您的属性设置为package.json正确表示模块对象图的文件。

{
  "main": "common-utils/dist/es2015/index.js"
}

如果您尝试从项目的角度控制导入路径,那么您正在寻找的是 TypeScript 2 用于模块解析的新路径映射功能。您可以通过tsconfig.json如下配置来启用路径映射:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "angular2/*": ["../path/to/angular2/*"],
      "local/*": ["../path/to/local/modules/*"]
    }
  }
}

然后,在您的 TypeScript 文件中,您可以像这样导入模块:

import { bootstrap } from 'angular2/bootstrap';
import { module } from 'local/module';

有关 TypeScript 2 中路径映射功能的更多详细信息,请参阅此 Github 问题

在您的情况下,我认为以下配置应该有效:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "common-utils/utils/*": ["./node_modules/common-utils/dist/es2015/utils/*"]
    }
  }
}
于 2016-07-30T19:48:19.403 回答
11

如果您使用路径,则需要将绝对路径改回相对路径,以便在使用tsc.

到目前为止,最流行的解决方案是tsconfig-paths 。

我已经尝试过了,但它不适用于我复杂的设置。此外,它在运行时解析路径,这意味着包大小和解析性能方面的开销。

所以,我自己写了一个解决方案,tscpaths

我会说总体上更好,因为它在编译时替换了路径。这意味着没有运行时依赖或任何性能开销。使用起来非常简单。你只需要在你的构建脚本中添加一行package.json.

该项目还很年轻,因此如果您的设置非常复杂,可能会出现一些问题。尽管我的设置相当复杂,但它对我的设置完美无缺。

于 2018-10-08T09:40:58.843 回答