我有一个使用node.js v16的项目,越来越多的npm库不再兼容require,需要与import一起使用。
到目前为止,我一直在使用 package.json 将我的根目录作为别名
// package.json
"dependencies": {
"~src": "file:.",
}
在我的源代码中
const someCode = require('~src/absolute/path/someCode');
这不适用于导入,并且通过我所做的测试,我还没有找到任何解决方案使其适用于导入。
您已经遇到过这样的问题吗?并找到了解决方案?
我相信在当前版本的 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';
请注意,如果您使用打字稿,您还必须更新您的 tsconfig。假设您想使用
@helpers/whatever
而不是 ../../../helpers/whatever
"baseUrl": "src", # or whatever your base directory is
"paths": {
"@helpers/*": ["helpers/*"]
},
如果您使用 jest,您还需要更新您的 jest 配置
moduleNameMapper: {
'^@helpers/(.*)$': '<rootDir>/src/helpers/$1',
},
安装模块别名
npm install module-alias
并在入口文件中导入模块别名/寄存器(位于所有代码行的顶部,即第一行)。
require('module-alias/register')
要在代码编辑、自动建议、引用、自动导入等时检测别名,我们必须配置 jsconfig,如果该文件不存在则自行创建。您可以根据您的项目使用路径,我没有 src 文件夹,所以我有直接使用路径,如下面所示,您可以在代码中提到 src 时添加前缀 src/ 。 jsconfig.json
{
"compilerOptions": {
...
"allowJs": true,
"moduleResolution": "node",
"baseUrl": ".",
"paths": {
"@/*": ["*"],
"@constants/*": ["constants/*"],
"@router/*": ["router/*"],
"@utility/*": ["utility/*"],
"@config/*": ["config/*"],
"@middleware/*": ["middleware/*"],
"@controllers/*": ["api/controllers/*"],
"@routes/*": ["api/routes/*"],
"@services/*": ["api/services/*"],
"@models/*": ["api/models/*"],
}
},
}
对于运行时导入解析,我们必须在package.json中添加别名,这允许nodes js真正成功地找到并执行代码 包.json:
{
...
"_moduleAliases": {
"@": ".",
"@constants": "constants",
"@router": "router",
"@utility": "utility",
"@config": "config",
"@middleware": "middleware",
"@controllers": "api/controllers",
"@routes": "api/routes",
"@services": "api/services",
"@models": "api/models"
},
...