typescript在node.js下使用别名(paths)无效的问题详解

 更新时间:2022年07月06日 08:59:58   作者:追逐、  
这篇文章主要给大家介绍了关于typescript在node.js下使用别名(paths)无效问题的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

背景

纯nodejs环境,直接使用tsc编译nodejs。源码目录是src,编译输出目录为bin。代码结构如下:

  • src
    • utils
      • a.ts
      • b.ts
    • config
  • bin
  • tsconfig.json

在其他深层次目录引用utils或者config下的文件时,总是要写一长串的'../../../../',还需要数数。这显然是不能接受的。用过webpack开发的小伙伴们,想想别名功能,typescript这种成熟框架不可能没有。于是百度一波,得到如下配置:

{
    "baseUrl": "./",                             
    "paths": {
      "@utils/*": [
        "src/utils/*"
      ],
      "@config/*": [
        "src/config/*"
      ],
    }
}

配置完之后,使用如下方式引用a.ts模块:

import A from '@utils/a';

发现我的vscode编辑器已经能识别这个路径了,当我按下ctrl点击路径的时候,也自动跳转到了a.ts文件。在赞叹自己纯熟的技术之余,把所有的深层次路径都换成了如上写法,自信回头运行npm run start:


一脸懵逼。查看bin目录编译后的js文件,发现typescript根本没有按照我的配置,在编译过程中把这个路径给优化掉。还是require('@utils/a'):

typescript不会对别名进行处理

在捣鼓了很久确定我的tsconfig配置没有问题后,我无奈又进行了百度,发现typescript根本不会对别名进行处理,只能借助第三方编译工具,例如babelwebpack

但是我一个简单的nodejs项目,一种编译器足矣,我为什么需要再去使用上述编译器?于是另一个解决方案(chao ji da ken)诞生了:

https://github.com/dividab/tsconfig-paths

另一个坑

对,就是tsconfig-paths,这个工具,我进入其github首页,发现有1k左右的星星。看了一下插件介绍,发现正是为了解决这个问题。使用说明也很简单,引用官方文档,就一句话:

哇,只要通过-r指令添加一个预处理,再运行编译后的模块就可以解决我的问题?兴冲冲的我立即npm i --save 操作一波, 发现还是出现如下问题:

这次确定是是走了他的预处理了。为什么还是不生效???翻看其文档,也找不到任何有用的信息。到这里,大多数小伙伴估计都放弃了,但是今晚耗上了,一个别名问题居然拖了我这么长时间,于是我开始了源码调试,找一下到底是什么原因。

调试tsconfig-paths

配置vscode调试器,添加运行参数:

 {
       "type": "pwa-node",
        "request": "launch",
        "name": "Launch Program",
        "skipFiles": [
            "<node_internals>/**"
        ],
        "runtimeArgs": [
            "-r",
            "${workspaceFolder}/node_modules/tsconfig-paths/register"
          ],
        "program": "${workspaceFolder}\\bin\\index.js"
  }

调试源码,发现其核心功能就是读取tsconfig文件,获取paths(别名)映射,覆写path._resolveFilename,匹配映射,解析获取真正的模块。嗯,倒是不复杂

我在这里加了个条件断点,找到了我的utils/common的模块请求,发现found为空…问题就出在这里了。于是进一步查找。发现其匹配规则没问题,只是匹配到之后,寻找模块时使用的路径居然是原始tsconfig中配置的src

我的运行目录明明在bin目录!

这也太不智能了,你好歹读一下tsconfig里的outDir属性吧!

现在没办法了,为了适配他的代码,只能修改tsconfig的paths配置如下:

{
    "baseUrl": "./",                             
    "paths": {
      "@utils/*": [
        "src/utils/*",
        "bin/utils/*"
      ],
      "@config/*": [
        "src/config/*",
        "bin/config/*"
      ],
    }
}

这样他拼接的时候就能找到我的模块了,问题终于解决!

总结

到此这篇关于typescript在node.js下使用别名(paths)无效问题详解的文章就介绍到这了,更多相关typescript在node.js使用别名无效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • uni-app瀑布流效果实现方法

    uni-app瀑布流效果实现方法

    Uni-app是一个基于Vue.js开发跨平台应用的框架,它可以将代码编译成多个平台下的原生应用,这篇文章主要给大家介绍了关于uni-app瀑布流效果的相关资料,需要的朋友可以参考下
    2023-12-12
  • document.write的几点使用心得

    document.write的几点使用心得

    一直用document.write()方法向浏览器中显示数据用,把它当做Alert()使用, 看来这样用有些大材小用了,下面说说它的主要用处。
    2014-05-05
  • webpack常用构建优化策略小结

    webpack常用构建优化策略小结

    这篇文章主要介绍了webpack常用构建优化策略小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • uni-file-picker文件选择上传功能实现

    uni-file-picker文件选择上传功能实现

    这篇文章主要介绍了uni-file-picker文件选择上传,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • js拦截alert对话框另类应用

    js拦截alert对话框另类应用

    alert对话框的使用给用户带来了很多的方便,而有些时候不希望让它存在,接下来介绍如何使用js拦截alert对话框,感兴趣的朋友可以了解下
    2013-01-01
  • Openlayers实现角度测量的方法

    Openlayers实现角度测量的方法

    在Openlayers中,虽然没有直接的角度测量API,但可以通过自定义方法实现,首先,选取三个顶点,利用这些点的坐标计算夹角度数,接着,用SVG或canvas绘制代表角度的圆弧,并通过Overlay添加到地图上,本文给大家介绍Openlayers实现角度测量的方法,感兴趣的朋友一起看看吧
    2024-11-11
  • big.js 如何解决精度丢失问题源码解析

    big.js 如何解决精度丢失问题源码解析

    这篇文章主要为大家介绍了big.js 如何解决精度丢失问题源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • JavaScript 点击触发复制功能实例详解

    JavaScript 点击触发复制功能实例详解

    这篇文章主要介绍了JavaScript 点击触发复制功能实例详解,需要的朋友可以参考下
    2018-11-11
  • js获取当前日期时间及其它日期操作汇总

    js获取当前日期时间及其它日期操作汇总

    这篇文章主要介绍了js获取当前日期时间及其它日期操作汇总,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 一文搞懂JavaScript中的this绑定规则

    一文搞懂JavaScript中的this绑定规则

    这篇文章主要为大家详细介绍了原生JS之this绑定规则,这样大家再也不用担心this指向问题了。文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09

最新评论