Eslint

     
*
)

JavaScript đã trở thành một ngôn ngữ rất là phổ biến đổi trong lập trình web. Sát như bất kể lập trình viên web nào thì cũng đều phải biết code JavaScript. Tuy nhiên biết là một trong chuyện, code giỏi lại là chuyện khác. Trong bài viết này, tôi sẽ reviews một mức sử dụng giúp bọn họ code JavaScript tốt hơn, đó đó là ESLint.

Bạn đang xem: Eslint

Mở đầu

Hiện nay JavaScript đã gồm những cải cách và phát triển rất xa so với các thế hệ ban đầu, khi mà số đông đặc tả ES2015 (ECMAScript năm ngoái - ES6) với ES2017 được công bố. Đặc biệt, không hề ít thư viện của JavaScript như ReactJS, AngularJS, VueJS, v.v... Giúp bạn cũng có thể xây dựng những ứng dụng web cực kì cool.

Mặc dù có những sệt tả chuyên môn như vậy, nhưng việc code JavaScript hiện thời vẫn còn không hề ít vấn đề. Vị vậy, việc đảm bảo an toàn chất lượng của code JavaScript vẫn luôn là một thách thức lớn.

Có không ít yếu tốt để tạo thành một project xuất sắc như: cấu tạo thư mục rõ ràng, README không thiếu thông tin, được đặt theo hướng dẫn mix up tương tự như build, test. Và yếu tố quan trọng nhất của một project tốt phải là code dễ dàng đọc, dễ hiểu và dễ bảo trì.

Để bảo đảm an toàn những nguyên tố đó, sức người không thể làm cho hết được. Đó là lúc chúng ta cần đến những công gắng lint.

Lint là gì?

Muốn project có code đủ giỏi thì ngay từ lúc đầu cần xây dựng các coding convention để mọi tín đồ tuân theo. Coding convention thường không giúp code chạy cấp tốc hơn, nhưng mà nó giúp duy trì code dễ nhìn đọc hơn.

Tôi đã làm qua một trong những project, và thực vụ việc dùng con người để bảo đảm coding convention là không tưởng vì các bước quá nhiều. Mà, ngay cả con bạn cũng có lúc sai sót, rất có thể bỏ qua lỗi này, lỗi kia nếu nó nhỏ dại trong thời gian review. Vì chưng vậy, việc bảo đảm coding convention bằng các công cụ tự động hóa là giỏi nhất.

Những vấn đề có tính chất cố định và thắt chặt như vậy, máy tính xách tay luôn làm tốt hơn con người. Tác dụng vừa thiết yếu xác, vừa cấp tốc chóng, những developer sẽ sở hữu thời gian rộng trong việc sáng tạo và viết code mang đến các tính năng chứ không phải đi soi mói người khác chấm phẩy đã đúng chưa. Lao lý giúp họ làm việc này hotline là các công vậy lint (linter).

Lint là những lao lý giúp bọn họ phân tích code, tự đó chuyển ra các vấn đề nhưng code đang chạm chán phải như không vâng lệnh coding style, không đúng coding convention. Quanh đó ra, lint còn hoàn toàn có thể giúp bọn họ tìm ra một vài bug tàng ẩn trong code như gán đổi thay chưa khai báo, có thể gây lỗi runtime hoặc mang giá trị từ 1 biến cục bộ khiến cho câu hỏi debug trở phải khó khăn, v.v...

Lint của thể khiến một vài tín đồ cảm thấy hoa mắt khi bắt đầu làm quen, nhưng lại nó sẽ giúp đỡ code ví dụ hơn. Dần dần, lúc trình tăng thêm rồi, lint sẽ là 1 trong trợ thử rất đắc lực.

Tại sao lại là JavaScript

Nếu bạn là một người code NodeJS thì không có gì phải tranh luận rồi. JavaScript đó là ngôn ngữ được áp dụng chủ yếu, nên bọn họ cần linter cho nó là đương nhiên.

Ở đây, tôi muốn kể đến các dự án cách tân và phát triển web khác, địa điểm mà tương đối nhiều ngôn ngữ khác nhau được sử dụng, tự backend (Ruby, PHP, Python, v.v...) cho đến frontend (HTML, JavaScript, SCSS, v.v...)

