如果从特定文件调用,则模块别名不适用于esm



我想在esm中使用模块别名。我已经在这里找到了答案。问题是我手动使用它,就像这样:

import * as path from 'path';
import * as moduleAlias from 'module-alias';
moduleAlias.addAlias('@', path.join(process.cwd(), 'dist', 'server'));

如果它不是由module-alias/register直接调用的,而是由该代码调用的,我该如何修复它?

我解决了这个问题。要做到这一点,我只是停止使用模块别名,这是一个过时的npm包(截至2022年7月19日,该包已停用3年(,仅对commonjs模块解析有用。

引用这个github错误的正确答案,解决方案是创建一个文件custom-loader.mjs,并在调用节点时将其添加为加载程序

import path from 'node:path';
export default function loadAliases(aliasesToAdd) {
const getAliases = () => {
const base = process.cwd();
const absoluteAliases = Object.keys(aliasesToAdd).reduce((acc, key) =>
aliasesToAdd[key][0] === '/'
? acc
: { ...acc, [key]: path.join(base, aliasesToAdd[key]) },
aliasesToAdd)
return absoluteAliases;
}
const isAliasInSpecifier = (path, alias) => {
return path.indexOf(alias) === 0
&& (path.length === alias.length || path[alias.length] === '/')
}
const aliases = getAliases();
return (specifier, parentModuleURL, defaultResolve) => {
const alias = Object.keys(aliases).find((key) => isAliasInSpecifier(specifier, key));
const newSpecifier = alias === undefined
? specifier
: path.join(aliases[alias], specifier.substr(alias.length));
return defaultResolve(newSpecifier, parentModuleURL);
}
}
export const resolve = loadAliases({
"@": "./dist/source",
"@src": "./dist/source",
"@test": "./dist/test"
});

然后,在调用脚本时,添加--loader=./custom-loader.mjs

node --no-warnings --loader=./custom-loader.mjs myscript.js

更新:我创建这个npm模块是为了自动处理这个问题。

最新更新