节点需要导入语句的文件扩展名

af2*_*111 12 node.js typescript es6-modules

我一直在构建一个打字稿应用程序,其中我从文件中导入了一些常量。VS Code 的自动导入为我完成了这项工作,但是当我编译并运行该文件时,它抛出了一个错误,因为它找不到该模块。似乎错误来自于导入语句没有文件扩展名,但它只出现在编译的 javascript 中,而不出现在打字稿文件中。

索引.ts:

import { __port__ } from "./constants";
import express from "express";
const app = express();
app.listen(__port__, () => console.log("listening on port" + __port__));
Run Code Online (Sandbox Code Playgroud)

常量.ts:

export const __port__ = process.env.PORT || 3000;
Run Code Online (Sandbox Code Playgroud)

Node.js 错误消息:

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/af2111/Desktop/Coding/myapp/server/dist/constants' imported from /home/af2111/Desktop/Coding/myapp/server/dist/index.js
Run Code Online (Sandbox Code Playgroud)

af2*_*111 13

我修复了它,我必须在导入语句中添加 .js 扩展名

  • 这是因为 Node.js 遵循 ES6 标准,该标准禁止解释器猜测文件扩展名。如果您想在浏览器中使用纯 JavaScript 导入,您还需要添加文件扩展名。另一方面,Typescript 是在 ES6 最终确定之前基于导入语法提案实现的,因此它们遵循猜测文件扩展名的节点模块(commonjs)行为。然而,当 ES6 标准最终发布时,真正的标准不允许这样做。Node 遵循真正的标准,而 typescript 则打破标准,因为标准还不存在 (28认同)
  • @Logan在打字稿程序中导入“.js”文件可能会感觉很奇怪,但请记住,打字稿文件在运行时由“tsc”转换为“.js”文件。 (4认同)