Trong một dự án, tất cả các ngôn ngữ, bao gồm cả HTML với CSS đều cần tuân theo nguyên tắc thì mới rất có thể tạo đề xuất một project giỏi được. Không có quy tắc, mọi tín đồ code theo những phong cách rất không giống nhau sẽ tạo nên một mớ hỗ độn mà người ngoài nhìn vào đang chẳng phát âm gì (thậm chí họ còn chẳng ao ước đọc).

Tuy nhiên, vào nội dung nội dung bài viết này, đề cập đến tất cả các ngôn ngữ chính là JavaScript. JavaScript hoàn toàn có thể không đề xuất là ngôn ngữ đặc trưng nhất của dự án, nhưng tôi hoàn toàn có thể chắn rằng, nó là ngôn từ cần linter nhất.

Nguyên nhân đến từ chính bạn dạng thân ngôn ngữ. JavaScript tất cả một thiết kế tồi, cú pháp của nó là sự việc pha tạp của Java và C++, lại pha trộn nhiều đặc điểm của các ngôn ngữ script như Ruby, Python.

Chưa kể, ngôn từ này được tư vấn trên những trình duyệt không giống nhau lại rất khác nhau. Mỗi trình duyệt sử dụng một engine riêng rẽ nên có không ít hàm chạy được trên trình duyệt này lại không chạy được trên trình phê chuẩn khác. Chắc hẳn ai vào số bọn họ cũng sẽ từng gặp gỡ ác mộng với internet Explorer. Để code rất có thể chạy trên nhiều trình duyệt, gần như là bắt buộc là code đã phải có những code thừa kế bên logic.

Vì sự trộn tạp trong cú pháp, JavaScript tồn tại tương đối nhiều vấn đề. Chúng ta có thể bài viết liên quan ở đây. ES2015 được ra mắt chỉ giúp làm giảm sút các sự việc của nó chứ không cần thể sa thải hoàn toàn. Chưa kể tới hiệu năng các thứ, ngay cả cú pháp của nó khiến nó hết sức "mềm dẻo". Chúng ta cũng có thể thêm lốt cách, ngắt loại tuỳ ý, để cho nó là ngôn ngữ rất có thể code theo nhiều kiểu duy nhất trong một project.

Vì vậy, lúc project tiến triển theo thời gian, code sẽ tăng dần đều lên từng ngày, từng developer lại có những phong cách, ý thích khác biệt khi code, thậm chí cùng một người mà bây giờ code một kiểu, mai lại code một kiểu, khiến cho JavaScript trở thành ngữ điệu khó đồng nhất thuộc loại hàng đầu trong một project.

Ngay cả khi đã gồm coding convention, hai tín đồ code thuộc một ngắn gọn xúc tích vẫn rất có thể cho ra số đông code trông "chẳng liên quan" gì đến nhau.

Một yếu hèn tố khiến JavaScript rất khó có thể có thể bảo trì tính thống tuyệt nhất trong giải pháp code tới từ chính nhỏ người. Phần nhiều các full stack developer mà lại tôi biết chỉ bạo dạn về backend, chúng ta có khả năng về frontend mà lại so cùng với backend thì đúng là một trời một vực. Rộng nữa, frontend lại là phần dễ bị xem nhẹ trong project, vì chưng mọi người tập trung nhiều vào performance, tối ưu code, database, v.v... Hơn.

Gần đây, độc nhất là sau sự xuất hiện của ReactJS khiến cho JavaScript ngày càng gồm vai trò quan trọng đặc biệt hơn trong dự án. Thay vị chỉ là một phần nhỏ, cung cấp vài hiệu ứng mang đến trang đẹp nhất hơn, ni JavaScript sẽ đảm nhận hoàn toàn phần "hiển thị" của trang. Tốt nhất là các dự án, phần frontend chỉ với JavaScript cùng CSS, HTML thuần số đông không còn được sử dụng.

Với những dự án công trình như vậy, việc lint JavaScript lại càng quan trọng hơn lúc nào hết.

Tại sao chọn ESLint?

