Tôi nên sử dụng xác thực JavaScript của JSLint hay JSHint? [đóng cửa]


454

Tôi hiện đang xác thực JavaScript của mình chống lại JSLint và đạt được tiến bộ, nó hỗ trợ tôi viết JavaScript tốt hơn - đặc biệt là khi làm việc với thư viện Jquery.

Bây giờ tôi đã bắt gặp JSHint , một nhánh của JSLint .
Vì vậy, tôi tự hỏi các ứng dụng web, vốn được sử dụng rất nhiều JavaScript, đây là công cụ xác thực tốt hơn hoặc phù hợp nhất để hoạt động:

  • JSLint hay JSHint?

Tôi muốn quyết định ngay bây giờ về cơ chế xác nhận và tiến lên phía trước, sử dụng điều này để xác thực phía máy khách.

Và sự khác biệt giữa jshint và jslint? Hãy giải thích trong ví dụ javascript duy nhất.

Liên kết:

  1. jshint - http://www.jshint.com/

  2. jslint - http://jslint.com/


4
Làm thế nào về ESLint ? Mặc dù nó không hoàn hảo: Combine this with the previous 'var' statement-> Do not mix 'require' and other declarations, nghịch lý.
nyuszika7h


7
Dưới đây là một so sánh
ma11hew28

Không phải là nhà phát triển JS. Nhưng tôi thấy JSHint rất hữu ích trong quá trình xem xét mã của chúng tôi. Tôi khuyến khích điều đó.
Chetan Vashistth

Câu trả lời:


156

[EDIT]
Câu trả lời này đã được chỉnh sửa. Tôi sẽ để lại câu trả lời ban đầu bên dưới cho ngữ cảnh (nếu không các bình luận sẽ không có ý nghĩa).

Khi câu hỏi này ban đầu được hỏi, JSLint là công cụ linting chính cho JavaScript. JSHint là một nhánh mới của JSLint, nhưng chưa chuyển hướng nhiều so với bản gốc.

Kể từ đó, JSLint vẫn còn khá nhiều động tĩnh, trong khi JSHint đã thay đổi rất nhiều - nó đã vứt bỏ nhiều quy tắc đối kháng hơn của JSLint, đã thêm vào toàn bộ các quy tắc mới và nói chung trở nên linh hoạt hơn. Ngoài ra, một công cụ khác của ESLint hiện đã có sẵn, nó thậm chí còn linh hoạt hơn và có nhiều tùy chọn quy tắc hơn.

Trong câu trả lời ban đầu của tôi, tôi đã nói rằng bạn không nên ép buộc bản thân tuân thủ các quy tắc của JSLint; miễn là bạn hiểu lý do tại sao nó lại đưa ra cảnh báo, bạn có thể tự đưa ra phán quyết về việc có nên thay đổi mã để giải quyết cảnh báo hay không.

Với bộ quy tắc cực kỳ nghiêm ngặt của JSLint từ năm 2011, đây là lời khuyên hợp lý - tôi đã thấy rất ít bộ mã JavaScript có thể vượt qua bài kiểm tra JSLint. Tuy nhiên, với các quy tắc thực dụng hơn có sẵn trong các công cụ JSHint và ESLint ngày nay, việc đưa mã của bạn đi qua chúng với các cảnh báo bằng không là một đề xuất thực tế hơn nhiều.

Thỉnh thoảng vẫn có thể có trường hợp một kẻ nói dối sẽ phàn nàn về điều gì đó mà bạn đã cố ý - ví dụ, bạn biết rằng bạn nên luôn luôn sử dụng ===nhưng chỉ một lần này bạn có lý do chính đáng để sử dụng ==. Nhưng ngay cả khi đó, với ESLint, bạn có tùy chọn chỉ định eslint-disablexung quanh dòng đang đề cập để bạn vẫn có thể có bài kiểm tra vượt qua với các cảnh báo bằng không, với phần còn lại của mã tuân theo quy tắc. (đừng làm điều đó quá thường xuyên!)


[SAU TRẢ LỜI SAU]

