【问题标题】:TypeScript Import Path AliasTypeScript 导入路径别名
【发布时间】:2016-11-30 19:02:07
【问题描述】:

我目前正在开发一个 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 文件夹是生成的源,此路径是使用我的tsconfig.json 文件中的outDir 配置的。我还将package.json 中的main 属性配置为dist/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,但前提相同)。

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

【问题讨论】:

  • 如果你在index.ts中导入Calculator.ts你可以试试import {Sin,Cos,Tan} from "./utils/Calculator"
  • 如果从包本身导入,这肯定会起作用。但是,我的问题是这是我安装到 node_modules 中的一个模块,然后使用 `from "packagename/" 导入 - 问题是添加到 dist 文件夹的直接路径感觉很乱,我想将其别名为将此设置为默认导入位置,但在模块内进行,而不是我必须在使用模块的项目中配置。
  • 如果您添加配置对象,您可以在其中添加包名或文件名并“构建”您的路径,还要查看 system.js 或 webpack 以完成此任务
  • 我希望避免构建任务以使路径逻辑正常工作。话虽如此,这似乎是大多数 CommonJS 模块构建方式的规范。

标签: typescript typescript2.0


【解决方案1】:

如果您使用路径,则需要在使用 tsc 将 typescript 编译为纯 javascript 后将绝对路径改回相对路径才能正常工作。

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    {
      "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 中路径映射功能的更多详细信息,请参阅this Github issue

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

    {
      "compilerOptions": {
        "baseUrl": ".",
        "paths": {
          "common-utils/utils/*": ["./node_modules/common-utils/dist/es2015/utils/*"]
        }
      }
    }
    

    【讨论】:

    • 谢谢@faraz。我会在今天早上的某个时候试一试。路径配置进入我的模块,而不是项目,对吧?然后当我拉入我的模块时,TypeScript 编译器应该会选择这个文件中定义的路径,对吗?
    • 不,路径配置在您的 TypeScript 项目中,它应该指向您要从项目中引用的模块。
    • 我想尽可能多地让它在项目中类似地工作。这是否意味着从模块的角度来看,我要求做的事情目前在 TypeScript 本身中是不可能的?我很乐意执行上述操作,但在包本身中定义它,以便在导入时获取路径别名。 Jspm 允许包为路径配置别名,我希望 TypeScript 提供的功能与告诉用户添加这些路径别名一样有点痛苦。一个路径全局字符串中是否支持多个通配符?
    • 啊,我误解了你的问题!我没有意识到我们正在尝试从包中直接配置。为什么不将package.json 中的main 属性设置为适当的索引文件?
    • 这种方法可以让我使用 Typescript 应用程序中的 import {Date} from 'common-utils/src/utils/Date' 并让 tsc 将其重写为 dist/....
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2021-07-28
    • 2016-04-28
    • 2019-11-25
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多