我正在尝试运行一个在包含两个.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中将模块设置为一个较新的方法(如nodenext
或node16
(,并将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一起使用
- 更新您的
package.json
以获得:
{
"type": "module",
// …
}
- 安装
@tsconfig/node-lts-strictest-esm
依赖项:
npm i -D @tsconfig/node-lts-strictest-esm
- 更新您的
tsconfig.json
以获得:
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",
// …
}
- 在TS源文件中使用扩展名为
.js
的导入,例如:
import { Foo } from './common/foo.js';
- 然后使用
ts-node-esm file.ts
命令而不是ts-node file.ts
这样就可以了。
此外,请参阅详细指南。
当您想使用ts节点时,应该尝试使用ts-node scripts.ts
而不是node scripts.ts
运行文件。
您也可以参考npmjs.com 上的使用示例