Bằng mọi cách hãy sử dụng JSLint. Nhưng đừng để bị treo lên về kết quả và sửa chữa mọi thứ mà nó cảnh báo. Nó sẽ giúp bạn cải thiện mã của mình và nó sẽ giúp bạn tìm ra các lỗi tiềm ẩn, nhưng không phải mọi thứ mà JSLint phàn nàn về việc hóa ra lại là một vấn đề thực sự, vì vậy đừng cảm thấy như bạn phải hoàn thành quy trình với các cảnh báo bằng không.

Khá nhiều mã Javascript với độ dài hoặc độ phức tạp đáng kể sẽ tạo ra các cảnh báo trong JSLint, bất kể nó được viết tốt như thế nào. Nếu bạn không tin tôi, hãy thử chạy một số thư viện phổ biến như JQuery thông qua nó.

Một số cảnh báo của JSLint có giá trị hơn các cảnh báo khác: tìm hiểu xem cái nào cần chú ý và cái nào ít quan trọng hơn. Mọi cảnh báo nên được xem xét, nhưng không cảm thấy bắt buộc phải sửa mã của bạn để xóa bất kỳ cảnh báo nào; Hoàn toàn ổn khi xem mã và quyết định bạn hài lòng với nó; có những lúc mà những thứ mà JSlint không thích thực sự là điều đúng đắn.


3
Phần tốt nhất của jsHint là nó có cờ chấp nhận jQuery và không gây khó chịu / nghiêm ngặt như jslint. Ví dụ: for (i = 0; i < dontEnumsLength; i++)ném Unexpected '++'ở đâu cũng được. v.v.
RaphaelDDL

2
Xin vui lòng, đừng bỏ qua các quy tắc, đây là điều tồi tệ nhất mà bạn có thể làm với kẻ nói dối. Chỉ cần thiết lập nó, hoặc nếu bạn không thể làm điều đó, thay đổi. Sự kết hợp giữa JSHint và JSCS thật tuyệt vời
AuthorProxy

JSHint nói "Dự kiến ​​một lệnh gọi hoặc hàm gọi và thay vào đó đã thấy một biểu thức." đến một ternary chỉ được sử dụng cho các hoạt động. Tài liệu của Mozilla: cho biết "Bạn cũng có thể sử dụng các đánh giá tạm thời trong không gian trống để thực hiện các hoạt động khác nhau". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ mẹo @AuthorProxy Tôi sẽ đến Mozilla và bỏ qua JSHint. Lấy làm tiếc.
sương

1
Cho đến nay, có vẻ như ESLint là hướng đi của ngành công nghiệp, cùng với các cấu hình phổ biến như airbnb.
jinglểula

369

tl; dr takeaway :

Nếu bạn đang tìm kiếm một tiêu chuẩn rất cao cho bản thân hoặc nhóm, thì JSLint. Nhưng nó không nhất thiết là tiêu chuẩn, chỉ là tiêu chuẩn, một số trong đó đến với chúng ta một cách giáo điều từ một vị thần javascript tên Doug Crockford. Nếu bạn muốn linh hoạt hơn một chút hoặc có một số ưu điểm cũ trong nhóm của bạn mà không mua theo ý kiến ​​của JSLint hoặc thường xuyên qua lại giữa JS và các ngôn ngữ gia đình C khác, hãy thử dùng JSHint.

phiên bản dài :

Lý do đằng sau ngã ba giải thích khá rõ lý do tại sao JSHint tồn tại:

http://badassjs.com/post/3364925033/jshint-an-community-driven-fork-of-jslint http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to -jshint /

Vì vậy, tôi đoán ý tưởng là nó "hướng đến cộng đồng" chứ không phải do Crockford điều khiển. Trong thực tế, JSHint thường nhẹ nhàng hơn một chút (hoặc ít nhất là có thể định cấu hình hoặc bất khả tri) đối với một vài "ý kiến" cú pháp và phong cách mà JSLint là một yếu tố quyết định.

Ví dụ: nếu bạn nghĩ cả A và B dưới đây đều ổn hoặc nếu bạn muốn viết mã với một hoặc nhiều khía cạnh của A không có trong B, thì JSHint là dành cho bạn. Nếu bạn nghĩ B là lựa chọn chính xác duy nhất ... JSLint. Tôi chắc chắn có những khác biệt khác, nhưng điều này nổi bật một vài.

