背景
最近我在使用 typescript 刷 leecode 的时候,想对编写的代码进行调试,下面以最快的方式来配置调试以及对环境变量和模块化的思考
配置方式
1、生成 launch.json 文件
使用 TypeScript Debugger 插件
在插件市场中找到这个 TypeScript Debugger 插件,他会帮助我们快速生成针对 ts 的 launch.json

点击旁边 "运行和调试 ",再点击 "创建 launch.json "

会在中间出现选择框,选择 TS Debug

可以在根目录下看到 .vscode/launch.json

手动添加
如果说:"不嘛,我不想下载,添加那么多插件,会导致........(省略1000字)",
你不想下载的话,也可以在工作区目录 下手动创建添加 .vscode/launch.json

json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ts-node",
"type": "node",
"request": "launch",
"args": ["${relativeFile}"],
"runtimeArgs": ["-r", "ts-node/register"],
"cwd": "${workspaceRoot}",
"internalConsoleOptions": "openOnSessionStart"
}
]
}
2、运行调试
首先我们需要手动安装库 npm i ts-node
和 npm i typescript -g
我们执行完上面的命令之后,在代码中打上断点 ,再次回到运行和调试,点击左上角绿三角即可运行调试
这样我们就可以愉快的调试了,这就是一套流程,是不是很简单
如果你和我一样有强迫症,为啥我调试还需要本地安装 ts-node 库才能使用,我就想用全局的,保证项目目录的纯洁性,只想保留算法的代码,那么继续往下看

不使用本地安装的ts-node库来调试
很多长的帅的人要说:"好难受啊!!!为啥我调试还要手动在本地安装 ts-node
库,为啥不能使用全局的"我只能很遗憾的说,有解决方法
我们知道在点击 开始调试 的时候默认执行的是下面的命令,简单来说的话就是node -r ts-node index.ts
,它的意思分别是:
node
: 这是执行 nodejs 程序的命令。-r
: nodejs 的一个选项,用于在运行脚本之前预加载指定的模块。在这个命令中,-r
选项后面紧跟着要加载的模块,即ts-node
。ts-node
: 这是一个 nodejs 模块,它允许您直接运行 TypeScript 代码而无需先将其编译为 JavaScript。ts-node
在运行脚本之前会动态地将 TypeScript 代码编译成 JavaScript。index.ts
: 这是要执行的 TypeScript 文件的路径

好,道理我也懂了,现在来实践,把ts-node
的本地库给删了,我记得老师说过,根据nodejs
的默认调取规则会找到全局,什么webpack
、nodemon
都是这样干的
结果是找不到,纳尼,找不到,不可能啊!!!当然是有解决方法,参考下面的内容

1、配置环境变量 - 推荐
好,肯定是那里出现了问题,让我们来回想一下,为啥可以使用nodemon
等命令
我们进入到环境变量 里面可以看到NVM_SYMLINK
,进入到指定的地址,可以发现有对应的指令,哦~,这就是为啥可以执行全局的命令,但是我的 ts-node 为啥不见了

注意 :我默认使用 nvm
来管理的 nodejs
,如果没使用的话大概率是下面的结构(最新版的nodejs好像不一样)

我们来重新看一下执行的指令是啥node -r ts-node index.ts
,可以看到加上了-r
,我感觉是这个问题,进入到 nodejs 的官网看看是啥意思
可以看到它会预加载指定模块,也就是使用的 require 来加载的模块
我们都知道 require 也是有加载规则的,我们输入 node 进入到 REPL 模式,可以在 module.paths 中看到加载的顺序

注意 :REPL 是Read-Eval-Print Loop的简称,翻译为**"读取-求值-输出"循环**。REPL是一个简单的、交互式的编程环境。我们在浏览器的控制台就是标准的 REPL

我们可以发现没有我们全局库的地址,所以只要加上全局库的位置信息即可,这就需要配置环境变量 NODE_PATH,地址就根据你的环境来添加即可
如果不只是添加这个地址,还有其他位置就在 值 里面通过 ; 间隔添加地址即可,比如:C:\Program Files\nodejs\node_modules;C:\node_modules

我们这样配置的话就加入进入了

再次启动调试,既可正常调试

2、借助环境变量参数
如果不想使用环境变量的方式来做,还有其他方式
略加思考就可以知道其实本质就是指向全局 ts-node 的库的地址,如果我手动添加地址呢?其实是可以的,我们输入npm config get prefix
,可以看到地址,再在后面添加 node_modules 就行了

我们再将地址写进去就行了,这是最简单的

但是这种方式不优雅,我如果修改了 nodejs 的位置岂不是都要修改,我要想其他方式。
你说有没有一个变量,可以指向这里的呢?现在的问题就变成了,找到这个变量,在我苦苦思索之后,找到了。我们在控制台可以打印环境变量中的值(注意,这里不能使用 git bash,不然找不到)

那我把这个变量注入进入进行拼接不就完了,那就干
参考下图,使用成功,NICE~,我简直就是天才,现在把他迁入到 Vscode 里面

修改完之后,卧槽,怎么用不了,怎么没有注入进去,呜呜呜,可能 vscode 做了其他处理吧

又经过一顿查之后,发现可以用下面这个方式来做,成功运行调试,可以开心的写题目了

总结
在TypeScript代码调试过程中,我们可能会遇到ts-node模块找不到的问题。这通常是由于环境变量配置不当或Node.js管理工具(如NVM)的影响。尽管全局安装了ts-node,但在执行命令时仍可能无法找到该模块。为了解决这个问题,我们需要检查环境变量和Node.js管理工具的配置。
在Node.js中,模块加载遵循一定的规则,并且可以通过设置环境变量NODE_PATH
来指定全局库的地址。然而,简单地修改Node.js的位置并不是最佳解决方案,因为这可能需要频繁更改配置。更好的方法是使用环境变量来注入地址,以确保模块的正确加载。 在Vscode中,我们可能会发现环境变量未正确注入,导致调试失败。为了解决这个问题,我们可以尝试不同的配置方法,如通过安装TypeScript Debugger插件或手动创建.vscode/launch.json
文件来配置调试环境。同时,确保安装了ts-node库并正确配置了环境变量,以便在调试过程中能够顺利运行和加载模块。
总之,通过合理配置环境变量和使用适当的调试工具,我们可以解决TypeScript代码调试中遇到的ts-node模块找不到的问题。这将使我们能够更愉快地进行代码编写和调试,提高开发效率。 ------ OPEN AI GPT
这次的探索让我熟悉了一下 launch.json 的配置,还顺便复习了一下环境变量和模块化的知识 ------ 村头一只鹅鹅