在Next.js中,我曾经使用import UserModel from "models/UserModel"
来导入ESM模块,没有任何前缀和扩展名,例如.js
,只有refer to the document来设置jsconfig.json
中的相对路径。
但是express/fastify不支持这两个功能:
- 从项目根目录而不是
../../models/UserModel
导入 - 无扩展,尤其是在
package.json
中设置"type": "module"
时
我想可能和巴别塔有关吧?但我还不能开始。
我该怎么做才能成为下一个js?
1条答案
按热度按时间bnl4lu3b1#
你说的没错,重写或解析相对导入是运行时(Node.js)或模块捆绑器(Webpack、parcel等)的工作,Express或Fastify不附带CLI或内置捆绑器。
js不仅仅是一个库,而且还提供了一个CLI,该CLI在内部使用Webpack将多个文件捆绑成一个或多个更大的文件。
此外,仅仅使用Babel是不够的,它是一个编译器(具体来说是transpiler),但不是模块捆绑器。
这就是在您的案例中发生的情况。当Babel遇到
import UserModel from "models/UserModel"
时,它会保留import语句不变,并编译其余代码。如果您这样配置Babel,它最多可能会将ES导入转换为类似const UserModel = require('models/UserModel');
的CJSrequire
调用。因此,当您尝试执行此代码以及node.js
运行时查看您的代码时,它尝试在文件中查找UserModel
:<ROOT>/node_modules/models/UserModel.js
或<ROOT>/node_modules/models/UserModel/index.js
因此,你需要使用Webpack来实现这一点。你需要使用定制的resolve configuration,如下所示:
此外,如果您要捆绑Node.js的代码,则将target设置为
node
。