A) Vượt qua JSHint khỏi hộp - không thành công JSLint

(function() {
  "use strict";
  var x=0, y=2;
  function add(val1, val2){
    return val1 + val2;
  }
  var z;
  for (var i=0; i<2; i++){
    z = add(y, x+i);
  }
})();

B) Vượt qua cả JSHint và JSLint

(function () {
    "use strict";
    var x = 0, y = 2, i, z;
    function add(val1, val2) {
       return val1 + val2;
    }
    for (i = 0; i < 2; i += 1) {
        z = add(y, x + i);
    }
}());

Cá nhân tôi thấy mã JSLint rất đẹp để xem xét và các tính năng cứng duy nhất của nó mà tôi không đồng ý là sự ghét bỏvar i = 0 của nó đối với hơn một khai báo var trong một hàm và khai báo for-loop và một số thực thi khoảng trắng cho khai báo hàm .

Một vài điều trong khoảng trắng mà JSLint thi hành, tôi thấy không hẳn là xấu, nhưng không đồng bộ với một số quy ước khoảng trắng khá chuẩn cho các ngôn ngữ khác trong gia đình (C, Java, Python, v.v.), thường tiếp theo là các quy ước trong Javascript. Vì tôi viết bằng nhiều ngôn ngữ khác nhau trong suốt cả ngày và làm việc với các thành viên trong nhóm, những người không thích khoảng trắng kiểu Lint trong mã của chúng tôi, tôi thấy rằng JSHint là một sự cân bằng tốt. Nó nắm bắt được những thứ đó là một lỗi hợp pháp hoặc hình thức thực sự xấu, nhưng không sủa với tôi như JSLint (đôi khi, theo cách mà tôi không thể vô hiệu hóa) cho các ý kiến ​​về phong cách hoặc cú pháp cú pháp mà tôi không quan tâm.

Rất nhiều thư viện tốt không phải là Lint'able, mà theo tôi chứng minh rằng có một sự thật với ý tưởng rằng một số JSLint chỉ đơn giản là về việc đẩy 1 phiên bản "mã tốt" (thực sự là mã tốt). Nhưng một lần nữa, các thư viện tương tự (hoặc các thư viện tốt khác) có lẽ cũng không phải là Gợi ý, vì vậy, touché.


