나는 항상 JSHint을 사용하는 편인데(검사 안 하고 커밋할 때도 많긴 하지만) 주로 .jshintrc
를 사용해서 설정한다. 보통 Grunt를 사용하므로 grunt-contrib-jshint와 함께 사용해서 필요에 따라 .jshintrc
파일을 폴더별로 두고 상대경로에 따라 다른 규칙이 적용되도록 하고 있다. 예를 들어 테스트 코드랑 애플리케이션 코드라든가 서버와 프론트앤드는 다른 규칙이 필요하기 때문이다.
하지만 실제로 작성하다 보면 이러한 전체 규칙으로 JSHint를 통과하기 어려운 경우가 많다. 파일마다 특수한 경우도 있고 때에 따라서는 의도적으로 작성한 코드이지만 JSHint 규칙에는 어긋남에도 그렇다고 전체 규칙을 변경하기는 모호한 경우도 있다. 전체 규칙 외에 이러한 예외상황을 처리할 수 있도록 JSHint는 인라인 설정을 제공하고 있다.
JSHint의 인라인 설정
파일의 상단에 /* jshint unused: true, curly: true */
와 같은 주석으로 JSHint 옵션을 주면 해당 파일에만 다른 규칙을 줄 수 있고 /* global jQuery, angular */
와 같이 사용해서 전역 변수에 대해 설정을 할 수 있다.(undef
옵션과 함께 사용한다.) 여기에 추가로 /* global -angular */
와 같이 사용하면 전역 변수에 대한 블랙리스트 설정을 할 수 있어서 해당 파일에서 해당 전역 변수를 사용하지 않음을 보장할 수 있고 /* global angular:false */
로 설정하면 해당 전역변수가 읽기전용임을 보장할 수 있다.
이 외에도 옵션을 최적화하기 위해서 JSHint는 다양한 인라인 설정을 제공하고 있다.
exported
파일을 모듈화해서 작성하면 A 파일에서 함수를 작성하고 B 파일에서 사용하는 경우가 많은데 unused
옵션을 사용하면 이럴 때 오류가 발생한다. 이럴 때 /* exported EXPORTED_LIB */
주석을 사용하면 해당 변수를 다른 곳에서 사용할 것이라고 알려주어 해당 오류가 나오지 않게 할 수 있다.
ignore
특정 코드블록에 대해서는 강제로 JSHint가 적용되지 않도록 할 수도 있다. (이 설정은 JSHint 2.2.0부터 사용할 수 있다.)
/* jshint ignore:start */
// 여기 있는 코드는 JSHint의 규칙이
// 적용되지 않는다.
/* jshint ignore:end */
위와 같이 ignore:start
와 ignore:end
를 사용하면 특정블록을 완전히 무시할 수 있다.
특정 라인만 무시하고 싶은 경우에는 다음과 같이 지정할 수 있다.
obj.should.be.ok; // jshint ignore:line
이렇게 사용하는 경우는 해당 라인으로만 적용되는 규칙에 대해서만 무시할 수 있다. 예를 들어 obj
가 정의 안 되어 있어서 undef
오류가 나오는 경우에는 ignore:line
으로는 무시되지 않는다.
특정 경고 무시
JSHint를 검사해서 경고가 나오는 경우 아래처럼 나온다.
$ grunt lint
Running "jshint:all" (jshint) task
Linting test.js ...ERROR
[L1:C15] W098: 'greet' is defined but never used.
function greet() {
여기서 보면 해당 경고에 대한 경고코드가 나온 것을 볼 수 있는데(여기서는 W098
) 이 부분을 경고로 표시하고 싶지 않다면 이 경고코드를 이용해서 쉽게 무시할 수 있다.
/* jshint -W098 */
function greet() {
}
/* jshint +W098 */
이렇게 사용하면 -W098
를 사용한 부분부터는 해당 경고를 무시하고 +W098
를 사용한 부분부터 해당 경고를 다시 활성화 시킨다. 이 설정은 W
로 시작하는 경고만 무시할 수 있고 E
로 시작하는 오류는 무시할 수 없다.
Comments