6

Неизвестное расширение файла ".ts" для файла TypeScript

12

Проблема запуска приложения на Heroku с использованием TypeScript

Я пытаюсь запустить свое приложение на Heroku, но получаю следующую трассировку стека. Это простое приложение на TypeScript, которое я использую с ts-node и nodemon.

Вот вывод ошибок, который я получаю:

2020-05-30T00:03:12.201106+00:00 heroku[web.1]: Starting process with command `npm start`
2020-05-30T00:03:14.405285+00:00 app[web.1]: 
2020-05-30T00:03:14.405303+00:00 app[web.1]: > [email protected] start /app
2020-05-30T00:03:14.405303+00:00 app[web.1]: > ts-node src/App.ts
2020-05-30T00:03:14.833655+00:00 app[web.1]: (node:23) ExperimentalWarning: The ESM module loader is experimental.
2020-05-30T00:03:14.839311+00:00 app[web.1]: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/App.ts
2020-05-30T00:03:14.847801+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-05-30T00:03:14.848957+00:00 app[web.1]: npm ERR! [email protected] start: `ts-node src/App.ts`
2020-05-30T00:03:14.849050+00:00 app[web.1]: npm ERR! Exit status 1
2020-05-30T00:03:14.849254+00:00 app[web.1]: npm ERR! Failed at the [email protected] start script.

Информация о проекте

Вот содержимое моего файла package.json:

{
   "name": "discordtoornamentmanager",
   "version": "1.0.0",
   "main": "dist/app.js",
   "type": "module",
   "scripts": {
      "dev": "nodemon -x ts-node src/App.ts",
      "start": "ts-node src/App.ts"
   },
   "dependencies": {
      "@types/node": "^14.0.5",
      "axios": "^0.19.2",
      "discord.js": "^12.2.0",
      "pg": "^8.2.1",
      "reflect-metadata": "^0.1.10",
      "typeorm": "0.2.25",
      "typescript": "^3.9.3",
      "nodemon": "^2.0.4",
      "ts-node": "8.10.1"
   }
}

И вот мой файл tsconfig.json:

{
   "compilerOptions": {
      "lib": [
         "es6"
      ],
      "target": "es6",
      "module": "commonjs",
      "moduleResolution": "node",
      "outDir": "dist",
      "resolveJsonModule": true,
      "emitDecoratorMetadata": true,
      "esModuleInterop": true,
      "experimentalDecorators": true,
      "sourceMap": true
   },
   "include": ["src/**/*.ts"],
   "exclude": ["node_modules", "**/*.spec.ts"]
}

Вопрос

Как я могу решить проблему с ошибкой Unknown file extension ".ts" при запуске приложения на Heroku? Мне действительно интересно узнать, в чем может быть проблема и как ее решить.

5 ответ(ов)

8

На мой взгляд, этот ответ - лучший. https://stackoverflow.com/a/74608156/12894626

Кратко: После многократных попыток заставить ts-node работать, просто используйте tsx, который работает исправно из коробки.

npm i -D tsx
npx tsx src/index.ts

npm: https://www.npmjs.com/package/tsx

  • На момент написания у него 400k загрузок в неделю, и это число растёт.
5

Если вы не хотите удалять "type": "module" из вашего package.json (например, если вы используете операторы import в ваших .ts файлах, что позволяет делать вывод типов из модулей), вы можете воспользоваться следующим вариантом в вашем tsconfig.json:

{
  "compilerOptions": {
    "esModuleInterop": true
  }
}

После этого вы сможете запустить сервер с использованием этого конфигурационного файла через ts-node.

Установите ts-node, если он у вас еще не установлен:

npm install -g ts-node

Запустите ваш сервер с помощью:

ts-node-esm my_server.ts

Это позволит вам работать с модулями в TypeScript без необходимости удалять "type": "module" из package.json.

2

Чтобы запустить ваш TypeScript скрипт с использованием ES-модулей, вы можете использовать одну из следующих команд:

node --loader ts-node/esm ./my-script.ts

или

ts-node --esm ./my-script.ts

Вместо использования команды:

ts-node ./my-script.ts

Команда с --esm или --loader ts-node/esm необходима для работы с ES-модулями, поскольку обычный запуск ts-node ./my-script.ts может не поддерживать их должным образом.

0

Удаление "type": "module" из package.json и добавление следующего в tsconfig.json:

"compilerOptions": {
  "module": "CommonJS"
}

помогло мне решить эту проблему.

0

Решение первое

  1. Удалите "type": "module" из файла package.json, если он был добавлен.
  2. В файле tsconfig.json в разделе compilerOptions установите свойство module в значение CommonJS: module: "CommonJS" и moduleResolution: "Node".

Решение второе

Если первое решение не сработало, или по какой-то причине вам нужно оставить module: "ESNext":
  1. Добавьте "type": "module" в файл package.json.
  2. Установите ts-node: npm i -g ts-node.
  3. Откройте tsconfig.json и добавьте следующее:
{
    "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "Node",
        /* ... ваши свойства ... */
    },
    "ts-node": {
        "esm": true
    }
}
  1. Запустите файл с помощью команды ts-node fileName.ts.
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь