@ types / *가`dependencies` 또는`devDependencies`로 들어가는지를 어떻게 결정합니까?


200

내 프로젝트에서 TypeScript 2를 사용합니다. js 라이브러리를 사용하고 싶지만 해당 라이브러리에 대한 입력을하고 싶습니다. 간단한 유형을 설치할 수 있습니다 npm install @types/some-library. 나는할지 확실하지 않다 --save또는 --save-dev그들. DefinetelyTyped GitHub 추가 정보조차도 두 버전을 언급하지만 결코 설명하지는 않는 것 같습니다. devDependencies개발에 유형이 필요하고 런타임에 사용되지 않기 때문에 @types가 있어야한다고 생각 하지만 @types는 여러 번 보았습니다 dependencies. 혼란 스러워요.

어떻게 유형 @ / *이로 전환 여부를 결정해야한다 dependenciesdevDependencies? 실제로 공식적인 지침이 있습니까?


번들을 생성 중입니까, 아니면 다른 사람이 사용할 패키지입니까? 내가 본 것처럼 후자의 경우 dependenciesdevDependencies후자를 구별 하기 만하면됩니다.
Valentin

js / ts로 게임을 처음부터 시작합니다. 나는 모든 것을 webpack과 묶습니다. atm은 전혀 없지만 언젠가는 독립형으로 만들기 위해 Electron으로 모두 포장 할 수 있습니다. 누구도 자신의 앱에서 의존성으로 사용하지 않을 것이라고 생각하지만 가능할 수 있다고 생각합니다 (GTA 게임의 미니 게임을 생각하십시오. 내 게임은 오픈 소스입니다). 그래도 모범 사례를 배우고 따르고 싶습니다. 이것이 그 게임을 만드는 주된 이유입니다. 유스 케이스를 충분히 명확히하기를 바랍니다. :)
kamyl

1
그렇습니다. 제 원래의 대답이 사용 사례와 관련이 있는지 확인하고 싶었습니다. 나는 아직도의 차이라고 생각 devDependencies하고 dependencies번들을 구축 할 때, 그것의 어떤 관계가 그 create-react-app시행한다 뿐만 아니라 하지만, 궁극적으로는 선택하는 당신까지
발렌틴

답변:


140

devDependencies에 @ types / some-module 패키지가있는 패키지 "A"를 개발한다고 가정 해 봅시다. 어떤 이유로 @ types / some-module에서 유형을 내보내는 경우

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}

패키지 "A"의 devDependencies가 설치되어 있지 않기 때문에 현재 패키지 "A"의 Typescript 소비자는 SomeType이 무엇인지 추측 할 수 없습니다.

이 경우 @ types / * 패키지를 규칙적인 "종속성"과 함께 배치해야합니다. 다른 경우에는 "devDependencies"가 충분합니다.


7
따라서 구현에서 유형 만 사용하면 유형 정의가 될 수 있음을 의미합니다 devDependencies.
Franklin Yu

7
예 @FranklinYu. 선언 파일에 유형이 표시되면에 배치해야합니다 dependencies. 그렇지 않으면 devDependencies괜찮습니다
wookieb

1
그러나 패키지는 TS와 JS 모두에서 작동합니다. JS 개발자는 코드를 컴파일하기 위해 이러한 유형이 필요하지 않습니다. 유형 정의를 추가하면 dependencies종속성 트리가 팽창됩니다.
Tyler Long

1
@TylerLong 맞습니다. 완벽하지는 않지만 현실입니다. 선택적으로 "optionalDependencies"를 사용할 수도 있지만 규모에 따라 매우 성가신 것으로 생각됩니다.
wookieb

55

번들을 생성하는 경우 dependencies와를 구분할 필요가 없습니다 devDependencies. 이 기능 npm은 일반적으로 다른 사람이 사용할 수있는 패키지를 게시 할 때 유용하며 중복 된 종속성으로 스팸 메일을 보내지 않습니다.

의존성 분할이 도움이 될 수있는 다른 유스 케이스가있을 수 있지만 명시 적으로 필요하지 않은 한 내 조언은 하나만 선택하여 모든 것을 배치하는 것입니다. 필요한 경우 나중에 분할하는 것은 어렵지 않습니다.

이 연습 IRL의 잘 알려진 예는 create-react-app기본적으로,이 글은 장소의 모든 것을 생성되지 않은 배출 보일러 dependencies, 볼 이 스레드이 답변


8
패키지를 게시하지 않는 경우에는 맞지만, 올바른 경우 개발 및 런타임 및 이 패키지를 빌드 하는 데 필요한 것과이 패키지 를 사용하는 데 필요한 모든 것과 관련이 없습니다 .
Yogu

1
@Yogu 그렇기 때문에 처음부터 차별화를했기 때문에 전적으로 동의합니다
Valentin

13
이 조언에 동의하지 않습니다. devDependencies설치시 npm install --production(또는 npm ci --production) 설치 되지 않으므로 프로덕션 코드를 실행할 때는 사용할 수 없습니다. 이것은 라이브러리뿐만 아니라 서비스에있어서 매우 의미있는 차이입니다.
브래드 윌슨

2
@BradWilson 당신은 요점을 알고 있습니다. 태양 아래에서 많은 npm 워크 플로우가 있습니다. 유스 케이스에서 구별을 해야하는 경우 꼭하십시오. 이 딜레마에 대한 답을 자유롭게 제공하십시오.
Valentin

구별이 의미가 있고 실제 사례를 제공 할 수있는 다른 사용 사례가 있음을 언급하기 위해 답변을 업데이트했습니다. 피드백 감사드립니다!
Valentin

15

Node.js 애플리케이션을 프로덕션에 배치하는 특별한 경우에는 애플리케이션을 실행하는 데 필요한 종속성 만 설치하려고합니다.

npm install --production 또는

npm ci --production 또는

yarn --production

이 경우 설치 유형이 devDependencies부풀어지지 않도록 유형이에 있어야 합니다.

비고 : 나는 이것이 브래드 윌슨이 다른 답변에 대한 의견에서 언급 한 것을 알고 있습니다. 그러나이 점은 답이 될만한 가치가있는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.