1

我在 monorepo 中有我的 express.js 项目。我想为其添加自定义路径别名。目录结构为:

./
server/
----> jsconfig.json
----> .eslintrc.js
----> src/
--------> index.js
--------> modules/auth
-------------> auth.controller.js

jsconfig.json

{
  "compilerOptions": {
    "module": "ES6",
    "baseUrl": "./",
    "paths": {
      "@modules/*": [
        "src/modules/*"
      ]
    }
  },
  "exclude": ["node_modules"]
}

.eslintrc.js

module.exports = {
  env: {
    es2021: true,
    node: true,
  },
  extends: [
    'airbnb-base',
  ],
  parserOptions: {
    ecmaVersion: 12,
    sourceType: 'module',
  },
  rules: {
    'no-console': 'error',
    'no-debugger': 'error',
  },
  settings: {
    'import/resolver': {
      alias: {
        map: [
          ['@modules/*', 'src/modules/*'],
        ],
        extensions: ['.js', '.json'],
      },
    },
  },
};

简单地说,我只是尝试在我的 index.js 文件中导入身份验证控制器。

import authRoutes from '@modules/auth/auth.routes';

但我收到以下错误:Unable to resolve path to module '@modules/auth/auth.controller' .eslint import/no-unresolved

请不要建议关闭规则。我已经尝试过eslint-import-resolver-jsconfig了,但我得到了Cannot resolve jsConfig, SyntaxError } on 150

4

2 回答 2

1

因为我使用了monorepo,所以ESLint甚至lint-staged都有问题。所以现在我每个存储库只有一个项目,并且:

  1. 在中添加了自定义路径jsconfig.json
"paths": {
      "@modules/*": [
        "./src/modules/*"
      ]
    }
  1. 安装eslint-import-resolver-jsconfig并将以下配置添加到eslint.json
"extends": [
    "airbnb-base",
    "eslint:recommended"
  ],
 "plugins": ["import"],
 "settings": {
    "import/resolver": {
      "jsconfig": {
        "config": "jsconfig.json"
      }
    }
  }
  1. 安装了 Babel 插件babel-plugin-module-resolver并将以下设置添加到.babelrc
 "plugins": [
    [
      "module-resolver",
      {
        "alias": {
          "@modules": "./src/modules"
        }
      }
    ]
  ]

但是,同样:这仅适用于每个存储库有一个项目并且所有配置文件(.*rcpackage.json等)都位于根级别的情况。

于 2021-10-31T08:21:30.570 回答
0

为了实现上述我使用module-alias包。

将其作为正常依赖项安装后npm i --save module-alias,将以下内容添加到您的package.json:

"_moduleAliases": {
  "@modules": "./src/modules"
}

这基本上将为您要定义的所有别名定义映射。

为了使它工作,您现在需要在您的应用程序顶部导入以下内容index.js

require("module-alias/register"); // If using commonJS
// or
import "module-alias/register"; // If transpiling es6

您现在已准备就绪,应该能够使用绝对路径导入文件,如下所示:

const authRoutes = require("@modules/auth/auth.routes")
// or
import authRoutes from "@modules/auth/auth.routes";

如果eslint仍然标记未解析的路径,您可能需要更新您的jsconfig.jsontsconfig.json包含以下内容:

"paths": {
   "@modules/*": ["src/modules/*"]
}

您可以在此处找到包文档并阅读有关其用法的更多信息。

于 2021-10-23T12:54:40.743 回答