node_modules 폴더를 커밋할 필요가 없는 이유

8954 단어 nodegit
영어 |

이 메모는 읽고 추측할 수 있는 질문에 대한 답변입니다Jack Franklin blog post .

npm 설치가 필요 없음

Once you check your node_modules in, there's no need to run an install step before you can get up and running on the codebase


  • git은 저장소에 있는 많은 파일에서 제대로 작동하지 않습니다. Google에서 "git performance many files"를 검색하면 이에 대한 많은 정보를 볼 수 있습니다. 예: Just as git does not scale well with large files, it can also become painful to work with when you have a large number of files
  • Some packages are platform dependent . 예를 들어 dart-sass 과 같은 개발 도구입니다.
  • 커밋하면node_modules 모든 개발자가 종속성을 쉽게 변경할 수 있으며("원숭이 패칭"이라고 함) 이로 인해 확실히 문제가 발생합니다. 이 변경된 종속성을 업데이트하면 이전 변경 사항이 손실됩니다. , 당신은 그것을 해결해야합니다. 특정 버전의 종속성이 처음에 얻은 것과 동일한 코드를 갖는다는 것을 결코 확신할 수 없습니다.

  • This isn't just useful for developers locally, but a big boost for any bots you might have running on a Continuous Integration platform (e.g. CircleCI, GitHub Actions, and so on). That's now a step that the bots can miss out entirely.



    일반적으로 CI는 매번 다운로드하지 않도록 종속성을 캐시하도록 구성됩니다.
    "ci node_modules cache"와 같은 것으로 Google에서 검색할 수 있습니다.

    복제된 빌드 보장

    Having your node_modules checked in guarantees that two developers running the code are running the exact same code with the exact same set of dependencies



    이것은 잠금 파일을 위한 작업입니다. 패키지 관리자(NPM/PNPM/Yarn)가 보장된 복제 빌드를 위해 다운로드된 각 종속성에 대해 필요한 모든 정보를 기록하는 파일을 커밋해야 합니다.
    yarn.lock를 열면 다음과 같은 내용을 볼 수 있습니다.

    "@apideck/better-ajv-errors@^0.2.4":
      version "0.2.5"
      resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.2.5.tgz#b9c0092b7f7f23c356a0a31600334f7b8958458b"
      integrity sha512-Pm1fAqCT8OEfBVLddU3fWZ/URWpGGhkvlsBIgn9Y2jJlcNumo0gNzPsQswDJTiA8HcKpCjOhWQOgkA9kXR4Ghg==
      dependencies:
        json-schema "^0.3.0"
        jsonpointer "^4.1.0"
        leven "^3.1.0"
    


    Yarn은 패키지@apideck/better-ajv-errors가 다음과 함께 다운로드되었음을 주의 깊게 기록했습니다.
  • 버전0.2.5
  • 주소 resolved로 (.tgz에 대한 직접 링크)
  • 해시섬은 sha512-Pm1fAqCT8OE...
  • 3개의 종속성이 있었습니다
  • .
    node_modules 폴더의 각 종속성에 대해서도 마찬가지입니다. 다음에 yarn install가 프로젝트 디렉토리에서 실행되는 동안 모든 종속성은 yarn.lock가 아닌 package.json 정보를 사용하여 다운로드됩니다. 따라서 모든 개발 팀과 CI는 플랫폼(Linux/macOS/Windows)에 관계없이 동일한 파일, 동일한 코드, 동일한 해시 합계를 가집니다.

    Yes, this can be managed by a package-lock.json file, or other tools, but I've seen all of them slip up rarely or allow a slight variation in a minor version number that causes issues.



    이 실수는 프로젝트를 배포할 때 개발자가 npm install 가 아닌 package.json 의 정보를 기반으로 패키지를 설치하는 package-lock.json 를 실행할 때 자주 발생합니다. 잠금 파일에서 패키지를 설치하려면 npm ci 를 실행해야 합니다.

    배송 중인 코드에 대한 더 나은 인식

    I've been surprised at how more aware I am of adding dependencies when the git diff shows me the entirety of the code that is being added to the project. This has lead us to make contributions to tools to help reduce their file size on disk and have a better awareness of the impact a dependency will have on our bundle size.



    종속성을 선택할 때 수 마일의 코드를 읽는 것이 아니라 특수 도구를 사용할 수 있습니다.

  • Bundlephobia

    종속성의 무게, GZIP을 사용하는 정도, 느린 3G 및 중간 4G 인터넷을 통해 다운로드되는 시간, 하위 종속성의 구성 비율, 종속성이 내보내는 것( ES Modules로 작성된 경우), 어떤 대안 또는 인접 패키지가 있는지. 여기 example가 있습니다.

  • bundle.js.org

    다음과 같이 가져올 때 정확히 몇 킬로바이트의 코드가 추가되는지 표시됩니다.

    import { map } from "nanostores"
    

    Look at nanostores example .

  • npm.anvaka.com

    2D 또는 3D 그래프 형식으로 모든 종속성의 그래프를 표시합니다. Look at Vue 3 example .

  • 보이지 않는 것이 아니기 때문에 종속성 추가에 대한 추가 고려 사항

    I mentioned earlier that people see the noise in a git diff as a downside to adding dependencies to version control, and I do acknowledge that it can be a downside to this approach, but I've found that noise to often be a useful signal. Adding that one extra dependency because I don't want to write a few lines of code myself is something I used to do frequently - but now I'm much more considered because I can see the code that's being added and can reflect on if it's worth it.



    프로젝트에 종속성으로 추가되기 전에 코드를 읽을 수 있습니다. 예를 들어 GitHub 저장소. 종속성, 코드의 적합성, 공개 문제 수 및 마지막 커밋 날짜를 최소한 간략하게 살펴보는 것이 좋습니다.

    Note: this doesn't mean that we don't have dependencies! There are times where it is worth it to add a dependency - but seeing the code in version control has made me more considered about doing it - the cost is no longer invisible.



    그것은 결코 보이지 않았습니다.

    큰 차이를 관리할 수 있습니다.

    There is no shying away from the fact that if a developer works on a change that adds a new dependency, there could be a lot of noise in the diff. One of our dependencies that we check in is TypeScript, and every time we update that, the git diff is huge and frankly not worth looking at (beyond the CHANGELOG). We've come up with a rule that helps us here: a change that updates node_modules may not touch any other code in the codebase. So if I update node_modules/typescript with its latest version, I will be warned by our tooling if any other folder outside of node_modules is changed.



    해결 방법으로 이어집니다.

    This rule serves us well the majority of the time, because any work that relies on a new or updated dependency can be split into two changes:

    1. Update the dependency
    2. Use the dependency in the code

    There are times where this doesn't work; updating TypeScript may require us to update some code to fix errors that the new version of TypeScript is now detecting. In that case we have the ability to override the rule.



    다음은 해당 해결 방법을 사용한 결과입니다.

    다른 왼쪽 패드로부터 보호

    The now infamous left_pad incident, where a popular npm package was removed from the repository all of a sudden, causing builds everywhere to break, would not have impacted a team who checked all their dependencies into git. They would still have to deal with the long term impact of "what do we do with this now unsupported dependency", but in the short term their builds wouldn't break and they wouldn't be blocked on shipping new features.


    left_pad가 NPM에서 제거된 그날을 기억합니다. 저는 웹사이트의 디지털 에이전시에서 일했고, 물론 제가 책임지고 있는 모든 프로젝트에서 left_pad는 하위 종속성이었습니다. 우리는 CI가 패키지를 다운로드하려고 할 때 404를 표시했을 때 약 30분 만에 이 문제를 해결했습니다. 우리가 정확히 무엇을 했는지는 기억나지 않지만 그러한 작업이 문제가 되어 해결 방법을 찾아야 하는 이유가 되어서는 안 됩니다.

    결국 정확히 그러한 문제로부터 프로젝트를 보호하기 위해 예를 들어 Verdaccio 을 사용하여 프록시 레지스트리를 올릴 수 있습니다. 다운로드한 모든 패키지의 모든 복사본을 유지합니다.

    좋은 웹페이지 즐겨찾기