Có không hề ít công chũm lint JavaScript không giống nhau: ESLint, JSLint, JSHint.

Có một bài so sánh các công cố kỉnh này, các bạn cũng có thể đọc tham khảo. Có thể tóm tắt các công nuốm như sau: JSLint vô cùng gò bó, ko cho bọn họ tuỳ chỉnh theo ý mình, JSHint thiếu các cơ chế mở rộng, JSCS thỉ thích hợp để kiểm tra coding style.

Và ở đầu cuối ESLint là phương tiện hài hoà nhất, là lựa chọn tốt nhất có thể cho các project. Nó đến phép chúng ta tuỳ chỉnh cầu hình theo coding convention của mình, kiểm tra coding style với tìm ra những bug tương tự như các sự việc tiềm ẩn khác.

ESLint lại càng là lựa chọn cực kì thích hợp nếu họ sử dụng ES2015 cũng tương tự JSX (của React). Trong số toàn bộ các linter, nó là công cụ hỗ trợ ES2015 JSX tốt nhất và là phương pháp duy nhất bây giờ hỗ trợ JSX.

Tất nhiên là nhiều tính năng hơn vậy thì đồng nghĩa với câu hỏi nó vẫn chạy chậm hơn. Vị vậy, trong một trong những dự án nó có thể không cần công cụ thích hợp nhất. Mặc dù nhiên, ý kiến cá thể của tôi là, nó tương xứng với gần hết, buộc phải cứ dùng cũng không sao đâu.

Cài đặt và thông số kỹ thuật ESLint

ESLint hoàn toàn có thể được thiết lập thông qua npm dễ dàng như sau

$ npm install --save-dev eslintKhông tuyệt nhất thiết cần code NodeJS chúng ta mới cần thực hiện node cùng npm. Tương đối nhiều dự án sẽ sử dụng các package của node nhằm build các thành phần của frontend. Nuốm nên, có lẽ tôi không nhất thiết phải nói thêm về npm nữa, nếu không rõ, các bạn có thể xem thêm ở đây.

Ngoài ra, ESLint còn mang đến phép bọn họ sử dụng những plugin nhằm mở rộng buổi giao lưu của nó. Ví dụ, tôi code ReactJS trong dự án công trình của mình, tôi đề nghị cài thêm plugin sau nhằm ESLint hoàn toàn có thể support cho nó:

$ npm install --save-dev eslint-plugin-reactMột linter tốt chỉ bao gồm thể hoạt động nếu bọn họ config nó đúng cơ mà thôi. Giả dụ không, nuốm vì ship hàng việc nâng cấp chất lượng code của chúng ta, nó lại trở thành một trở hổ ngươi khi liên tiếp đưa ra lỗi cho phần đông chỗ dở hơi.

ESLint là phương pháp rất mượt dẻo, mang lại phép bạn cũng có thể cấu hình nó rất dễ dàng dàng. Phần nhiều thứ tương quan đến coding convention đều có thể cấu hình được. Có hai phương pháp để config đến ESLint, cách đầu tiên là bình luận trực tiếp vào code JavaScript. Kiểu như vậy này:

/* eslint quotes: <"error", "double">, curly: 2 */Cách này có một điểm yếu kém là từng file, chúng ta lại đề nghị config một lần, mà đôi lúc lượng phản hồi này là rất lớn do bọn họ cần config các thứ không giống nhau trong convention. Vì vậy cách hiệu quả hơn là sử dụng một file config chung áp dụng cho tổng thể dự án. Nhưng bọn họ vẫn hoàn toàn có thể sử dụng bình luận trong một vài tệp tin nếu những file đó cần phải code khác quy tắc chung.

Xem thêm: Nghĩa Của Từ Edge Là Gì ? Nghĩa Của Từ Edge Trong Tiếng Việt

ESLint sử dụng một file config, có tên là .eslintrc.*, phần mở rộng rất có thể là js, yaml, yml, json tương xứng với format của file đó, hoặc ghi thẳng config vào file package.json.

Cá nhân tôi thích thực hiện JSON, nên tôi sẽ cấu hình ESLint trong tệp tin .eslintrc.json. Thực hiện package.json luôn cho tiện thể cũng được, nhưng bởi vậy sẽ có tác dụng file kia phình to lớn ra không buộc phải thiết, yêu cầu tôi suy nghĩ là nên dùng tệp tin riêng thì tốt hơn.

File config mang đến ESLint gồm có thành phần thiết yếu như sau:

plugins

Đây là hầu hết plugin được áp dụng để mở rộng buổi giao lưu của ESLint. Ví dụ ESLint không cung cấp kiểm tra cú pháp JSX thần thánh, thì bắt buộc bọn họ phải áp dụng plugin nhằm kiểm tra những code đó.

"plugins": < "react" >, ...extends

Đây là đều config gồm sẵn được sử dụng, bọn họ sẽ mở rộng chúng bằng phương pháp thêm vào mọi config của riêng biệt mình. ESLint có một chế độ khá hay mang đến phép bọn họ "dùng lại" thông số kỹ thuật của fan khác. Lấy một ví dụ tôi ý muốn sử dụng cấu hình có sẵn eslint:recommended (tích hòa hợp sẵn vào eslint), cùng react/recommended (tích thích hợp sẵn trong plugin) thì tôi config như sau:

... "extends": < "eslint:recommended", "plugin:react/recommended" >, ...Tương từ bỏ như vậy, chúng ta cũng có thể sử dụng thông số kỹ thuật của mọi bạn nếu họ cảm thấy phù hợp, ví dụ như strongloop chẳng hạn. Bạn cũng có thể cài đặt package tương xứng và extends nó thôi. Xem xét rằng, bọn họ nên tìm hiểu kỹ về những cấu hình có sẵn này, những khi chúng rất tiện, nhưng mà không tương xứng thì cũng không nên dùng, tất cả những thông số kỹ thuật "recommended".

rules

Đây là chính là phần config phần lớn quy tắc cơ mà code cần được tuân theo. Có rất nhiều rules đã có config sẵn khi chúng ta extends một cấu hình nào kia thì không buộc phải config lại nữa. Ở đây, chúng ta chỉ nên config thêm hầu hết rules mà họ cần tuỳ chỉnh nhưng mà thôi.

Mỗi rules cần được config hai thông số: cực hiếm ứng với khoảng độ áp dụng rules (off, warn, error hoặc 0, 1, 2 mang đến ngắn gọn) và các tuỳ chọn. Rules ngơi nghỉ đây rất có thể là rules vì ESLint hỗ trợ sẵn hoặc rules của plugin.

Ví dụ, rules sau yêu cầu vận dụng single quote " cho những string vào code, với kiểm tra bài toán import React tất cả đúng giỏi không, còn nếu như không sẽ báo lỗi với exit code là 1.

... "rules": "quotes": < 2, "single" >, "react/jsx-uses-react": 2, ... ...Lượng rules nhưng mà ESLint support là cực kỳ lớn, sát như cục bộ các nhân tố của code đầy đủ được tư vấn cả, chưa tính plugin còn mở rộng hơn nữa. Chúng ta có thể xem toàn thể rules của ESLint ở đây.

parserOptions

Mặc định, ESLint đánh giá cú pháp của ES5, nếu áp dụng ES6 hoặc các phiên phiên bản mới hơn, chúng ta phải thông số kỹ thuật bằng parserOptions. Kế bên ra, việc tư vấn JSX cũng cần được phải cấu hình ở đây. Cấu hình toàn bộ bỏ phần này như sau:

... "parserOptions": "ecmaVersion": 6, "sourceType": "module", "ecmaFeatures": "jsx": true , ...env

Đây là nơi cấu hình môi trường nhưng code của bọn họ sẽ chạy. Môi trường khác nhau thì sẽ có được những biến toàn cục khác nhau. Ví dụ, môi trường browser thì sẽ sở hữu được các vươn lên là như window, document, môi trường xung quanh es6 vẫn có một trong những loại tài liệu mới như set chẳng hạn.

... "env": "browser": true, "es6": true , ...globals

Đây là nơi chúng ta đưa ra danh sách các biến global dùng trong dự án. Ví như không, khi bọn họ truy cập vào một biến như thế nào đó, ESLint vẫn báo lỗi vì truy vấn đến một biến không được định nghĩa.

Biến global hoàn toàn có thể được quan niệm bằng phản hồi trong thiết yếu file cũng được, hoặc list tổng thể ở trong tệp tin config cũng được.

Một số vươn lên là global không đề nghị định nghĩa lại (như window, document) nếu env đã giúp định nghĩa nó rồi.

JavaScript bao gồm một object chứa tài liệu được truyền vào mang lại hàm là arguments mà không thấy môi trường xung quanh nào định nghĩa nó. Nếu như muốn sử dụng object này, họ phải chuyển nó vào trong globals của config.

... "globals": "arguments": true, ... Ngoài phần nhiều phần bao gồm như đã trình bày, ESLint còn rất nhiều config khác. Bạn xem thêm ở trên đây để biết thêm chi tiết về vấn đề tuỳ chỉnh ESLint theo như đúng ý của mình.

Example

Dưới đó là toàn bộ thông số kỹ thuật của ESLint cơ mà tôi đang áp dụng để lint code React (Redux).

"plugins": < "react" >, "extends": < "eslint:recommended", "plugin:react/recommended" >, "rules": "indent": < 2, 2, "SwitchCase": 1 >, "linebreak-style": < 2, "unix" >, "quotes": < 2, "single" >, "semi": < 2, "always" >, "curly": < 2, "all" >, "camelcase": < 2, "properties": "always" >, "eqeqeq": < 2, "smart" >, "one-var-declaration-per-line": < 2, "always" >, "new-cap": 2, "no-case-declarations": 0 , "parserOptions": "ecmaVersion": 6, "sourceType": "module", "ecmaFeatures": "jsx": true , "env": "browser": true, "es6": true , "globals": "arguments": true Áp dụng ESLint vào dự ánSau khi sẽ config mang đến ESLint hoàn thành xuôi, các bước còn lại của chúng ta là vận dụng nó vào dự án, làm cho nó chuyển động đúng như tính năng của một linter.

Trước hết, bọn họ cần thêm vào một trong những script để gọi sau này như sau (file package.json):

... "scripts": "eslint": "eslint path/to/src", ... ...Việc áp dụng script nào dựa vào vào từng project. Nếu là 1 trong project NodeJS thì bạn có thể dùng script preset hoặc posttest, nhằm ESLint được chạy tự động hóa mỗi khi call unit test. Với project web thông thường thì có thể đặt thương hiệu script làm sao để cho dễ hãy nhờ rằng được.

Sau khi bao gồm script rồi thì mỗi khi cần call ESLint, bọn họ chỉ cần solo giản:

$ npm run eslint> eslint /absolute/path/to/package> eslint --fix path/to/src/absolute/path/to/file.js 14:8 error "moment" is defined but never used no-unused-vars 163:30 error "states" is missing in props validation react/prop-types✖ 2 problems (2 errors, 0 warnings)Nếu chưa sử dụng linter lần nào, hoặc với những người dân ít gớm nghiệm, có thể mỗi lần chạy lint sẽ là 1 trong những (vài) trang screen đầy lỗi. Với những người yếu trung khu lý rất có thể bị shock và tuyệt vọng và chán nản không hy vọng code gì nữa.

Rất may với ESLint, họ đã giúp bọn họ giải quyết (một phần) vấn đề. ESLint bao gồm thể auto sửa một vài lỗi auto với cách thêm option --fix, bạn có thể thêm option này vào tức thì script ngơi nghỉ trên, hoặc call nó bằng tay

$ npm run eslint -- --fixESLint có thể sữa rất nhiều lỗi, nhưng không thể sửa hết được. Nó chỉ rất có thể sữa hầu hết code nào mà bảo vệ không tác động đến chuyển động mà thôi. Mặc dù nhiên, nó đã giúp đỡ họ rất nhiều, tối thiểu thì số lượng lỗi đã bớt đáng kể, quan sát vào sẽ thấy gồm tương lai hơn.

