npm의 일반 종속성에 대한 bundledDependencies의 장점


85

npm을 사용하면을 지정할 수 bundledDependencies있지만 이렇게하면 어떤 이점이 있습니까? 참조하는 모듈이 삭제 된 경우에도 올바른 버전을 확보하고 싶은지, 아니면 번들링으로 인한 속도 이점이 있는지 확인하고 싶습니까?

누구나 bundledDependencies정상적인 종속성에 비해 장점을 알고 있습니까?


16
""bundleDependencies "라고 쓰면 그것도 영광입니다." 훌륭한 문서!
Colonel Panic

10
그럼에도 불구하고 어떻게 든 "도 영광"을 읽기 위해 수정하는 것은 슬프다. 협소 한 상황에서 사무라이 나 기사에게 도움을 요청했다면 그에게 호환되는 무기와 갑옷이 번들로 제공되고 명예로운 사람이되기를 바랍니다.
Jon Coombs

3
"우리가 참조하는 모듈이 삭제 되더라도 올바른 버전을 얻었는지 확실히하고 싶다면"갑자기 많은 무게가 나옵니다
joews

1
stackoverflow.com/questions/11459475/… 도 참조하십시오 .
Anon

답변:


49

현재 Node의 가장 큰 문제 중 하나는 Node가 얼마나 빠르게 변화하고 있는지입니다. 즉, 프로덕션 시스템은 매우 취약 npm update할 수 있으며 쉽게 문제를 일으킬 수 있습니다.

bundledDependencies를 사용하면 다른 사항이 변경 되더라도 항상 올바른 종속성을 제공 할 것이라고 올바르게 추측하여이 문제를 해결할 수 있습니다.

이를 사용하여 자신의 개인 번들을 번들로 묶어 설치와 함께 제공 할 수도 있습니다.


1
항상 올바른 종속성을 어떻게 제공합니까? 이것은 npm updatebundledDependencies의 종속성에 영향을 미치지 않음을 의미합니까 ?
Kevin Ghadyani 2015

2
네, 맞습니다. 번들로 제공되는 종속성은 근본적으로 "올바르지"않을 수 있습니다. 그것들은 번들링을하는 사람이 옳았다는 것입니다.
Julian Knight

7
아마도 당신은 5 년 반 된 대답을보고 있기 때문일 것입니다 ! 그 당시 Node.JS가 움직 인 양은 놀랍습니다. 대신 유용한 것을 댓글로 추가하고 싶습니까?
Julian Knight

105

빠른 독자를 위해 :이 QA는 package.json bundledDependencies 필드에관한것이지 패키지 에 관한 것이 아닙니다 .

bundledDependencies의 기능

"bundledDependencies"는 정확히 이름이 의미하는 바입니다. 프로젝트 내부에 있어야하는 종속성. 따라서 기능은 기본적으로 일반 종속성과 동일합니다. 또한 실행할 때 포장됩니다 npm pack.

사용시기

일반 종속성은 일반적으로 npm 레지스트리에서 설치됩니다. 따라서 번들 된 종속성은 다음과 같은 경우에 유용합니다.

  • npm 레지스트리에서 가져 오지 않았거나 수정 된 타사 라이브러리를 재사용하려는 경우
  • 자신의 프로젝트를 모듈로 재사용하고 싶습니다.
  • 모듈과 함께 일부 파일을 배포하고 싶습니다.

이렇게하면 고유 한 npm 저장소를 만들고 유지 관리 할 필요가 없지만 npm 패키지에서 얻는 것과 동일한 이점을 얻을 수 있습니다.

하면 되지 번들 종속성을 사용하는

개발할 때 우연한 업데이트를 방지하는 것이 핵심이라고 생각하지 않습니다. 이를위한 더 나은 도구, 즉 코드 저장소 (git, mercurial, svn ...) 또는 잠금 파일이 있습니다.

패키지 버전을 고정하려면 다음을 사용할 수 있습니다.

  • 옵션 1 : 노드 8과 함께 제공되는 최신 NPM 버전 5를 사용합니다. package-lock.json파일을 사용 합니다 ( 노드 블로그 및 노드 8 릴리스 참조).

  • Option2 : 대신 원사 를 사용하십시오 npm. 그것은 페이스 북의 패키지 관리자 npm이며 yarn.lock파일을 사용하는 것보다 빠릅니다 . package.json그렇지 않으면 동일하게 사용 됩니다.

이는 Bundler 또는 Cargo와 같은 다른 패키지 관리자의 잠금 파일과 비슷합니다. npm의 npm-shrinkwrap.json과 유사하지만 손실이없고 재현 가능한 결과를 생성합니다.

