Kami port proyek Angular pada ESLint, dengan Prettier, Husky dan bertahap-bertahap

Halo, Habr! Nama saya Bogdan, saya bekerja di tim PIC Digital Front-End. Kami sedang mengembangkan sebagian besar proyek di Angular, dan baru-baru ini saya memutuskan untuk meninjau panduan gaya kami, serta menambahkan alat baru untuk pekerjaan yang lebih nyaman.

Sebagai linter, saya memutuskan untuk menggunakan ESLint, karena mereka berencana untuk mentransfer Angular ke sana segera. Dan dalam artikel ini saya ingin berbagi petunjuk tentang beralih dari TSLint ke ESLint, dan pada saat yang sama memberi tahu cara menjalankan Prettier dari ESLint, cara menambahkan aturan panduan gaya AirBnB, dan cara membuat linting nyaman dan tidak terlihat dengan mengatur VS Code dan kait Git.

Lebih cantik & ESLint


ESLint adalah alat untuk analisis kode statis, aturan dibagi menjadi dua kelompok:

  • Pemformatan - untuk membawa kode ke satu tampilan: panjang garis, koma, titik koma, dll.
  • Kualitas kode - mencari templat kode yang bermasalah: kode yang tidak perlu, kesalahan.

Prettier adalah alat pemformatan kode otomatis.

Pertanyaan yang menarik bagi saya adalah: mengapa menggunakan Prettier jika ESLint juga dapat memformat kode?

Jawabannya sederhana - Format format kode jauh lebih baik: menghapus semua pemformatan dan sepenuhnya menulis ulang kode dalam satu gaya. Ini memungkinkan pengembang untuk melupakan pemformatan kode dan tidak membuang waktu mendiskusikan gaya kode untuk ditinjau. Misalnya, kami memiliki baris kode yang panjang:

gambar

Jika kami mencoba mengubah pemformatan melalui ESLint, itu hanya akan memberi kami kesalahan:

eslint example.ts --fix

output:
error    This line has a length of 97. Maximum allowed is 80

Contoh seperti itu menunjukkan bahwa linter tidak selalu dapat membantu dengan pemformatan kode, dan pengembang dapat memformat kode ini dengan cara yang berbeda, berdasarkan pertimbangan pribadi mereka.

Jika kami menyimpan atau memformat file dengan Prettier, baris tersebut akan mengambil bentuk:

gambar

Prettier memberikan gaya seragam di seluruh basis kode. Oleh karena itu, ia dapat dan harus digunakan bersama dengan ESLint, tetapi Anda harus mengonfigurasinya agar tidak saling mengganggu.

Penyiapan ESLint


Inti dari linting menggunakan ESLint adalah dalam parser yang mengubah kode menjadi AST (Abstract Syntax Tree) untuk pemrosesan perangkat lunak lebih lanjut, dan plugins yang berisi aturan, misalnya, aturan yang disarankan untuk linting TypeScript atau aturan panduan kode AirBnB.

Instalasi


Untuk memigrasikan aplikasi Angular ke ESLint, kami memerlukan dependensi berikut:


Untuk menginstalnya, jalankan perintah:

ng add @angular-eslint/schematics

Pada saat penulisan, typescript-eslint dan angular-eslint tidak memiliki semua yang setara dengan aturan dalam konfigurasi standar Codelyzer untuk TSLint, tetapi sebagian besar sudah ada. Anda dapat memantau keadaan saat mentransfer aturan dari TSLint ke ESLint di mono-repositori ESLint Angular dan TypeScript ESLint .

Konfigurasi konfigurasi


Semua yang kita butuhkan untuk aplikasi Sudut, kami instal. Sekarang mari kita beralih ke mengkonfigurasi ESLint. Mari kita buat file .eslintrc.js dan tambahkan pengaturan yang disarankan untuk Angular ESLint:

module.exports = {
  extends: ['plugin:@angular-eslint/recommended'],
  rules: {
    '@angular-eslint/directive-selector': [
      'error',
      { type: 'attribute', prefix: 'app', style: 'camelCase' },
    ],
    '@angular-eslint/component-selector': [
      'error',
      { type: 'element', prefix: 'app', style: 'kebab-case' },
    ],
  },
  overrides: [
    //   ,       *.component.ts
    {
      files: ['*.component.ts'],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      plugins: ['@angular-eslint/template'],
      processor: '@angular-eslint/template/extract-inline-html',
    },
  ],
};

Konfigurasi dapat dijelaskan dalam berbagai format: file JavaScript, JSON atau YAML. Anda dapat meninggalkan komentar dalam JavaScript.

“Plugin: @ angular-eslint / recommended” berisi pengaturan untuk 3 plugin sekaligus: “@ typescript-eslint / eslint-plugin”, “@ angular-eslint / eslint-plugin” dan “@ angular-eslint / eslint-plugin-templat-templat " Anda dapat membaca aturan apa yang dia tetapkan di sini .

