Объявление плагинов babel для @babel/eslint-анализатора в .eslintrc

#javascript #plugins #babeljs #eslint

#javascript #Плагины #babeljs #eslint

Вопрос:

Я уже некоторое время пытаюсь заставить @babel/plugin-proposal-class-properties плагин нормально работать с @babel/eslint-parser и eslint без успеха.

Это мой .eslintrc.js :

 ...
  "parser": "@babel/eslint-parser",
  "parserOptions": {
    "ecmaVersion": 11,
    "requireConfigFile": false,
  },
  "plugins": [
    "@babel",
  ],
...
  

И это связанные установленные пакеты:

  -- @babel/core@7.11.1
 -- @babel/eslint-parser@7.11.3
 -- @babel/eslint-plugin@7.11.3
 -- @babel/plugin-proposal-class-properties@7.10.4
 -- eslint@7.7.0
  

При такой конфигурации ошибка ESLint с этим сообщением:

 Parsing error: egexample.js: Support for the experimental syntax 'classPrivateProperties' isn't currently enabled (xx:yy): (Fatal)
  

Но если я добавлю @babel/plugin-proposal-class-properties в plugins в .eslintrc.js вот так:

   "plugins": [
    "@babel",
    "@babel/plugin-proposal-class-properties",
  ],
  

Я получаю эту ошибку:

 Error while running ESLint: Failed to load plugin '@babel/plugin-proposal-class-properties' declared in '.eslintrc.js': Cannot find module '@babel/eslint-plugin-plugin-proposal-class-properties'.
  

Похоже, что это неправильный способ объявления плагинов для @babel/eslint-parser в .eslintrc.js . Тем не менее, я подозреваю, что это возможно благодаря этой цитате здесь:

@babel/eslint-parser также поддерживается применение конфигурации Babel через вашу конфигурацию ESLint.

Итак, мой вопрос:

Действительно ли возможно объявить плагины babel в .eslintrc ? Если да, то как именно?

Ответ №1:

На самом деле это проще, чем я думал…

Итак, получается, что, поскольку @babel/plugin-proposal-class-properties это плагин babel, он должен быть объявлен в plugins свойстве конфигурации babel. Согласно документации @babel/eslint-parser , они могут быть переданы с babelOptions свойством.

Поэтому это действительно так просто, как это:

 ...
  "parserOptions": {
    ...
    "babelOptions": {
      "plugins": [
        "@babel/plugin-proposal-class-properties",
        ...
      ],
    },
  },
  "plugins": [
    "@babel",
  ],
...
  

Ответ №2:

При использовании @babel/eslint-parser в качестве eslintrc parser я тоже столкнулся с этим вопросом.

Точно так же, как этот вопрос.

Например, eslintrc используемый eslint node api в глобальном cli, и cli предоставляет команду A .

После перейдите в каталог B , выполнив команду A .Это process.cwd() каталог B , но @babel/xxx deps находится в node_modules командной строки. babel/core Не удается найти плагины в B .

 Parsing error: Cannot find module '@babel/plugin-proposal-decorators'nRequire stack:
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/core/lib/config/files/plugins.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/core/lib/config/files/index.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/core/lib/index.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/eslint-parser/lib/worker/babel-core.cjs
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/eslint-parser/lib/worker/handle-message.cjs
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/eslint-parser/lib/client.cjs
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@babel/eslint-parser/lib/index.cjs
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@eslint/eslintrc/lib/config-array-factory.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/@eslint/eslintrc/lib/index.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/eslint/lib/cli-engine/cli-engine.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/eslint/lib/cli-engine/index.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/eslint/lib/api.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/node_modules/test-a-es-checker/dist/index.js
- /Users/a1/.nvm/versions/node/v14.16.1/lib/node_modules/test-a-cli/dist/index.js

  

Я решил эту проблему, предоставив cwd для babelOption в eslintrc.

 module.exports = {
  ...
  parser: '@babel/eslint-parser',
  babelOptions: {
    cwd: __dirname, // The working directory that all paths in the programmatic options will be resolved relative to.
    presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
    plugins: [
      ['@babel/plugin-proposal-decorators', { legacy: true }],
      ['@babel/plugin-proposal-class-properties', { loose: true }],
    ],
  },
  ...
};