这是我如何构建和安装node.js(版本:20.11):
./configure --prefix=/home/tester/node
make -j8
make install
这是我设置环境的方法:
export PATH=/home/tester/node/bin:$PATH
export NODE_PATH=/home/tester/node/lib/node_modules
这是我安装要导入的模块的方法:
npm install -g express
/tmp/test/package.json的内容:
{
"description": "Test me",
"type": "module"
}
/tmp/test/test.js 的内容:
import express from 'express'
这是我执行 test.js 的方式:
node /tmp/test/test.js
这是我执行 test.js 时发生的情况:
node:internal/process/esm_loader:34
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'express' imported from /tmp/test/test.js
Did you mean to import express/index.js?
如果我只是删除 package.json 中的行
"type": "module"
,并将 import express from 'express'
更改为 const express = require('express')
,那么它就可以工作。那么仅仅使用import
有什么问题呢?我是 Node.js 新手,不知道如何解决这个问题。请有人帮助我,非常感谢!
对于
import
的工作方式,这是 NodeJS 团队有意采取的行动。它背后有一段历史,但它源于很久以前做出的决定,即 ESM 导入将在 TypeScript 早期自动解析索引文件和扩展(很像 require
)。
使用 NodeJS ESM 导入(不是 TypeScript ESM 导入)时,您必须指定文件名以及扩展名。
具体而言,他们没有在 JSON 包中指定任何信息来帮助支持 ESM 导入,也不打算将其代码库从 CommonJS 重构为 ESM。
如果您足够关心深入了解有关 NodeJS 和express
的一些对话,最近在
此 GitHub 问题上提出了这一点