Perbarui perintah lint


Juga dalam konfigurasi angular.json, Anda perlu memperbarui perintah ng lint untuk menjalankan @ angular-eslint / builder :

"lint": {
  "builder": "@angular-eslint/builder:lint",
  "options": {
    "eslintConfig": ".eslintrc.js",
    "tsConfig": [
      "tsconfig.app.json",
      "tsconfig.spec.json",
      "e2e/tsconfig.json"
    ],
    "exclude": [
      "**/node_modules/**"
    ]
  }
},

Setup ESLint dasar sudah siap, sekarang Anda dapat memulai ESLint dengan perintah standar lint .

Pasang plugin tambahan


Untuk menginstal plugin untuk ESLint, misalnya, untuk tes unit linting di Angular, Anda perlu mengunduh dan menambahkan plugin Jasmine ke pengaturan :

npm install eslint-plugin-jasmine --save-dev

Dan tambahkan blok pengaturan baru untuk file dengan ekstensi * .spec.ts ke properti "override":

overrides: [
  ...,
  {
    files: ['src/**/*.spec.ts', 'src/**/*.d.ts'],
    parserOptions: {
      project: './src/tsconfig.spec.json',
    },
    //   
    extends: ['plugin:jasmine/recommended'],
    //    
    plugins: ['jasmine'],
    env: { jasmine: true },
    //   'no-unused-vars'
    rules: {
      '@typescript-eslint/no-unused-vars': 'off',
    },
  }
],

Secara analogi, Anda dapat menambahkan plugin lain untuk ekstensi file yang berbeda.

Menambahkan Panduan Panduan Gaya


Untuk mencapai konsistensi yang lebih besar dari basis kode, Anda dapat memilih dan menambahkan aturan dari salah satu panduan gaya populer ke konfigurasi ESLint:

  • AirBnB : Yang paling populer dan paling ketat di antara ketiganya, koma trailing dan titik koma wajib.
  • Google : mirip dengan AirBnB dalam hal memformat, tetapi kurang wajib, komentar JSDoc wajib.
  • StandartJS : melarang penggunaan tanda koma dan titik koma.

Pilih panduan gaya yang lebih cocok untuk tim Anda. Anda dapat bergantian mencoba semua panduan gaya pada beberapa proyek besar, melihat kesalahan apa yang dihasilkan oleh linter dan berdasarkan hal ini membuat pilihan.

Pilih implementasi panduan gaya TypeScript karena aturan JavaScript mungkin tidak berfungsi dengan benar pada TypeScript.

Sebagai contoh, mari tambahkan panduan gaya AirBnB ke konfigurasi ESLint kami. Untuk melakukan ini, instal konfigurasi dengan aturan AirBnB untuk TypeScript dan plugin dengan aturan untuk bekerja dengan sintaks impor / ekspor:

npm install eslint-plugin-import eslint-config-airbnb-typescript --save-dev

Agar tidak mengubah pengaturan tingkat atas, kami akan membuat blok aturan baru di properti "override" dengan aturan panduan gaya AirBnB dan parser TypeScript yang diperlukan untuk pekerjaan mereka:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
    },
  ]
}

Untuk menambahkan panduan gaya lain, Anda perlu menginstal seperangkat aturan untuk TypeScript, membuat blok aturan baru di "menimpa" dengan aturan panduan gaya dan menentukan parser yang diperlukan untuk pekerjaan mereka.

Aturan penyesuaian


Jika Anda ingin menonaktifkan atau mendefinisikan kembali beberapa aturan dengan gaya panduan, Anda bisa melakukan ini di properti "aturan":

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      //  
      rules: {
        'import/no-unresolved': 'off',
        'import/prefer-default-export': 'off',
        'class-methods-use-this': 'off',
        'lines-between-class-members': 'off',
        '@typescript-eslint/unbound-method': [
          'error',
          {
            ignoreStatic: true,
          },
        ],
      },
    },
  ]
}


Konfigurasikan Lebih cantik


Untuk menambahkan Prettier ke konfigurasi kita, kita perlu menginstal Prettier itu sendiri, sebuah plugin dengan aturan Prettier, serta konfigurasi yang akan menonaktifkan semua aturan yang mungkin bertentangan dengan Prettier:

npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

Dalam "menimpa" di blok dengan aturan file dengan ekstensi * .t di properti "meluas" di bagian paling bawah tambahkan aturan dan pengaturan Lebih cantik:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        //   AirBnB
	'airbnb-typescript/base',
	//   Prettier
	'prettier/@typescript-eslint',
	'plugin:prettier/recommended',
      ],
      ...,
    },
  ]
}

