如何在Node.js中使用别名进行导入

9
我有一个使用node.js v16的项目,越来越多的npm库不再与require兼容,需要使用import来代替。直到现在,我一直在使用package.json将我的根目录作为别名。
  // package.json
  "dependencies": {
    "~src": "file:.",
  }

在我的源代码中

const someCode = require('~src/absolute/path/someCode');

这个无法使用import工作,通过我的测试,我没有找到任何解决方案来使它与import一起正常工作。

你是否遇到过这种问题?并且已经找到了解决方案吗?

2个回答

12
我相信在当前版本的Node中,首选的文件夹别名方式是使用子路径导入。例如,您可以将根文件夹别名为#src(导入映射必须始终以#开头)。要这样做,请在您的package.json文件中添加以下导入部分:
"imports": {
  "#src/*": "./*.js"
}

现在假设你的包中有一个名为some/path/someCode.js的文件,你可以像这样导入它:

import someCode from '#src/some/path/someCode';

您还可以使用相同的语法映射子文件夹:

"imports": {
  "#src/*": "./*.js",
  "#somepath/*": "./some/path/*.js"
}

在导入文件中:

import someCode from '#somepath/someCode';

谢谢你的回答,明天我会试一试 :) - Poyoman
这个工作得很好。我有点失望的是 'index.js' 没有被自动管理,但似乎是由于 (https://nodejs.org/api/esm.html#mandatory-file-extensions)。 这有点离题,但你有任何想法如何强制执行自动 '.js / index.js' 管理吗? - Poyoman
我找到了一个答案 => https://dev59.com/0VoU5IYBdhLWcg3wvIqp - Poyoman
1
不幸的是,似乎没有办法使导入名称与多个文件匹配,就像require可以通过添加“.js”、“.json”、“/ index.js”等来做到的那样。 - GOTO 0

3
请注意,如果您正在使用TypeScript,则还必须更新您的tsconfig。假设您想使用@helpers/whatever而不是../../../helpers/whatever

"baseUrl": "src", # or whatever your base directory is
"paths": {
   "@helpers/*": ["helpers/*"]
},

如果你正在使用jest,你还需要更新你的jest配置

moduleNameMapper: {
    '^@helpers/(.*)$': '<rootDir>/src/helpers/$1',
},

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接