NodeJS 如何启用express/fastify来支持绝对路径导入?

tjrkku2a  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(220)

在Next.js中,我曾经使用import UserModel from "models/UserModel"来导入ESM模块,没有任何前缀和扩展名,例如.js,只有refer to the document来设置jsconfig.json中的相对路径。
但是express/fastify不支持这两个功能:

  • 从项目根目录而不是../../models/UserModel导入
  • 无扩展,尤其是在package.json中设置"type": "module"

我想可能和巴别塔有关吧?但我还不能开始。
我该怎么做才能成为下一个js?

bnl4lu3b

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');的CJS require调用。因此,当您尝试执行此代码以及node.js运行时查看您的代码时,它尝试在文件中查找UserModel

  • <ROOT>/node_modules/models/UserModel.js
  • <ROOT>/node_modules/models/UserModel/index.js

因此,你需要使用Webpack来实现这一点。你需要使用定制的resolve configuration,如下所示:

// webpack.config.js
const path = require('path');

module.exports = {
  // ... other configuration
  target: "node",
  resolve: {
    alias: {
     "models/UserModel": path.resolve(__dirname, 'src/models/UserModel'),
    },
  },
};

此外,如果您要捆绑Node.js的代码,则将target设置为node

相关问题