Неизвестное расширение файла ".ts" для файла TypeScript
Проблема запуска приложения на 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 ответ(ов)
На мой взгляд, этот ответ - лучший. 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 загрузок в неделю, и это число растёт.
Если вы не хотите удалять "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
.
Чтобы запустить ваш 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
может не поддерживать их должным образом.
Удаление "type": "module"
из package.json
и добавление следующего в tsconfig.json
:
"compilerOptions": {
"module": "CommonJS"
}
помогло мне решить эту проблему.
Решение первое
- Удалите
"type": "module"
из файла package.json, если он был добавлен. - В файле
tsconfig.json
в разделеcompilerOptions
установите свойствоmodule
в значение CommonJS:module: "CommonJS"
иmoduleResolution: "Node"
.
Решение второе
Если первое решение не сработало, или по какой-то причине вам нужно оставить module: "ESNext"
:
- Добавьте
"type": "module"
в файл package.json. - Установите ts-node:
npm i -g ts-node
. - Откройте
tsconfig.json
и добавьте следующее:
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "Node",
/* ... ваши свойства ... */
},
"ts-node": {
"esm": true
}
}
- Запустите файл с помощью команды
ts-node fileName.ts
.
Как узнать версию установленного npm пакета?
Как задать переменные окружения из файла package.json?
TypeScript ошибка TS2304: не удается найти имя 'require'
Как запустить файлы TypeScript из командной строки?
Что делает npm install --legacy-peer-deps? Когда рекомендуется использовать и какой потенциальный случай?