记录node环境下执行ts文件一些问题,以及Node.js 版本 v22.6.0下可以直接执行ts文件

前沿

最近在写一个小程序通过脚本自动上传到微信平台,获取预览码的一个功能脚本。
写着写着呢,突然想着用ts去实现它,一方面是项目是用uniapp + vue3 + vite + ts搭建的,想着保持统一,使用ts文件,另一方面呢也有点强迫症。

什么才算ts文件

众所周知node环境下是不能直接去执行ts脚本的,但是无意中我随手写了个文件,发现是可以执行的,很简单的一段代码。

const a = '111'

console.log('====hello world====', a)

在这里插入图片描述
我们看结果,是执行成功的。

这个test.ts文件是ts文件吗?
是吗?是吧,后缀名是.ts啊!!!
不是吧?ts是js的超集,那它与js的最大区别是什么?仅仅是后缀名吗?

我认为最大的区别是ts拥有类型定义。
那么这里我在加点东西,我们在来看看这个执行结果。

在这里插入图片描述
我仅仅改变了一些东西,没错我给这个a变量增加了个类型定义,现在node执行就抛出错误了。
SyntaxError: Missing initializer in const declaration
表面上看显示SyntaxError: const声明中缺少初始化项

在对比下?之前的test.ts文件是ts文件吗?

node环境下执行ts文件方法

想要在node环境直接执行ts文件,目前来说是不允许的,所以目前来说先执行以下命令。

npm i ts-node -g
npm i typescript -g

注意细节,为什么我说目前哈,因为Node.js 近日刚合并了一个 PR#53725[1],主要内容是通过设置 flag --experimental-strip-types,使得可以在 Node.js 中直接执行 TypeScript 文件。Node.js 会自动将 TypeScript 源代码转译为 JavaScript 源代码,不需要手动安装依赖来做转译了。在这个转译过程中,不会进行类型检查,所有的类型信息都会被丢弃。
但是这个是有要求的,且目前也不在稳定版,估计要过段时间了。
Node.js 版本为 v22.6.0

问题1

test.ts:10:1 - error TS1208: 'test.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.
在这里插入图片描述
这里我特意把ts-node和typescript版本放出来哈,是装过的,但是提示一个问题。
意思是不能在“——isolatedModules”下编译,因为它被认为是一个全局脚本文件。添加import、export或空的’export{}'语句,使其成为一个模块。

解决方法tsconfig.json里面加上"isolatedModules": false

  "compilerOptions": {
    "isolatedModules": false
  },

在这里插入图片描述

问题2

在我的脚本里呢是需要导入一些node包和node自带的模块的,比如path和fs等等这里呢涉及到一个问题是用ES规范导入方式还是用CommonJs的规范导入呢
在这里插入图片描述
这里我先用ES的了,但是这里会出现问题了
(node:32922) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. (Use node --trace-warnings … to show where the warning was created)
意思也比较好理解,如果你想用ES module,需要设置type为model,或者使用.mjs的后缀名
这里我目的是想要ts,那就设置type吧,在package.json里面增加"type": "module",
在这里插入图片描述
执行相同命令,好另一个问题出来了
在这里插入图片描述
表面上意思是文件扩展名未知,怎么解决?我查了查
找了一篇博客,上面说把package.json中的type:'module’删除,你说我为什么加上呢?
在这里插入图片描述

博客地址

问题3

换一个吧,我用CommonJs规范,引入吧,上一个问题用ES的规范,我感觉进入死胡同了。一个要删除 “type”: “module”, 一个要加上。我们就换,再试试
在这里插入图片描述
新问题出来了
Cannot find name 'require'. Do you need to install type definitions for node? Try npm i --save-dev @types/node and then add 'node' to the types field in your tsconfig.
从这上面其实给出了答案,本地项目安装@types/node并且在tsconfig文件里的type里面加上‘node’
我秉持的听劝的原则都加上了
在这里插入图片描述
在这里插入图片描述

小结

最后终于是OK了,但是在这里我依然还是没有解决用ES的方式去完成这个功能,还需要在研究研究,最后可以明确的是Node.js 将原生支持 TS!
参考地址(腾讯云)
参考地址(csdn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值