首页 > 其他分享 >TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for xx.ts

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for xx.ts

时间:2024-03-17 22:46:18浏览次数:23  
标签:node TypeError 模块 ESModule ts module json file

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

假如你在编写一个 Typescript 库函数,你希望将其编译为 ESModule ,那么你可以通过在 package.json 中声明 "type": "module" 来告诉使用者你的库函数使用的模块规范是 ESModule 。

但如果你使用 ts-node 来运行这个库时,你很可能会遇到一行错误:

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

这是因为通过 tsc --init 生成默认 tsconfig.json 使用的默认模块规范是:"module": "commonjs", 也就是说 Typescript 的默认配置是将代码编译为 commonjs 的模块,而非我们在 package.json 中声明的 module (即 ES module)模块。

ts-node 在运行时会既会读取 package.json 又会读取 tsconfig.json ,而二者的配置相互冲突,于是产生了错误。

那怎么办呢?不用慌, ts-node 的 README.md 文件中已经给出了解决办法:

{
  "compilerOptions": {
    "module": "ESNext" // or ES2015, ES2020
  },
  "ts-node": {
    // Tell ts-node CLI to install the --loader automatically, explained below
    "esm": true
  }
}

非常好理解,既然 package.jsontsconfig.json 的配置相互冲突,那么让他们一致声明模块为 ESModule 不就好了吗? esm 配置表示在调用 ts-node 时自动添加 ts-node --esm 参数。

因此上面做的事情总结为:

  • 对 Typescript 声明编译目标为 ESModule
  • 对 ts-node 声明运行方法为 ts-node --esm ,将项目看作 ES-Module 模块。

注意

如果你在添加了上述配置后依然报相同的错误,是因为 Nodejs 支持 ES-Module 依然是一个实验性的功能,不稳定, 可见 ECMAScript Modules in Node.js中的一段话:

For the last few years, Node.js has been working to support running ECMAScript modules (ESM). This has been a very difficult feature to support, since the foundation of the Node.js ecosystem is built on a different module system called CommonJS (CJS).

翻译成人话就是:Node.js 底层生态都是用 CommonJS 规范写的,要支持 ESModule 改起来太TM难了。

因此有可能是 Nodejs 的新版本对相关的 API 做了调整, ts-node 还没有来得及进行适配,笔者将 Nodejs 版本从 v20.5.1 降到 v18.17.1 后不再出现错误。

转载:https://juejin.cn/post/7266663176979103800

标签:node,TypeError,模块,ESModule,ts,module,json,file
From: https://www.cnblogs.com/echohye/p/18079355

相关文章

  • Makefile学习(一)
    参看文档:《跟我一起写Makefile》Makefile的基本规则:target...:prerequisites...command......target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。prerequisites......
  • vim,gcc,gdb与Makefile的使用
    一、Linux编辑器-vim使用1.vim的基本概念vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下(1)正常/普通/命令模式(Normalmode)控制屏幕光标的移动,字符、字或行的删除,移动复制......
  • 「深入理解Java I/O:FilterInputStream」
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~前言  JavaI/O是Java编程语言的核心功能之一,提供了丰富的输入输出操作......
  • echarts实践总结(常用一):柱状图(特点:渐变色、点击缩放、左右滑动、悬浮展示样式)
    目录第一章echarts基本使用第二章echarts实践——柱状图效果展示第一章echarts基本使用Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客第二章echarts实践——柱状图最近接到这么一个需求,需要画页面,然后有这么几个echarts的图需要画,平常我们通过教程......
  • 安装"DESeq2", "edgeR", "limma", "clusterProfiler"几个R包
    安装"DESeq2","edgeR","limma","clusterProfiler"bioPackages=c("DESeq2","edgeR","limma","clusterProfiler")#设置镜像local({r<-getOption("repos");r["......
  • Linux开发:通过sendfile高效的拷贝文件数据
    如果想要将一个文件的内容拷贝到另一个文件中,常规的做法是读取源文件,然后再把内容写入到目的文件中:#include<fstream>#include<iostream>#include<string>#include<vector>usingnamespacestd;vector<string>readFile(conststring&filename){vector<stri......
  • 安装install.package("devtools")时报错 提示systemfonts,textshaping, ragg, gert依赖
    devtools可用conda,R的install.packages()以及wget等方式安装,这里我采用install.packages()安装,碰到systemfonts,textshaping,ragg,gert几个依赖包的安装错误。install.package("devtools")错误形式与解决,参考:https://www.cnblogs.com/shuaihe/p/17823059.html1.systemfonts解......
  • 发布 VectorTraits v2.0(支持 x86的Sse系列指令集等)
    目录支持x86的Sse系列指令集为Vector128/Vector256补充全部的向量方法提供CPU型号信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:ArmCPUonMacOS提供所支持的指令集信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:Arm......
  • HarmonyOS 与 ArkTS | 自定义组件
    HarmonyOS与ArkTS|自定义组件原效果:代码:@Entry@ComponentstructIndex{build(){Column(){Row(){Column(){this.ItemCard($rawfile('ic_controlcenter_eyeconfort_filled.png'))Divider().margin({top......
  • ffmpeg avformat_alloc_context System.NotSupportedException 不支持所指定的方法
    这个错误报了第二次了,网上搜不到靠谱的解决方案,赶快记录一下。第一个情况:报错如题目System.NotSupportedException不支持所指定的方法第二个情况:如果换autogen版本的话,我是用的5.1.2.3,切换到5.0或者其他版本的话,会提示avformat.59dllnotfound。这个报错根本原因是没找到对......