Skip to content

ERR_UNKNOWN_FILE_EXTENSION on Node v20.0.0 #1997

Closed as not planned
Closed as not planned

Description

@septs

Search Terms

Node, ERR_UNKNOWN_FILE_EXTENSION

Expected Behavior

Fix it

Actual Behavior

see Minimal reproduction

Steps to reproduce the problem

see Minimal reproduction

Minimal reproduction

$ cat example.ts
console.log('example')
$ cat tsconfig.json
{ "ts-node": { "esm": true } }
$ npx ts-node example.ts
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /Users/septs/Projects/example/example.ts
    at new NodeError (node:internal/errors:399:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:99:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:139:38)
    at defaultLoad (node:internal/modules/esm/load:83:20)
    at nextLoad (node:internal/modules/esm/hooks:781:28)
    at load (/Users/septs/.npm/_npx/1bf7c3c15bf47d04/node_modules/ts-node/dist/child/child-loader.js:19:122)
    at nextLoad (node:internal/modules/esm/hooks:781:28)
    at Hooks.load (node:internal/modules/esm/hooks:381:26)
    at handleMessage (node:internal/modules/esm/worker:153:24)
    at checkForMessages (node:internal/modules/esm/worker:102:28) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}

Specifications

  • ts-node version: 10.9.1

  • node version: 20.0.0

  • TypeScript version: 5.0

  • tsconfig.json:

    { "ts-node": { "esm": true } }
  • package.json:

    {}
  • Operating system and version: macOS 13.3.1

