Item 45 devDependencies에 typescript와 @types 추가하기

npm (node package manager)

npm은 JS 라이브러리 저장소(npm 레지스트리)와 프로젝트가 의존하고 있는 라이브러리들의 버전을 지정하는 방법(package.json)을 제공한다.

npm은 세 가지 종류의 의존성을 구분해 관리하며, 이 의존성들은 package.json에 들어 있다.

  • dependencies

    • 현재 프로젝트를 실행하는 데 필수적인 라이브러리

    • 프로젝트 런타임에 lodash가 사용된다면 dependencies에 포함되어야 함

    • 프로젝트를 npm에 공개하여 다른 사용자가 해당 프로젝트를 설치하면 여기에 있는 라이브러리도 함께 설치됨

      • 이러한 현상을 전이(transitive) 의존성이라고 한다.

  • devDependencies

    • 현재 프로젝트를 개발하고 테스트하는 데 사용되지만, 런타임에는 필요 없는 라이브러리

    • 예를 들면 프로젝트에서 사용하고 있는 테스트 프레임워크

    • 프로젝트를 npm에 공개하여 다른 사용자가 해당 프로젝트를 설치하면 여기에 있는 라이브러리는 제외됨

    • 타입스크립트는 개발 도구일 뿐이고 타입 정보는 런타임에 존재하지 않으므로 (Item 3) 일반적으로 타입스크립트 관련 라이브러리는 여기에 속함

  • peerDependencies

    • 런타임에 필요하지만 의존성을 직접 관리하지 않는 라이브러리

    • 단적인 예로 플러그인이 있음

    • jQuery의 플러그인은 다양한 버전의 jQuery와 호환되므로 jQuery의 버전을 플러그인에서 직접 선택하지 않고, 플러그인이 사용되는 실제 프로젝트에서 선택하도록 만들 때 사용

타입스크립트에서 공통적으로 고려해야 할 의존성 두 가지

첫 번째, 타입스크립트의 자체 의존성을 고려해야 한다.

  • 타입스크립트를 시스템 레벨에 설치할 수도 있지만, 추천되지 않는다.

    • 팀원들 모두가 항상 동일한 버전의 TS를 설치한다는 보장이 없다.

    • 프로젝트 셋업에 별도의 단계가 추가된다.

  • 두 번째, 타입 의존성(@types)을 고려해야 한다.

    • 사용하려는 라이브러리에 타입 선언이 포함되어 있지 않더라도, DefinitelyTyped에서 타입 정보를 얻을 수 있다. 여기에 있는 타입 정의들은 npm 레지스트리의 @types 스코프에 공개된다.

    • @types 의존성에 관련된 문제도 있다. Item 46에서 다룬다.

Summary

  • 타입스크립트를 시스템 레벨에 설치하지 말자. 타입스크립트를 devDependencies에 포함시키고 팀원 모두가 동일한 버전을 사용하도록 하자.

  • @types 의존성도 devDependencies에 추가하자. 런타임에 @types가 필요한 경우라면 별도의 작업이 필요할 수 있다.

Last updated