npm실제로에서 해당 기능을 복사했습니다 yarn.

  • Option3 : 이것은 이전에 권장 된 접근 방식이며 더 이상 권장하지 않습니다. 아이디어는 npm shrinkwrap대부분의 시간 을 사용 하고 때로는 node_module 폴더를 포함한 모든 것을 코드 저장소에 넣는 것입니다. 또는 shrinkpack을 사용할 수도 있습니다 . 당시 모범 사례는 node.js 블로그즐거운 개발자 웹 사이트 에서 논의되었습니다 .

또한보십시오

이것은 질문의 범위를 약간 벗어 났지만 마지막 종류의 종속성 (내가 알고있는) 인 피어 종속성 을 언급하고 싶습니다 . 이 관련 SO 질문 과 아마도 bundledDependenciesyarn 에 대한 문서를 참조하십시오 .


6
"는 node_module 폴더를 포함"- 그것은 특히 네이티브 모듈로 작업 할 때 ... 생성 된 코드를 사용하여 REPO을 오염 꽤 이상한 일이 ...의
올렉산드르

@Olexandr 패키지가 당신의 앱을 망가뜨릴 위험을 감수하는 것 사이에서 선택은 쉬울 것 같습니다. 별도의 브랜치에 넣을 수 있습니다 (예를 들어 git를 사용하는 경우). 동의합니다. 이상적인 솔루션과는 거리가 멀습니다.
nha

3
예를 들어 현재 시스템에 적합한 바이너리를 설치하는 phantomjs와 같은 패키지 때문에 node_modules를 체크인하지 않는 것이 좋습니다. 즉, 한 Dev가 Linux에서 npm install을 실행하고 node_modules를 체크인하면 Windows에서 저장소를 복제하는 다른 Dev에서는 작동하지 않습니다. npm이 다운로드를 설치하는 tarball을 확인하고 npm-shrinkwrap.json을 지정하는 것이 좋습니다. npm install -g shrinkpack도구를 사용하여이 프로세스를 자동화 할 수 있습니다 .
제이미 메이슨

1
감사합니다 @nha, 레지스트리 tarball이 프로젝트 저장소에 있기 때문에 shrinkpack으로도 보호됩니다.
Jamie Mason

1
@fold_left 그렇습니다, 그것을 지적 해주셔서 감사합니다. npm 레지스트리가 변경 불가능한 데이터 저장소처럼 작동한다면이 모든 것을 피할 수 있었을뿐입니다.
nha dec

22

다른 장점은 내부 종속성 (애플리케이션 구성 요소)을 여기에 배치 한 다음 lib /를 복잡하게 만들고 npm에 게시하는 대신 독립적 인 모듈 인 것처럼 앱에 요구할 수 있다는 것입니다.

그들이 별도의 모듈로 살 수있을 정도로 성숙되면 코드를 수정하지 않고 쉽게 npm에 넣을 수 있습니다.


3

나는 이미 여기에서 이것을 보지 못했다는 것에 놀랐지 만 신중하게 선택하면 구성되지 않은 시스템에서 실행 bundledDependencies되는 배포 가능한 패키지를 생성하는 데 사용할 수 있습니다 . 다음, 엄지 드라이브 (또는 무엇이든)에 위에 패키지를 가져오고 타르 압축을 풉니 다 : 당신이하지 인터넷 / 네트워크로 아니에요 시스템을 예 경우에 유용 또는 그것을 그냥 작품.npm packnpmnpm runnode index.js

"오프라인"으로 실행되도록 응용 프로그램을 번들로 묶는 더 좋은 방법이있을 수 있지만,있는 경우 찾지 못했습니다.


0

운영상 bundledDependencies를 모듈의 개인 모듈 저장소로 간주합니다. 여기서 종속성이 더 공개되고 모듈과 해당 종속성 (및 하위 종속성)간에 해결됩니다. 모듈은 예를 들어 반응의 이전 버전에 의존 할 수 있지만 종속성에는 최신 버전이 필요합니다. 패키지 / 설치는에서 고정 된 버전이되고 node_modules/$yourmodule/node_modules/react종속성은 해당 버전을 가져 오게됩니다 node_modules/react(또는 원하는 node_modules/$dependency/node_modules/react경우).

주의 사항 : 최근에 react에 대한 종속성을 제대로 구성하지 않은 종속성이 발생했으며 bundledDependencies에서 반응하면 해당 종속 모듈이 런타임에 실패했습니다.

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