Activity

  1. septs commented on Apr 20, 2023

    @septs
    Author

    microsoft/TypeScript#53922


    Edited by 11/18/2023

    Use tsx replace ts-node?

    Or use ts-node@beta?

    more see https://github.com/privatenumber/tsx, #2077

  2. csvn commented on Apr 20, 2023

    @csvn

    I have the same issue. I tried using --esm, { "esm": true } and --loader="ts-node/register", but got the ERR_UNKNOWN_FILE_EXTENSION no matter what I tried. Could not get ts-node to run on Node v20 with native ESM modules.

  3. Jack-Works commented on Apr 21, 2023

    @Jack-Works

    FYI Node 20 has made a breaking change:

    Custom ESM loader hooks run on dedicated thread
    ESM hooks supplied via loaders (--experimental-loader=foo.mjs) now run in a dedicated thread, isolated from the main thread. This provides a separate scope for loaders and ensures no cross-contamination between loaders and application code.

    https://nodejs.org/en/blog/release/v20.0.0

  4. RobinTail commented on Apr 21, 2023

    @RobinTail

    +1

    The issue also appears when using the specially dedicated ESM runner

    $ ts-node-esm file.ts
    
  5. added a commit that references this issue on Apr 22, 2023
  6. neurolag commented on Apr 22, 2023

    @neurolag

    I went forward and downgraded my node version to lts.
    However, doing node --loader ts-node/esm {file} did work for me.

  7. wibed commented on Apr 23, 2023

    @wibed

    i expirience the same issue on:

    # node --version
    v18.16.0

    EDIT:
    my bad, i misinterpreted the gravity of the situation. manually enforcing the loader like this.

    {
      "start": "npm run clean && cross-env NODE_ENV=development NODE_OPTIONS=\"--loader=ts-node/esm --trace-warnings\" webpack serve --mode=development --config webpack.config.ts",
    }

    worked out.

    example sourced from here:
    webpack/webpack-cli#2458

  8. RandivCosta commented on Apr 29, 2023

    @RandivCosta

    i expirience the same issue on: Node v20,
    I tried: $ node --loader ts-node/esm ./path
    It worked for me but getting this warnning:
    ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time

  9. sywesk commented on May 4, 2023

    @sywesk

    I'd like to add quickly that on windows (at least), doing node --loader ts-node/esm ./path works but with an insanely high CPU usage. Doing a quick npx tsc + node ./build/app.js works perfectly without the performance issue.

  10. RobinTail commented on May 6, 2023

    @RobinTail

    Yes, node --no-warnings=ExperimentalWarning --loader ts-node/esm file.ts helps to bypass the issue until it's fixed.

  11. Aenigma commented on May 6, 2023

    @Aenigma

    yeah, I recently upgraded to node 20 and started running with the --loader ts-node/esm parameter but noticed that my memory usage in my application had skyrocketed to 32G before it would die from OOM. I went chasing for a cause because I assumed it was due to a change I made, but downgrading to node 19 lowered memory usage down to around 500M again. I assume this is probably related to the CPU issues @sywesk had.

    So I'd recommend people stay off Node 20 until this is fixed if you don't want to have unexpected issues in your runtime.

  12. added a commit that references this issue on May 14, 2023
  13. 211 remaining items

  14. TopchetoEU commented on Oct 29, 2024

    @TopchetoEU

    @TopchetoEU tsx isn't a full replacement and doesn't have type checks, I'm a bit sceptical about their development model privatenumber/tsx#671 . Not even accepting contributions without a donation?

    good point, but at least it still works with ESM.

  15. ItsHarper commented on Nov 1, 2024

    @ItsHarper

    tsimp is great in theory, but it's extremely buggy, and can produce non-obviously stale results from because of caching bugs. tsc --noEmit && tsx is the way for now.

  16. the94air commented on Nov 4, 2024

    @the94air

    ts-watch seems not affected with these breaking changes in node 20. I haven't tested it with bigger projects yet.

  17. bennycode commented on Nov 28, 2024

    @bennycode

    I created a video summarizing how to run ts-node with ESM on Node 20+: https://www.youtube.com/watch?v=-7dNs1ggKRs

    The tsx tool is the recommended alternative (mentioned by @blakeembrey in #2140).

  18. imawizrd commented on Nov 28, 2024

    @imawizrd

    Showcase of the problem:

    demo.mp4

    Here's all the loaders webpack supports

    [webpack-cli] Unable load '/repo/folder/webpack.config.ts'
    [webpack-clil Unable to use specified module loaders for " .ts".
    [webpack-clil Cannot find module 'ts-node/register' from '/repo/folder'
    [webpack-cli] Cannot find module 'sucrase/register/ts' from '/repo/folder'
    [webpack-clil Cannot find module '@babel/register' from '/repo/folder'
    [webpack-cli] Cannot find module 'esbuild-register/dist/node' from /repo/folder'
    [webpack-clil Cannot find module '@swc/register' from '/repo/folder'
    [webpack-clil Please install one of them
    

    Webpack will check them in that order, mind you. So even if you have sucrase installed for example you have to manually uninstall ts-node before webpack automatically picks sucrase as loader.

    So I just did (I use Yarn package manager, if you use NPM translate these commands to their equivalent)

    yarn remove ts-node

    and then

    yarn add -D sucrase

    No more configuration is needed (I don't have "type": "module" option in package.json, if you have it you may need additional configuration) and I can run webpack --config ./webpack.config.ts without any flags or workarounds.

    Another thing, if you do not have "type": "module" option in package.json, the Webpack loader compiles the typescript config to commonJS, so you must use __dirname and __filename instead of import.meta.url if you need it, but you probably already know that.

    ts-node is a great project and it has served me well over the years, so I'm sorry to have to remove it from my project. Please give all the support you can give to ts-node if you value it as I do.

  19. wes992 commented on Dec 13, 2024

    @wes992

    I created a video summarizing how to run ts-node with ESM on Node 20+: https://www.youtube.com/watch?v=-7dNs1ggKRs

    The tsx tool is the recommended alternative (mentioned by @blakeembrey in #2140).

    This worked for me. By far the best solution I have come across. :)

  20. felipecrs commented on Dec 13, 2024

    @felipecrs

    Well, if there's anything positive out of it, I hope it somehow incentivize people to try a better runtime like Deno or Bun.

  21. TopchetoEU commented on Dec 13, 2024

    @TopchetoEU

    Well, if there's anything positive out of it, I hope it somehow incentivize people to try a better runtime like Deno or Bun.

    unfortunately, sometimes you don't get to pick your runtime, and you're forced to use NodeJS, despite your best wishes.

  22. dandv commented on Dec 14, 2024

    @dandv

    I've switched to Deno, but there are still some rough edges, especially when it comes to testing:

    1. There are no IDEs with full test support. Neither WebStorm nor the VS Code Deno plugin support BDD tests.
    2. expect toMatchObject does not do a diff between the objects to show the mismatched keys (Jest does, but it comes with its own TypeScript problems)

    Also, there's no interop with ESLint rules, and Deno's built-in linting is just not up to par with typescript-eslint.

  23. shinebayar-g commented on Dec 14, 2024

    @shinebayar-g

    Deno is still buggy... Bun too... Those nasty bugs are so annoying to find out later in the production..
    Ironically with native ESM support in NodeJS, ts-node may start work again lol.

  24. lexandera commented on Jan 6, 2025

    @lexandera

    What has been working for me for a long time - and continues to work on node 22 - is the following:

    node --experimental-specifier-resolution=node --loader ts-node/esm/transpile-only file.ts

    Even though --experimental-specifier-resolution has been removed by nodejs it continues to work with ts-node because it appears to contain loader code copied from an older nodejs version (see the "ts-node/raw" dir) and this switch activates a code path that is capable of loading .ts files in ESM mode.

  25. gofugui commented on May 21, 2025

    @gofugui

    package.json add "type": "module",

  26. resistdesign commented on Dec 23, 2025

    @resistdesign

    Ok so TSX going forward then?

  27. felipecrs commented on Dec 23, 2025

    @felipecrs

    If you don't need type checking, yeah. But nowadays even Node.js supports running most Typescript files.

  28. neurolag commented on Dec 23, 2025

    @neurolag
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions