Добавление eslint-webpack-плагина в проект для обеспечения компоновки Typescript

#webpack #eslint #typescript-eslint

#webpack #eslint #typescript-eslint

Вопрос:

Мне трудно подключить компоновщик Typescript в моем проекте Webpack.

По-видимому eslint-loader , устарело, они дают eslint-webpack-plugin в качестве альтернативы. Кроме того, я использую typescript-eslint/parser вместо tslint (устаревший) Проблема в том, что правила, которые я устанавливаю внутри моего .eslintrc.js , похоже, не учитываются. Я добавил простое правило, .eslintrc которое должно выдавать ошибку при использовании точки с запятой.

 export default class A {
  static yes = 'this is static'; // ";" <- should be invalidated by eslint
}
  

Мои зависимости:

 "@typescript-eslint/eslint-plugin": "^4.5.0",
"@typescript-eslint/parser": "^4.5.0",
"eslint": "^7.11.0",
"eslint-webpack-plugin": "^2.1.0",
"ts-loader": "^8.0.6",
"typescript": "^4.0.3",
"webpack": "^4.41.3",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0"
  

Если я правильно понимаю, это должно работать следующим образом:

                                                         # # # # # # # # # # # # # # 
@typescript-eslint/parser --> eslint-webpack-plugin --> #                         # 
      (uses eslint?)        (replaces eslint-loader)    #       webpack v4        #
                                                        #  w/ webpack-dev-server  #
       typescript         -->       ts-loader       --> #                         #
                                                        # # # # # # # # # # # # # #
  

Примечание: я использую webpack-dev-server вместо webpack-cli команды serve, которая, похоже, пока не работает с webpack v5.

Команда, которую я запускаю для запуска сервера: webpack-dev-server --hot --inline

введите описание изображения здесь


  • структура проекта:
 ./
├─── src
│    └─── index.ts
└─── dist
     ├─── bundle.js
     └─── index.html <- imports bundle.js
  
  • webpack.config.js:
 const path = require('path')
const ESLintPlugin = require('eslint-webpack-plugin')

module.exports = {
  mode: 'development',
  entry: './src/index.ts',
  devtool: 'inline-source-map',
  devServer: {
    contentBase: path.resolve(__dirname, 'dist')
    // publicPath: "/assets", // path of the served resources (js, img, fonts...)
  },
  module: {
    rules: [
      {
        test: /.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  plugins: [
    new ESLintPlugin({
      files: 'src/**/*.ts',
    })
  ],
  resolve: {
    extensions: [ '.tsx', '.ts', '.js' ],
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
}
  
  • .eslintrc.js:
 module.exports = {
  root: true,
  env: {
    node: true,
  },
  parser: '@typescript-eslint/parser',
  extends: [
    'plugin:@typescript-eslint/recommended'
  ],
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: 'module',
  },
  rules: {
    'semi': ['error', 'never'],
  },
  ignorePatterns: [ "dist/*" ],
}
  
  • tsconfig.json:
 {
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "dom",
      "dom.iterable",
    ]
  },
  "include": [
    "src/**/*.ts",
    "tests/**/*.ts",
  ],
  "exclude": [
    "node_modules"
  ]
}
  

Ответ №1:

Я столкнулся с аналогичной проблемой при попытке использовать файлы eslint-webpack-plugin with .vue .

Мое решение состояло в том, чтобы использовать extensions настройку вместо files . Попробуйте это:

 new ESLintPlugin({
  extensions: ['ts']
})
  

Комментарии:

1. Также было бы полезно ознакомиться с документацией , в которой описаны все параметры eslint-webpack-plugin , в которой говорится: options.extensions (string[] | null) For example, when passing the src/ directory and extensions is [".js", ".ts"], ESLint will lint *.js and *.ts files in src/. If extensions is null, ESLint checks *.js files and files that match overrides[].files patterns in your configuration. Note: This option only applies when you pass directory paths to the eslint.lintFiles() method.

Ответ №2:

Я исправил это, и мой текущий объект параметров ESLintPlugin выглядит следующим образом:

 const lintJSOptions = {
  context: path.join(paths.context, paths.js),
  extensions: ['js', 'ts'],
  emitError: true,
  emitWarning: true,
  failOnWarning: false,
  failOnError: false,
  // Toggle autofix
  fix: false,
  cache: false,

  formatter: require('eslint-friendly-formatter'),
};
  

Надеюсь, это поможет.

PD: context свойство — это корневое расположение ваших файлов * .js или * .ts относительно вашего package.json файла, которое вы можете использовать path.resolve(__dirname, './src/scripts'); или где бы вы ни хранили свои скрипты.

Ответ №3:

Я столкнулся с той же проблемой при попытке настроить slit с помощью Webpack. Я решил это, используя переопределение конфигурации внутри Webpack

 plugins: [
    new ESLintPlugin({
      files: 'src/**/*.ts',
      "overrideConfig": {
        "extends": "eslint:recommended",
        "rules": { }
      }
    })
  ],
  

Вы можете найти его здесь, в официальной документации eslint
https://eslint.org/docs/latest/developer-guide/nodejs-api#-new-eslintoptions