【问题标题】:Eslint doesn't respect jsconfig pathsEslint 不尊重 jsconfig 路径
【发布时间】:2021-12-09 18:17:25
【问题描述】:

我在 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

【问题讨论】:

    标签: javascript express eslint vscode-jsconfig


    【解决方案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 等)都位于根级别的情况。

    【讨论】:

      【解决方案2】:

      为了实现上述目的,我使用了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/*"]
      }
      

      您可以找到软件包文档并阅读有关其用法的更多信息here

      【讨论】:

      • 谢谢,但它不起作用。实际上 jsconfig.json 已经允许我拥有实际的路径别名,但 eslint 不尊重它。我也尝试过这个模块别名,但结果相同。
      • 这可能是因为您的项目结构,因为您的项目中似乎有多个目录。如果你使用 vscode,你可以在你的 repo 根目录下创建一个.vscode 文件夹,然后创建一个settings.json 文件并添加以下内容:{ "eslint.workingDirectories": ["./server", "./other-dirs-you-need-to-map"] } 你可能需要重新启动你的 IDE 才能检测到更改。跨度>
      • 你的意思是和模块别名包一起做这个吗?因为,我做到了,但没有帮助。
      • 是的,请试一试,因为这正是我设置项目的方式(虽然我只写 TS)——所以这在技术上应该可行
      • 这可能是你真正需要的,因为项目是纯 js:stackoverflow.com/a/57192652/11895568
      猜你喜欢
      • 2020-10-27
      • 2018-08-27
      • 2020-05-09
      • 2022-08-03
      • 2012-12-29
      • 2023-03-13
      • 1970-01-01
      • 2015-12-26
      • 2021-10-20
      相关资源
      最近更新 更多