首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块-如果从特定文件调用,则不使用esm的别名。

模块-如果从特定文件调用,则不使用esm的别名。
EN

Stack Overflow用户
提问于 2022-03-06 13:56:24
回答 1查看 774关注 0票数 0

我想在esm中使用模块别名。我已经找到了答案,这里。问题是,我正在手动使用它,如下所示:

代码语言:javascript
复制
import * as path from 'path';
import * as moduleAlias from 'module-alias';
moduleAlias.addAlias('@', path.join(process.cwd(), 'dist', 'server'));

如果它不是由module-alias/register直接调用的,而是从这段代码中调用的,那么如何修复它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-18 22:29:22

我解决了问题。要做到这一点,我只是停止使用模块别名,这是一个过时的npm包(截至19/07/2022年,它已失效3年),并且只对公共as模块解析有用。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
node --no-warnings --loader=./custom-loader.mjs myscript.js

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71370901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档