尝试运行 ts-node 脚本时出现未知文件扩展名".ts"错误



我正在尝试运行一个在包含两个.ts文件的常规文件夹中创建的脚本。一个带有脚本,另一个带有助手函数来运行它。我还导入了更多的东西,比如axios或表单数据。

问题是,当我尝试使用ts node:node-script.ts运行脚本时,会出现以下错误:

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

我的包.json:

{
"dependencies": {
"@types/node": "^17.0.23",
"axios": "^0.26.1",
"form-data": "^4.0.0",
"showdown": "^2.0.3",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"type": "module"
}

还有我的tsconfig.json:

{
"compilerOptions": {
"esModuleInterop": true
},
"include": ["/**/*.ts"],
"exclude": ["node_modules"]
}

我在script.ts文件中导入的是:

import { datoManagementPrimaryEnvironment } from "./content.management";
import {
createContent,
uploadToCloudfare,
getEntryFromDatoWithTheId,
getFilters,
} from "./helpers";

和在帮助者.ts:

import { datoManagementPrimaryEnvironment } from "./content.management";
import axios from "axios";
import FormData from "form-data";
var showdown = require("showdown");

有人知道我做错了什么吗?谢谢

对ts节点使用--esm开关。

例如

ts-node --esm index.ts

这要求您在tsconfig中将模块设置为一个较新的方法(如nodenextnode16(,并将moduleSolution也设置为一种较新的方式。

这对我很有效。感谢@Slava为我指明了正确的方向。

在此处链接文档。

最简单的方法是将esm:true添加到TypeScript配置文件:

{   
"$schema": "https://json.schemastore.org/tsconfig",  
"extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",  
"compilerOptions": {
// …   
},   
"include": [
// …   
],   
"ts-node": {
"esm": true, // «———— enabling ESM for ts-node   
}, 
} 

我唯一缺少的是添加"esm": true,,因为我已经为esm设置了ts配置。但如果您什么都没有,添加"$schema""extends"可能会有所帮助。

我还需要在package.json文件中添加"type": "module"

从包.json 中删除"type": "module"

并将您的tsconfig.json更改为:

{
"compilerOptions": {
"esModuleInterop": true,
"moduleResolution": "node"
},
"include": ["/**/*.ts"],
"exclude": ["node_modules"]
}

以下是如何将TypeScript与本机ESM一起使用

  1. 更新您的package.json以获得:
{
"type": "module",
// …
}
  1. 安装@tsconfig/node-lts-strictest-esm依赖项:
npm i -D @tsconfig/node-lts-strictest-esm
  1. 更新您的tsconfig.json以获得:
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",
// …
}
  1. 在TS源文件中使用扩展名为.js的导入,例如:
import { Foo } from './common/foo.js';
  1. 然后使用ts-node-esm file.ts命令而不是ts-node file.ts

这样就可以了。


此外,请参阅详细指南。

当您想使用ts节点时,应该尝试使用ts-node scripts.ts而不是node scripts.ts运行文件。

您也可以参考npmjs.com 上的使用示例

最新更新