ค้นหาเว็บไซต์

javascript - ts-node TypeError [ERR_UNKNOWN_FILE_EXTENSION]: นามสกุลไฟล์ไม่รู้จัก ".ts"


ฉันกำลังใช้ ts-node แต่มันทำให้ฉันเจอข้อผิดพลาดนี้:

ts-node index.ts

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /home/projects/node-hddds8/index.ts

ฉันพยายามจะลบ "type": "module" ออกจาก package.json ของฉัน แต่ในกรณีนั้นฉันจะได้ข้อผิดพลาดที่แตกต่างออกไป:

ts-node index.ts

(node:45) 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)
/home/projects/node-hddds8/index.ts:1
import chalk from 'chalk';
^^^^^^

SyntaxError: Cannot use import statement outside a module

นี่คือลิงก์สำหรับทำซ้ำบน StackBlitz: https://stackblitz.com/edit/node-hddds8?file=index.ts

ไฟล์ package.json ของฉันมีลักษณะดังนี้:

{
  "name": "node-starter",
  "version": "0.0.0",
  "type": "module",
  "dependencies": {
    "chalk": "^5.0.1",
    "ts-node": "^10.8.1",
    "typescript": "^4.7.4"
  }
}

และไฟล์ tsconfig.json ของฉันมีหน้าตาแบบนี้:

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "Node",
  }
}

และ index.ts ของฉันดูเหมือนนี้:

import chalk from 'chalk';

console.log(chalk.blue('Hello world!'));

คำตอบ #1

เนื่องจากคุณมี "type": "module" ใน package.json ของคุณ คุณกำลังใช้โมดูล ESM ดังนั้นคุณจึงต้องเพิ่มสิ่งนี้ลงใน tsconfig.json ของคุณ:

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

คำตอบ #2

แม้ว่าวิธีแก้ปัญหาด้วย ts-node-esm หรือการเพิ่ม esm: true ในตัวเลือก ts-node ใน tsconfig จะใช้งานได้กับเวอร์ชัน node "เก่า" แต่กับ node >= 20 วิธีนี้จะล้มเหลวอีกครั้งพร้อมกับ ERR_UNKNOWN_FILE_EXTENSION

วิธีแก้ปัญหาคือการใช้ node --loader ตามที่อธิบายในปัญหานี้:

node --no-warnings=ExperimentalWarning --loader ts-node/esm file.ts

บทความที่เกี่ยวข้อง