如何强制 Node 中的 TypeScript 在导入 ES6 模块时不需要 .js 扩展名?

Edw*_*uay 10 node.js typescript es6-modules

我有一个使用 TypeScript 设置的 Node API,工作正常。

但是,要导入 ES6 扩展,.js即使文件是.ts.

使用.ts扩展名或在导入行中省略扩展名会导致错误:

CustomError: Cannot find module 'C:\.....\src\models'
Run Code Online (Sandbox Code Playgroud)

server.ts

import express from 'express';
import dotenv from 'dotenv';
import { user } from './models.js';

dotenv.config();

const app = express();
const PORT = process.env.PORT || 3049;

app.get('/', (req: express.Request, res: express.Response) => {
    res.send(user);
});

app.listen(PORT, () => {
    console.log(`listening on port http://localhost:${PORT}`);
});
Run Code Online (Sandbox Code Playgroud)

models.ts

import { IUser } from './interfaces.js';

export const user: IUser = {
    firstName: "Hendrick",
    lastName: "Denzmann",
    accessGroups: ['loggedInUsers', 'members']
};
Run Code Online (Sandbox Code Playgroud)

我使用以下命令启动我的应用程序package.json:

"scripts": {
    "dev": "nodemon"
},
Run Code Online (Sandbox Code Playgroud)

这是我的配置文件:

nodemon.json

{
    "watch": [""],
    "ext": "ts",
    "exec": "./node_modules/.bin/ts-node-esm src/server.ts"
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
    "compilerOptions": {
        "target": "es6",
        "allowSyntheticDefaultImports": true,
        "moduleResolution": "node",
        "module": "esnext",
        "outDir": "build"
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要更改什么才能导入不带扩展名的 ES6 模块,如下所示:import { user } from './models';?

小智 12

您需要告诉节点二进制文件停止需要扩展。目前,这是通过一个实验性标志 来完成的--experimental-specifier-resolution=node。然后你可以用作ts-node加载程序。

exec基本上,只需将您的部分更改nodemon.json为:

{
  "watch": [""],
  "ext": "ts",
  "exec": "node --experimental-specifier-resolution=node --loader ts-node/esm src/server.ts"
}
Run Code Online (Sandbox Code Playgroud)