文章目录
前沿
最近在写一个小程序通过脚本自动上传到微信平台,获取预览码的一个功能脚本。
写着写着呢,突然想着用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)
版权归原作者 乆夨(jiuze) 所有, 如有侵权,请联系我们删除。