Konfigurasi untuk Prettier harus selalu di bagian paling bawah daftar untuk menimpa aturan yang mungkin bertentangan dengan Prettier.

`prettier / @ typescript-eslint` menonaktifkan aturan` @ typescript-eslint`, yang mungkin bertentangan dengan Prettier, dan `plugin: prettier / recommended` melakukan tiga hal:

  • termasuk eslint-plugin-prettier,
  • mencetak kesalahan aturan yang lebih cantik / lebih cantik ke konsol sebagai "kesalahan",
  • Menambahkan aturan pemformatan eslint-config-prettier yang lebih cantik.

Config for Prettier:


Prettier dapat memformat kode tanpa pengaturan apa pun, tetapi untuk mencocokkan panduan gaya AirBnB, Anda perlu menambahkan beberapa pengaturan. Buat file .prettierrc.js di root aplikasi:

module.exports = {
  trailingComma: "all",
  tabWidth: 2,
  semi: true,
  singleQuote: true,
  bracketSpacing: true,
  printWidth: 100
};

Pengaturan ini akan digunakan oleh ESLint dan Prettier jika Anda menggunakannya untuk memformat file dalam VS Code atau dengan perintah:

prettier "--write ."

Konfigurasikan Kode VS


Kode VS dapat menyoroti dan memperbaiki kesalahan yang ditemukan ESLint saat menyimpan kesalahan. Untuk melakukan ini, unduh plugin ESLint untuk VS Code dan buat file di dalam proyek dengan pengaturan untuk workspace .vscode / settings.json:

  "eslint.validate": [ "javascript", "typescript", "html"],

  "eslint.options": {
    "extensions": [".js", ".ts", "html"]
  },

  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
  },

Di sini kita mengkonfigurasi ESLint untuk menekankan dan memperbaiki kesalahan saat menyimpan file dengan ekstensi .js, .ts, dan .html.

Dan untuk memformat dokumen dengan kombinasi tombol "shift + option + F" atau "shift + alt + F", unduh plugin Prettier untuk VS Code dan tetapkan sebagai formatter default.

Menyiapkan kait git


Git hooks adalah skrip yang dipanggil Git pada acara tertentu: komit, dorong, terima.

Dengan bantuan mereka, kita dapat mulai membohongi kode ketika membuat komit sehingga lebih sedikit kesalahan masuk ke kumpulan permintaan. Untuk pekerjaan yang lebih mudah dengan kait Git, instal Husky , dan untuk memeriksa hanya kode yang ditambahkan ke komit (ini berguna dalam proyek-proyek besar di mana linting membutuhkan banyak waktu) lint-bertahap :

npm i husky lint-staged --save-dev

Tambahkan pengaturan untuk plugin ini ke package.json:

"scripts": {
  ...
},
"husky": {
  "hooks": {
    "pre-commit": "lint-staged --relative"
  }
},
"lint-staged": {
  "*.{js,ts}": [
     "eslint --fix"
  ]
},

lint-staged meneruskan larik file yang dimodifikasi ke perintah yang dipanggil. Perintah ng lint tidak tahu bagaimana cara menerima array file, dan untuk menggunakannya, Anda perlu menulis script handler tambahan. Atau Anda bisa memanggil ESLint, seperti dalam contoh ini. Solusi semacam itu dapat digunakan untuk precommits, dan Anda dapat menjalankan ng lint untuk menyelesaikan seluruh proyek, misalnya, dalam pipa CI.

temuan


Dalam versi Angular yang akan datang, ESLint dengan aturan dasar akan keluar dari kotak. Sekarang proses konfigurasi ESLint memerlukan beberapa langkah tambahan, ESLint tidak memiliki padanan untuk beberapa aturan dari TSLint, dan Angular ESLint masih dalam versi alpha. Karenanya, untuk beralih ke ESLint sekarang atau tidak, itu terserah Anda.

Namun, kode panduan, aturan tambahan, Prettier, Husky, dan serat-bertahap Anda harus mengkonfigurasi sendiri. Saya harap artikel ini telah membantu Anda mengetahui bagaimana semua hal ini bekerja bersama.

Mengkonfigurasi linter mungkin tampak seperti tugas sepele, tetapi mencakup beberapa masalah organisasi penting: memilih panduan gaya, menyinkronkan berbagai solusi satu sama lain.

Tetapi waktu yang dihabiskan untuk mengkonfigurasi linter di masa depan akan secara signifikan menghemat waktu Anda mendiskusikan gaya dan format kode dalam proses peninjauan kode, mengurangi jumlah kesalahan yang masuk ke kumpulan permintaan, dan memastikan konsistensi basis kode.

Contoh implementasi dapat ditemukan di Github .

Jika Anda menemukan kesalahan dalam konfigurasi, atau Anda memiliki pengaya - tulis!

Referensi



All Articles