Victor Gunnarsson
Victor Gunnarsson

Reputation: 320

ERR_MODULE_NOT_FOUND if no .js extension

I have a typescript project where I get the ERROR_MODULE_NOT_FOUND 'path/to/compiled/file' when I try to run my compiled app.js file with node. However, I get rid of this error if I add a .js extension to the import statement in my app.js like this import { function } from "./path/file.js"; How do I get the typescript compiler to automatically add these .js extensions? Alternatively, get node to work without the .js extensions?

My tsconfig.json looks like this:

{
    "compilerOptions": {
        "module": "esnext",
        "target": "es5",
        "noImplicitReturns": true,
        "noUnusedLocals": true,
        "outDir": "dist",
        "sourceMap": true,
        "moduleResolution": "node",
        "esModuleInterop": true,
        "isolatedModules": true,
        "resolveJsonModule": true,
        "typeRoots": ["./src/types", "node_modules/@types"],
        "baseUrl": "./src",
        "paths": {
            "types": ["types"],
            "types/*": ["types/*"],
            "@data/*": ["data/*"],
            "@execute/*": ["execute/*"],
            "@indicators/*": ["indicators/*"],
            "@services/*": ["services/*"],
            "@strategies/*": ["strategies/*"],
            "*": ["node_modules/*"]
        }
    },
    "compileOnSave": true,
    "include": ["src", "test", "dist"],
    "exlude": ["src/types"]
}

My app.ts looks like this:

import { function } from "./path/file";

function();
console.log("test");

export {};

Upvotes: 7

Views: 2483

Answers (3)

John
John

Reputation: 276

When using ESNext, you need to specify full path with the extension.

Upvotes: 0

nobody
nobody

Reputation: 33

I have got the same error. The ending ".js" in the typescript project looks weird, but without it does not work when I tried to start the app like that:

"start": "node ."

If you add --experimental-specifier-resolution=node then it will work. I am not sure whether it is a good practice to add something "experimental" to the app, but you can use it as a temporary solution.

"start": "node --experimental-specifier-resolution=node ."

Also, the node v18 is warning you: ExperimentalWarning:

The Node.js specifier resolution flag is experimental. It could change or be removed at any time

Upvotes: 1

Guilherme Dellagustin
Guilherme Dellagustin

Reputation: 83

I was having the exact same issue while trying to setup a new typescript project on node.

What solved it for me at the end was replacing esnext by commonjs on the module option.

I had previously used esnext because of a top-level await, but worked that around by wrapping the await with an async function.

I cannot explain why the compiled javascript imports with esnext does not have the .js extension, or how to tweak the compiler to add this extension for local modules that will also be compiled.

Upvotes: 3

Related Questions