Nếu mong muốn một pháp luật sữa lỗi mạnh mẽ hơn, bạn có thể sử dụng prettier (tham khảo). Đây là hình thức chuyên về format code nên nó mạnh hơn ESLint trong câu hỏi sữa lỗi. Sử dụng kết hợp ESLint với prettier đã cho công dụng rất xuất sắc (dù cần yếu sữa hết 100% lỗi được).

Tự động hoá hồ hết việc

Phần trên, tôi đã trình bày cách vận dụng ESLint vào dự án, bằng phương pháp gõ lệnh mỗi lúc cần. Một ngày mà đề nghị gõ cùng một lệnh hàng chục lần thì chính xác là chán không thể tả, ít nhất là đối với tôi. Bởi vì vậy, nếu tất cả một phương thức tự động hoá mọi bài toán thì thiệt là hoàn hảo.

Sau khi tìm hiểu thì tôi đã tìm ra một cách, đó là sử dụng git hook pre-commit. Thực hiện git hook sẽ giúp họ chạy ESLint mọi khi commit. Nếu đã có lần sử dụng git hook pre-commit rồi thì bạn chỉ việc sửa file .git/hooks/pre-commit nữa là xong, còn nếu như không thì họ cần tạo ra file đó.

Cách dễ dàng nhất là sử dụng file mẫu mã cho chủ yếu git cung cấp:

$ cp .git/hooks/pre-commit.sample .git/hooks/pre-commitNội dung file sẽ sở hữu được hai loại cuối như sau:

# If there are whitespace errors, print the offending tệp tin names & fail.exec git diff-index --check --cached $against --Chúng ta đang thêm lệnh gọi ESLint như sau:

set -enpm run eslint# If there are whitespace errors, print the offending file names và fail.exec git diff-index --check --cached $against --Vậy là tiếng đây, mỗi lần commit, ESLint sẽ được gọi, trọn vẹn tự động:

$ git commit -m "WIP"> eslint /absolute/path/to/package> eslint --fix path/to/src WIP 1 tệp tin changed, 3 insertions(+), 3 deletions(-)Ngoài ra, tất cả thể bọn họ vẫn thực hiện watchify để theo dõi những biến hóa trong code và tự động hóa build lại. Mặc dù nhiên, watchify thì rất khó khăn để hotline ESLint mỗi một khi thay đổi. Giả dụ muốn, bọn họ phải đưa sang sử dụng các công cụ build khác vẻ bên ngoài như gulp hoặc grunt.

Hai luật pháp này đến phép họ tuỳ chỉnh vô cùng nhiều, chúng có cơ chế chất nhận được chạy nhiều hơn thế một task khi bao gồm file cố gắng đổi. Yếu điểm là watchify tất cả cơ chế cache khiến cho việc build code lúc có biến hóa nhanh hơn khôn xiết nhiều, áp dụng gulp xuất xắc grunt câu hỏi build code sẽ luôn luôn luôn là triển khai lại từ đầu nên mất quá nhiều thời gian hơn. (Mặc dù vậy, phương pháp cache của watchify lại chạm mặt một số vụ việc khi thêm, xoá bớt file.)

Một giải pháp khác mới nổi là webpack cũng mang đến phép họ sử dụng gọi eslint vô cùng tiện, bằng phương pháp sử dụng eslint-loader.

Việc config những điều khoản này là một vấn đề khác, nằm ngoại trừ phạm vi bài viết này yêu cầu tôi đã không trình diễn nhiều ngơi nghỉ đây. Chú ý rằng, không giống với việc áp dụng git hook, việc thực hiện những nguyên tắc này sẽ áp dụng cơ chế tự động hóa hoá với toàn cục dự án, mặc dù nó tốt nhất có thể nhưng không phải ai cũng thích điều đó. Nên nếu còn muốn áp dụng, bạn nên tìm sự thống nhất chủ kiến với các đồng nghiệp.

Xem thêm: Dịch Sang Tiếng Anh Chỉ Tiêu Tiếng Anh Là Gì : Định Nghĩa, Ví Dụ Anh Việt

Kết luận

ESLint là 1 trong những công gắng tuyệt vời, hãy thực hiện thường xuyên. Hy vọng nội dung bài viết sẽ mang lại lợi ích phần như thế nào cho các bạn và các bạn code ngày càng đẹp hơn.