11
... Tôi phải thừa nhận, tôi đã thất vọng với chất lượng không chuyên nghiệp của lời khuyên mà gần đây tôi đã thấy phổ biến đối với các phong cách mã hóa cho JS (và cả CSS nữa, tình cờ). Như thể sự mê đắm với một ngôn ngữ cụ thể đã lấn át nhu cầu của những người hành nghề không phải là chuyên gia (tức là đối tượng mục tiêu). Đây là một sự xấu hổ khi xem xét họ cần lời khuyên tốt, và sẽ mù quáng làm theo và duy trì bất cứ điều gì được quảng cáo là thực tiễn tốt nhất, mà không biết gì hơn. Thông thường, nó không tương thích với các tiêu chuẩn khác được chấp nhận bởi các cộng đồng người dùng được thiết lập nhiều hơn cho các ngôn ngữ khác. :(
Lee Kowalkowski

67
@LeeKowalkowski Lý do mà JSLint không khuyến khích for (var i = 0; ...; i++)là vì nó không làm cho vòng lặp khép kín. Phạm vi của ilà chức năng. Cú pháp trông giống như nó đang tạo ra một phạm vi khối, nhưng thực tế không phải vậy và điều đó khiến các lập trình viên JavaScript ít kinh nghiệm và những người viết bằng nhiều ngôn ngữ hiểu sai phạm vi của một biến và điều đó có thể dẫn đến các lỗi tinh vi. Nhiều người trong chúng tôi (bao gồm cả tôi) có thể không thích cách đặt tất cả các khai báo lên hàng đầu, nhưng một lời nhắc tốt là JavaScript không có phạm vi chặn.
Mark Evans

25
@MarkEvans Chính nó bao gồm từ quan điểm rằng nếu bạn chỉ di chuyển vòng lặp sang chức năng khác, isẽ không vô tình trở thành toàn cầu. Thực tế là icó chức năng scoped không chặn scoped không phải là một lý do đủ tốt để khai báo các biến ở phía trên, biến luôn cần được khai báo càng gần đến nơi chúng được sử dụng càng tốt ( programmers.stackexchange.com/questions/56585/... ).
Lee Kowalkowski

17
@MarkEvans Tôi nghĩ bạn đang tập trung quá nhiều vào chi tiết triển khai ngôn ngữ. Các tiêu chuẩn lập trình nên dành cho con người, không phải trình biên dịch. Sự phụ thuộc vào một công cụ phân tích mã tĩnh để nắm bắt những cạm bẫy thông thường không thay thế cho việc áp dụng các thói quen tốt để tránh chúng ngay từ đầu. Tôi không thể hiểu lý do tại sao một biến lặp cho một vòng lặp đơn giản nên được khai báo bất kỳ khoảng cách nào từ vòng lặp yêu cầu nó. Nhiều tiêu chuẩn mã hóa cho các ngôn ngữ khác nói rằng khai báo các biến càng gần với nơi chúng được sử dụng càng tốt, để dễ đọc. Tôi đã không thấy một lý do chính đáng để không làm điều này trong JS.
Lee Kowalkowski

11
Sử dụng một biến lặp bên ngoài vòng lặp là điều mà một kẻ nói dối nên kiểm tra.
Lee Kowalkowski

61

Có một "trình phát " trưởng thành và tích cực khác được phát triển trên mặt trận linting javascript - ESLint:

ESLint là một công cụ để xác định và báo cáo về các mẫu được tìm thấy trong mã ECMAScript / JavaScript. Theo nhiều cách, nó tương tự như JSLint và JSHint với một vài ngoại lệ:

  • ESLint sử dụng Esprima để phân tích cú pháp JavaScript.
  • ESLint sử dụng AST để đánh giá các mẫu trong mã.
  • ESLint hoàn toàn có thể cắm được, mỗi quy tắc là một plugin và bạn có thể bổ sung thêm khi chạy.

Điều thực sự quan trọng ở đây là nó có thể mở rộng thông qua các plugin / quy tắc tùy chỉnh . Đã có nhiều plugin được viết cho các mục đích khác nhau. Trong số những người khác , có:

Và, tất nhiên, bạn có thể sử dụng công cụ xây dựng của mình để chạy ESLint:


1
Giá trị của việc có một kẻ nói dối chạy trong trình chỉnh sửa của bạn khi bạn nhập không thể được đánh giá thấp. ESLint được sử dụng rộng rãi theo cách này. Tôi chưa bao giờ nghe nói về hỗ trợ trình soạn thảo JSLint hoặc JSHint (1 điểm dữ liệu tổng hợp).
jingl salonula

17

Tôi đã có cùng một câu hỏi một vài tuần trước đây và đang đánh giá cả JSLint và JSHint.

Trái với câu trả lời trong câu hỏi này, kết luận của tôi không phải là:

Bằng mọi cách hãy sử dụng JSLint.

Hoặc là:

Nếu bạn đang tìm kiếm một tiêu chuẩn rất cao cho bản thân hoặc nhóm, thì JSLint.

Vì bạn có thể định cấu hình gần như các quy tắc tương tự trong JSHint như trong JSLint. Vì vậy, tôi sẽ lập luận rằng không có nhiều khác biệt trong các quy tắc bạn có thể đạt được.

Vì vậy, lý do để chọn cái này hơn cái khác là chính trị hơn là kỹ thuật.

Cuối cùng chúng tôi đã quyết định đồng hành cùng với JSHint vì những lý do sau:

  • Có vẻ là cấu hình nhiều hơn mà JSLint.
  • Trông chắc chắn là hướng đến cộng đồng nhiều hơn là một người đàn ông (cho dù The Man tuyệt vời đến thế nào ).
  • JSHint phù hợp với kiểu mã OOTB của chúng tôi tốt hơn đó là JSLint.

1
Cảm ơn cho một câu trả lời ngắn gọn và súc tích. Điều này đã giải quyết những khoảng trống của tôi về vấn đề này.
akauppi

13

Tôi sẽ đưa ra đề xuất thứ ba, Trình biên dịch đóng cửa của Google (và cũng là Trình đóng cửa đóng ). Bạn có thể thử nó trực tuyến ở đây .

Trình biên dịch đóng cửa là một công cụ giúp tải xuống JavaScript và chạy nhanh hơn. Nó là một trình biên dịch thực sự cho JavaScript. Thay vì biên dịch từ ngôn ngữ nguồn sang mã máy, nó biên dịch từ JavaScript sang JavaScript tốt hơn. Nó phân tích cú pháp JavaScript của bạn, phân tích nó, loại bỏ mã chết và viết lại và giảm thiểu những gì còn lại. Nó cũng kiểm tra cú pháp, tham chiếu biến và các loại và cảnh báo về các cạm bẫy JavaScript phổ biến.


4
Trình biên dịch đóng cửa chọn cái gì mà kẻ nói dối không có?
James McMahon

4
Tôi không thấy một cảnh báo duy nhất được tạo ra bởi công cụ này, khi nó chắc chắn nên. JSLint và JSHint tạo ra rất nhiều cảnh báo cho cùng một đầu vào, cả hai đều đưa ra "quá nhiều lỗi".
wallyk

6
chúng tôi đã sử dụng đóng cửa trên một dự án gần đây và sẽ không làm điều đó một lần nữa. kẻ nói dối không thể được cấu hình để bật các kiểm tra nhất định (nhiều trong số đó là những điều bạn không quan tâm) và trình biên dịch thực sự chỉ có hiệu quả nếu bạn làm việc riêng với các thư viện thân thiện với đóng cửa (trong đó thực sự không có bất kỳ bên ngoài của google).
Robert Levy

4
Điều này không đề cập đến Google Comepiler mỗi lần, nhưng các công cụ của Google phải luôn được xem xét bằng một hạt muối. Chúng được xây dựng để giải quyết các mục tiêu cụ thể của Google và chúng có thể không trùng với mục tiêu của bạn.
Pacerier

@RobertLevy cảm ơn vì đã nhận xét về trải nghiệm của bạn mà bạn đã có ... tôi đã đọc hướng dẫn về phong cách google cho javascript và nó đã khuyến nghị trình biên dịch đóng cửa vì đây là chương trình lint. nhưng bây giờ tôi thấy có những người khác như jslint và jshint
Trevor Boyd Smith

13

Lời nói đầu: Vâng, điều đó leo thang nhanh chóng. Nhưng quyết định kéo nó qua. Có thể câu trả lời này hữu ích cho bạn và các độc giả khác.

Tôi đã mang đi một chút ở đây

Gợi ý mã

Mặc dù JSLint và JSHint là những công cụ tốt để sử dụng, nhưng trong nhiều năm qua tôi đã đánh giá cao những gì bạn tôi @ugly_syntax gọi:

không gian thiết kế nhỏ hơn .

Đây là một nguyên tắc chung, giống như một "nhà sư zen", giới hạn các lựa chọn mà người ta phải đưa ra, một người có thể làm việc hiệu quả và sáng tạo hơn.

Do đó, kiểu mã JS không cấu hình yêu thích hiện tại của tôi:

Tiêu chuẩnJS .

CẬP NHẬT :

Dòng chảy đã được cải thiện rất nhiều. Với nó, bạn có thể thêm các loại vào JS của mình với sẽ giúp bạn ngăn chặn rất nhiều lỗi. Nhưng nó cũng có thể tránh xa bạn, ví dụ như khi can thiệp vào JS chưa được xử lý. Hãy thử một lần!

Bắt đầu nhanh / TL; DR

Thêm standardnhư một phụ thuộc cho dự án của bạn

npm install --save standard

Sau đó package.json, thêm tập lệnh kiểm tra sau:

"scripts": {
    "test": "node_modules/.bin/standard && echo put further tests here"
},

Để có đầu ra snazzier trong khi phát triển npm install --global snazzyvà chạy nó thay vìnpm test .

Lưu ý: Kiểm tra loại so với Heuristic

Bạn tôi khi đề cập đến không gian thiết kế đã đề cập đến Elm và tôi khuyến khích bạn hãy thử ngôn ngữ đó.

Tại sao? JS là trong thực tế lấy cảm hứng từ LISP, mà là một lớp học đặc biệt của ngôn ngữ, mà sẽ xảy ra là không định kiểu . Các ngôn ngữ như Elm hoặc Purescriptcác ngôn ngữ lập trình chức năng được .

Loại hạn chế quyền tự do của bạn để trình biên dịch có thể kiểm tra và hướng dẫn bạn khi bạn kết thúc vi phạm ngôn ngữ hoặc quy tắc của chương trình của riêng bạn; bất kể kích thước (LỘC) của chương trình của bạn.

Gần đây chúng tôi đã có một đồng nghiệp cơ sở thực hiện giao diện phản ứng hai lần: một lần trong Elm, một lần trong React; có một cái nhìn để có được một số ý tưởng về những gì tôi đang nói về.

So sánh Main.elm(đánh máy) index.js(tháo, không kiểm tra)

(ps. lưu ý rằng mã React không phải là thành ngữ và có thể được cải thiện)

Một nhận xét cuối cùng,

thực tế là JS được tháo gỡ. Tôi là ai để đề nghị gõ chương trình cho bạn?

Hãy xem, với JS, chúng ta ở trong một miền khác: được giải phóng khỏi các loại, chúng ta có thể dễ dàng thể hiện những thứ khó hoặc không thể đưa ra một loại thích hợp (chắc chắn có thể là một lợi thế).

Nhưng không có loại nào có rất ít để giữ cho các chương trình của chúng tôi được kiểm tra, vì vậy chúng tôi buộc phải giới thiệu các thử nghiệm và (với một phần mở rộng ít hơn).

Tôi khuyên bạn nên xem LISP (ví dụ ClojureScript ) để tìm cảm hứng và đầu tư vào việc thử nghiệm mã của bạn. Đọc cách của trạm biến áp để có ý tưởng.

Sự thanh bình.


Tại sao các downvote? Tôi chắc chắn không bận tâm, nhưng vì OP đã viết "nó hỗ trợ tôi viết JavaScript tốt hơn" Tôi nghĩ đây là một câu trả lời hữu ích? Bạn nghĩ sao?
dây vào

1
không liên quan đến các downvote, nhưng cả hai liên kết Main.elm và index.js của bạn là 404s
cs01

1
Câu hỏi rõ ràng là jslint hoặc jshint, không yêu cầu thay thế.
jzacharuk

1
Các gif xứng đáng một upvote.
sr9yar

8

Chà, thay vì thực hiện các cài đặt lint thủ công, chúng ta có thể bao gồm tất cả các cài đặt lint ở đầu tệp tin của mình, vd

Khai báo tất cả các var toàn cầu trong tệp đó như:

/*global require,dojo,dojoConfig,alert */

Khai báo tất cả các cài đặt lint như:

/*jslint browser:true,sloppy:true,nomen:true,unparam:true,plusplus:true,indent:4 */

Hy vọng điều này sẽ giúp bạn :)


1

Ngoài ra còn có một giải pháp thay thế được phát triển tích cực khác - JSCS - Kiểu mã JavaScript :

JSCS là một kẻ nói dối kiểu mã để lập trình thực thi hướng dẫn phong cách của bạn. Bạn có thể định cấu hình chi tiết JSCS cho dự án của mình bằng cách sử dụng hơn 150 quy tắc xác thực, bao gồm các cài đặt trước từ các hướng dẫn kiểu phổ biến như jQuery, Airbnb, Google, v.v.

Nó đi kèm với nhiều cài đặt trước mà bạn có thể chọn bằng cách chỉ định tệp presettrong .jscsrccấu hình và tùy chỉnh nó - ghi đè, bật hoặc tắt bất kỳ quy tắc nào:

{
    "preset": "jquery",
    "requireCurlyBraces": null
}

Ngoài ra còn có các plugin và tiện ích mở rộng được xây dựng cho các biên tập viên phổ biến.

Cũng thấy:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.