Tóm Tắt
Sử dụng ESLint
ESLint giúp gợi ý code, gợi ý sửa code, giúp code của chúng ta sẽ cùng
một chuẩn, nhìn đẹp hơn.
Dùng ESLint để thống nhất style trong dự án có nhiều thành viên cùng
phát triển:
- Indent bằng 4 space
- Indent khi break câu lệnh, thẻ là 4 space
- Có dấu cách sau dấu
{
và trước dấu}
nếu
viết trên một dòng - Mỗi file nhỏ hơn 500 dòng
- …
Cài đặt
Khởi tạo dự án mới:
npm init -y
Cài Node package:
npm install --save-dev eslint
Khởi tạo trong một dự án cụ thể:
npx eslint --init
Nó sẽ hỏi một số câu như dự án chạy ở đâu, dùng Vue hay React,… giúp
tạo một file .eslintrc.json
có các cấu hình căn bản ban
đầu, cũng như cài thêm các gói cần thiết.
Bạn nên chọn extend cấu hình từ “standard” ở package là eslint-config-standard
.
Package eslint-config-standard
lại phụ thuộc các package:
eslint-plugin-promise
eslint-plugin-import
eslint-plugin-node
Package eslint-config-standard không hỗ trợ eslint version 8. Chuyển
sang sử dụng package eslint-config-google.
Bạn cũng nên extend cấu hình “plugin:vue/essential” ở package eslint-plugin-vue
.
Ví dụ:
$ npx eslint --init You can also run this command directly using 'npm init @eslint/config'. ✔ How would you like to use ESLint? · style ✔ What type of modules does your project use? · esm ✔ Which framework does your project use? · vue ✔ Does your project use TypeScript? · No / Yes ✔ Where does your code run? · browser ✔ How would you like to define a style for your project? · guide ✔ Which style guide do you want to follow? · google ✔ What format do you want your config file to be in? · JSON Checking peerDependencies of eslint-config-google@latest The config that you've selected requires the following dependencies: eslint-plugin-vue@latest eslint-config-google@latest eslint@>=5.16.0 ✔ Would you like to install them now with npm? · No / Yes Installing eslint-plugin-vue@latest, eslint-config-google@latest, eslint@>=5.16.0 added 7 packages, and audited 90 packages in 2s 14 packages are looking for funding run `npm fund` for details found 0 vulnerabilities Successfully created .eslintrc.json file in <path>
Cài đặt nhanh (bước Checking peerDependencies of
chạy khá là lâu):
eslint-config-standard@latest
npm install --save-dev eslint eslint-config-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node eslint-plugin-vue
Về bản chất, chúng ta cần 3 package sau:
"devDependencies": { "eslint": "^8.13.0", "eslint-config-google": "^0.14.0", "eslint-plugin-vue": "^8.6.0" }
Thêm script vào file package.json
:
"scripts": { "lint": "eslint --fix --ext .js,.vue resources/js" }
Để kiểm tra, chúng ta có thể chạy lệnh sau:
npm run lint
Hoặc:
npx eslint --ext .js,.vue resources/js
Cấu hình
Tên file là .eslintrc
, định dạng js
, json
,
yml
. Nên sử dụng định dạng js
vì có thể
comment, sử dụng biểu thức.
File .eslintrc.json
có các cấu hình sau:
env
Đây là nơi cấu hình môi trường mà code của chúng ta sẽ chạy. Môi trường
khác nhau thì sẽ có những biến toàn cục khác nhau. Ví dụ, môi trường
browser thì sẽ có các biến như window
, document
;
môi trường ES6 sẽ có một số loại dữ liệu mới như Set chẳng hạn.
"env": { "browser": true, "es2021": true }
parserOptions
Mặc định, ESLint kiểm tra cú pháp của ES5. Nếu sử dụng ES6 hoặc các
phiên bản mới hơn, chúng ta phải cấu hình bằng parserOptions
.
Cấu hình toàn bộ cho phần này như sau:
"parserOptions": { "ecmaVersion": 12, "sourceType": "module" }
plugins
Đây là những plugin được sử dụng để mở rộng hoạt động của ESLint. Ví dụ
để hỗ trợ Vue template:
"plugins": [ "vue" ]
globals
Đây là nơi chúng ta đưa ra danh sách các biến global dùng trong dự án.
Nếu không, khi chúng ta truy cập vào một biến nào đó, ESLint sẽ báo lỗi
vì truy cập đến một biến chưa được định nghĩa.
"globals": { "Vue": "readonly", "Vuex": "readonly", "VueRouter": "readonly", "axios": "readonly", "Highcharts": "readonly", "$": "readonly", "ExcelJS": "readonly", "moment": "readonly" }
extends
Đây là những config có sẵn được sử dụng, chúng ta sẽ mở rộng chúng bằng
cách thêm vào những config của riêng mình.
Mặc định, tất cả các rule đều không được enable. Chúng ta extends từ
các tập luật được enable phổ biến để đỡ phải định nghĩa nhiều.
"extends": [ "plugin:vue/essential", "standard" ]
rules
Đây là chính là phần config những quy tắc mà code cần phải tuân theo.
Có nhiều rule đã được config sẵn khi chúng ta extends một cấu hình nào
đó thì không cần config lại nữa. Ở đây, chúng ta chỉ cần config thêm
những rule mà chúng ta cần tuỳ chỉnh mà thôi.
Rule ở đây có thể là rule do ESLint cung cấp sẵn hoặc rule của plugin.
Mỗi rule cần được config hai thông số: giá trị ứng với mức độ áp dụng
rules (off
, warn
, error
hoặc 0
,
1
, 2
cho ngắn gọn) và các tuỳ chọn.
Ví dụ, rule sau yêu cầu áp dụng dấu nháy đơn (single quote) '
cho các xâu trong code:
"rules": { "quotes": ["error", "single"] }
Lượng rule mà ESLint support là rất lớn, gần như toàn bộ các yếu tố của
code đều được support cả, chưa kể plugin còn mở rộng hơn nữa.
Ví dụ
Sau đây là toàn bộ cấu hình của ESLint mà tôi sử dụng trong dự án Vue.
{ "env": { "browser": true, "es2021": true }, "parserOptions": { "ecmaVersion": 12, "sourceType": "module" }, "plugins": [ "vue" ], "globals": { "Vue": "readonly", "Vuex": "readonly", "VueRouter": "readonly", "axios": "readonly", "Highcharts": "readonly", "$": "readonly", "ExcelJS": "readonly", "moment": "readonly", "CV": "readonly", "noti": "readonly", "Pagi": "readonly", "SSO_CONSUMER_DOMAIN": "readonly", "SSO_PASSPORT_URL": "readonly", }, "extends": [ "plugin:vue/essential", "standard" ], "rules": { "semi": ["error", "always"], "indent": ["error", 4], "space-before-function-paren": ["error", { "anonymous": "always", "named": "never", "asyncArrow": "always" }], "eqeqeq": "off", "no-new": "off", "no-multiple-empty-lines": "off", "operator-linebreak": ["error", "before"], "vue/require-v-for-key": "off", "vue/require-valid-default-prop": "off" } }
Đánh dấu không kiểm tra file
Để không kiểm tra một file nào đó, thêm dòng sau vào đầu của file:
/* eslint-disable */
Danh sách luật
List of
available rules – ESLint
Không luật nào được enable mặc định. Cấu hình "extends":
trong file cấu hình sẽ enable các luật
"eslint:recommended"
chung chung mà được đánh dấu icon check.
Tùy chọn --fix
trong câu lệnh sẽ tự động fix các lỗi đơn
giản mà được đánh dấu icon là cái cờ lê.
Escape dấu cách trong đường dẫn trên Windows
Khi thực hiện lệnh eslint trên đường dẫn mà có dấu cách trên hệ điều
hành Windows có thể bị lỗi No files matching the pattern
.
Ví dụ đánh lệnh sau sẽ lỗi:
npx eslint --fix "posts/ui - carousel"
Chúng ta cần escape như sau:
npx eslint --fix \"posts/ui - carousel\"
Tự động fix trong VSCode
Cài extension cho VSCode:
ESLint – Visual Studio Marketplace
Bạn có thể sử dụng lệnh trong VSCode để fix các bug có thể tự động của
file hiện tại.
Ngoài ra, thêm file .vscode/settings.json
như sau để tự
động format, lint khi lưu file:
{ "[javascript]": { "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll.eslint": true } },
"[typescript]": { "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.organizeImports": false } } "[vue]": { "editor.defaultFormatter": "octref.vetur", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": true } }, "vetur.format.defaultFormatter.html": "js-beautify-html", "vetur.format.defaultFormatterOptions": { "js-beautify-html": { "wrap_attributes": "force" } }, "vetur.format.defaultFormatter.js": "none", "vetur.format.options.tabSize": 4 }
Tham khảo
Hãy sử dụng ESLint cho dự án của bạn! – Viblo
Getting
Started with ESLint – ESLint
Configuring
ESLint – ESLint
Command
Line Interface – ESLint