프론트엔드(vue) 입문 과정: 학습 시작
요즘 프론트엔드 개발 학생들은 패키지 관리 도구인 npm
없이는 할 수 없습니다. npm의 뛰어난 패키지 버전 관리 메커니즘은 번영하는 NodeJS
커뮤니티 전체에 매우 유용합니다. 내부 메커니즘을 이해하는 것은 모듈 개발과 다양한 프런트 엔드 엔지니어링 구성에 대한 이해를 심화시켜 문제 해결 속도를 높이는 데 도움이 됩니다. (많은 학생들이 다양한 종속성 문제로 어려움을 겪고 있다고 생각합니다.)
이 기사에서는 package.json
, 버전 관리, 종속성 설치 및 특정 예의 세 가지 관점에서 npm
의 패키지 관리 메커니즘을 자세히 분석합니다.
Node.js
에서 모듈은 라이브러리 또는 프레임워크이자 Node.js
프로젝트이기도 합니다. Node.js
프로젝트는 모듈식 아키텍처를 따릅니다. Node.js
프로젝트를 생성한다는 것은 모듈을 생성한다는 의미입니다. 즉, package.json
이라는 설명 파일이 있어야 합니다. 가장 일반적인 구성 파일입니다. 하지만 이 파일에 포함된 구성을 자세히 이해하셨나요? 합리적인 package.json
파일 구성은 프로젝트의 품질을 직접적으로 결정하므로 먼저 package.json
의 세부 구성을 분석하겠습니다.
package.json
에는 많은 속성이 있으며 그 중 name
및 version
두 가지 속성만 채워야 합니다. 이 두 속성은 npm
모듈의 고유 식별자를 구성합니다.
name
은 모듈 이름입니다. 이름을 지정할 때 일부 공식 사양과 권장 사항을 따라야 합니다.
패키지 이름은 모듈 url
, 명령줄 또는 url
이 아닌 안전 문자의 매개 변수가 됩니다. 패키지 이름에는 둘 다 사용할 수 없습니다. validate-npm-package-name
사용하여 패키지 이름이 유효한지 확인할 수 있습니다.
의미론적 패키지 이름은 개발자가 필요한 패키지를 더 빨리 찾고 실수로 잘못된 패키지를 얻는 것을 방지하는 데 도움이 됩니다.
패키지 이름에 기호가 있는 경우 해당 기호를 제거한 후 기존 패키지 이름과 반복해서는 안 됩니다.
예를 들어, react-native
이미 존재하므로 react.native
및 reactnative
다시 생성할 수 없습니다.
예를 들어 사용자 이름은 conard
이고 범위는 @conard
이며 게시된 패키지는 @conard/react
일 수 있습니다.
name
패키지의 고유 식별자이며 다른 패키지 이름과 반복되어서는 안 됩니다. npm view packageName
실행하여 패키지가 점유되어 있는지 확인하고 이에 대한 몇 가지 기본 정보를 볼 수 있습니다.
패키지 이름이 한 번도 사용되지 않은 경우 404
오류가 발생합니다.
또한, https://www.npmjs.com/
에서 자세한 패키지 정보를 확인할 수도 있습니다.
{ "description": "엔터프라이즈급 UI 디자인 언어 및 React 구성요소 구현", "키워드": [ "개미", "요소", "구성 요소", "설계", "뼈대", "프런트엔드", "반응하다", "반응 구성 요소", "유이" ] }
description
다른 사람이 모듈을 쉽게 이해할 수 있도록 모듈 설명 정보를 추가하는 데 사용됩니다.
keywords
모듈에 키워드를 추가하는 데 사용됩니다.
물론 모듈 검색을 용이하게 하는 매우 중요한 역할도 합니다. npm search
사용하여 모듈을 검색하면 description
및 keywords
와 일치합니다. 좋은 description
과 keywords
작성하면 모듈이 점점 더 정확하게 노출되는 데 도움이 됩니다.
개발자를 설명하는 두 가지 필드가 있습니다: author
및 contributors
author
패키지의 주요 작성자를 나타내며 한 author
한 사람에 해당합니다. contributors
정보는 contributors
한 명에 해당합니다. 값은 배열이거나 다음 구조일 수 있습니다
. "이름": "코나드리", "이메일": "[email protected]", "url": "https://github.com/ConardLi" }
{ "홈페이지": "http://ant.design/", "버그": { "url": "https://github.com/ant-design/ant-design/issues" }, "저장소": { "유형": "git", "url": "https://github.com/ant-design/ant-design" }, }
homepage
이 모듈의 홈페이지를 지정하는 데 사용됩니다.
repository
모듈의 코드 저장소를 지정하는 데 사용됩니다.
bugs
모듈에 대해 질문이 있는 사람들이 여기로 가서 질문을 제기할 수 있는 주소나 이메일을 지정합니다.
우리 프로젝트는 하나 이상의 외부 종속성 패키지에 의존할 수 있습니다. 종속성 패키지의 다양한 용도에 따라 dependencies、devDependencies、peerDependencies、bundledDependencies、optionalDependencies
속성으로 구성합니다.
종속성
구성 규칙을 살펴보겠습니다. 종속성 패키지 구성은 다음과 같습니다.
"antd": "ant-design/ant-design#4.0.0-alpha.8", "축": "^1.2.0", "test-js": "파일:../테스트", "test2-js": "http://cdn.com/test2-js.tar.gz", "core-js": "^1.1.5", }
종속성 구성은 다음 구성 규칙을 따릅니다.
依赖包名称:VERSION
VERSION
은 SemVer
사양을 따르는 버전 번호 구성입니다. npm install
시 지정된 버전 범위를 충족하는 패키지를 다운로드하기 위해 npm 서버로 이동합니다.依赖包名称:DWONLOAD_URL
DWONLOAD_URL
은 다운로드 가능한 tarball
압축 패키지 주소입니다. 모듈이 설치되면 이 .tar
로컬로 다운로드되어 설치됩니다.依赖包名称:LOCAL_PATH
LOCAL_PATH
는 file:../pacakges/pkgName
과 같은 로컬 종속성 패키지 경로입니다. npm
패키지를 로컬에서 테스트하는 데 적합하므로 이 방법은 온라인으로 적용하면 안 됩니다.依赖包名称:GITHUB_URL
GITHUB_URL
github
의 username/modulename
작성하는 방법입니다. 예: ant-design/ant-design
나중에 tag
와 commit id
지정할 수도 있습니다.依赖包名称:GIT_URL
GIT_URL
은 다음 형식을 따르는 일반적인 복제 코드 베이스의 git url
입니다:<protocol>://[<user>[:<password>]@]<hostname>[:<port>] [: ][/]<경로>[#<commit-ish> | #semver:<semver>]
protocal
다음 형식일 수 있습니다:
git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish
은
dependencies
가 의존하는 모듈을 지정합니다. 여기서는 개발 환경과 프로덕션 환경 종속성 모듈을 모두 구성할 수 있습니다.
종속성": { "lodash": "^4.17.13", "순간": "^2.24.0", }
코드 사양 확인을 위한 eslint
, 테스트용 jest
등 개발 환경에서만 사용할 수 있는 패키지가 있습니다. 사용자가 패키지를 사용하면 이러한 종속성을 설치하지 않고도 정상적으로 실행할 수 있습니다.
devDependency
devDependencies
추가할 수 있습니다. 이러한 종속성은 npm install
로컬로 수행할 때 계속 설치 및 관리되지만 프로덕션 환경에는 설치되지 않습니다.
"농담": "^24.3.1", "에슬린트": "^6.1.0", }
peerDependencies
는 개발 중인 모듈이 의존하는 버전과 사용자가 설치한 종속 패키지 버전의 호환성을 지정하는 데 사용됩니다.
위의 설명은 다소 추상적일 수 있습니다. ant-design
예로 들어보겠습니다. ant-design
의 package.json
다음과 같은 구성을 갖습니다
. "반응": ">=16.0.0", "반응-돔": ">=16.0.0" }
시스템을 개발하고 ant-design
사용할 때 반드시 React
에 의존해야 합니다. 동시에 ant-design
도 React
에 의존해야 합니다. 안정적인 작동을 유지하기 위해 필요한 React
버전은 16.0.0
이고, 개발할 때 의존하는 React
버전은 15.x
입니다.
이때 ant-design
React
사용해야 하고 그것을 가져와야 합니다:
import * as React from 'react'; import * as ReactDOM from 'react-dom';
이때 얻게 되는 것은 호스트 환경이며, 이는 귀하 환경의 React
버전이므로 몇 가지 문제가 발생할 수 있습니다. npm2
에서, 위의 peerDependencies
지정한다는 것은 호스트 환경이 react@>=16.0.0和react-dom@>=16.0.0
버전을 설치하도록 강제한다는 것을 의미합니다.
앞으로는 npm3
더 이상 peerDependencies
로 지정된 종속성 패키지를 강제로 설치할 필요가 없습니다. 반대로 npm3
설치가 완료된 후 설치가 올바른지 확인하여 잘못된 경우 사용자에게 경고를 표시합니다. .
"종속성": { "반응": "15.6.0", "개미": "^3.22.0" }
예를 들어 프로젝트에서 최신 버전의 antd
사용하고 15.6.0
버전의 react
사용하면 종속성을 설치할 때 다음 경고가 표시됩니다.
일부 시나리오에서는 종속 패키지가 강력한 종속성이 아닐 수 있습니다. 이 종속 패키지를 얻을 수 없는 경우에는 npm install
실패 없이 계속 실행되도록 할 수 있습니다. optionalDependencies
의 구성 optionalDependencies
dependencies
재정의하므로 한 위치에서만 구성하면 됩니다.
물론, optionalDependencies
에 설치된 의존성을 참조할 때는 예외 처리를 해야 하며, 그렇지 않으면 모듈을 얻을 수 없을 때 오류가 보고됩니다.
는 위와 다릅니다. bundledDependencies
의 값은 배열입니다. 일부 모듈은 이 패키지가 출시될 때 함께 패키지됩니다.
"bundledDependency": ["package1" , "package2"]
{ "라이센스": "MIT" }
license
필드는 소프트웨어의 오픈 소스 계약을 지정하는 데 사용됩니다. 오픈 소스 계약은 귀하의 코드를 획득한 후 다른 사람이 갖는 권리, 귀하의 코드에서 수행할 수 있는 작업 및 금지되는 작업을 자세히 설명합니다. 동일한 계약에도 다양한 변형이 있습니다. 너무 느슨한 계약은 저작자에게 저작물에 대한 많은 권리를 잃게 만들고, 너무 엄격한 계약은 사용자가 저작물을 사용하고 배포하는 데 편리하지 않습니다. , 오픈 소스 작성자는 어떤 권리를 유지하고 어떤 제한을 완화할지 고려해야 합니다.
소프트웨어 계약은 오픈 소스와 상업용의 두 가지 범주로 나눌 수 있습니다. 법적 진술과 라이센스 계약이라고도 하는 상업적 계약의 경우 각 소프트웨어에는 소프트웨어 작성자 또는 전문 변호사가 작성한 고유한 텍스트 세트가 있습니다. 긴 라이센스 계약을 작성하는 데 시간과 노력을 들일 필요가 없습니다. 널리 배포되는 오픈 소스 라이센스를 선택하는 것이 좋습니다.
다음은 몇 가지 주류 오픈 소스 프로토콜입니다.
MIT
: 사용자가 프로젝트 복사본에 저작권 표시와 라이센스 표시를 포함하는 한, 사용자는 어떠한 책임도 지지 않고 코드로 원하는 모든 작업을 수행할 수 있습니다.Apache
: MIT
와 유사하지만 기여자가 사용자에게 제공하는 특허 라이센스와 관련된 용어도 포함합니다.GPL
: 프로젝트 코드를 수정하는 사용자는 소스 코드나 바이너리 코드를 재배포할 때 관련 수정 사항을 게시해야 합니다.오픈 소스 계약에 대한 더 자세한 요구 사항이 있는 경우 choosealicense.com/으로 이동하여 오픈 소스 계약에 대한 자세한 설명을 볼 수 있습니다.
{ "메인": "lib/index.js", }
main
속성은 프로그램의 기본 항목 파일을 지정할 수 있습니다. 예를 들어 위의 antd
에 의해 지정된 모듈 antd
lib/index.js
다음과 같습니다. 실제로 import { notification } from 'antd';
소개된 것은 lib/index.js
입니다.
모듈이 명령줄 도구인 경우 명령줄 도구에 대한 항목을 지정해야 합니다. 즉, 명령 이름과 로컬 지정 가능 파일 간의 대응 관계를 지정해야 합니다. 전역적으로 설치된 경우 npm은 심볼릭 링크를 사용하여 실행 파일을 /usr/local/bin
에 연결합니다. 로컬로 설치된 경우 ./node_modules/.bin/
에 연결됩니다.
{ "빈": { "코나드": "./bin/index.js" } }
예를 들어 위 구성은 다음과 같습니다. 패키지가 전역적으로 설치된 경우 npm
"./bin/index.js"
를 가리키는 /usr/local/bin
아래에 conard
라는 소프트 링크를 생성합니다. . 이때, command line에서 conard
실행하면 연결된 js 파일이 호출됩니다.
여기서는 너무 자세히 설명하지 않겠습니다. 더 많은 내용은 다음 명령줄 도구 기사에서 자세히 설명하겠습니다.
{ "파일": [ "거리", "lib", "에스" ] }
files
속성은 npm publish
후 npm
서버에 푸시하는 파일 목록을 설명하는 데 사용됩니다. 폴더를 지정하면 폴더의 모든 내용이 포함됩니다. 다운로드한 패키지의 디렉터리 구조는 다음과 같습니다.
또한 많은 수의 정크 파일이
npm
으로 푸시되는 것을 방지하기 위해 일부 파일을 제외하도록.npmignore
파일을 구성할 수도 있습니다. 규칙은 사용하는.gitignore
와 동일합니다..gitignore
파일은.npmignore
파일 역할을 할 수도 있습니다.
man
명령은 Linux
에서의 help 명령입니다. man
명령을 통해 Linux
에서 명령 도움말, 구성 파일 도움말, 프로그래밍 도움말 및 기타 정보를 볼 수 있습니다.
node.js
모듈이 전역 명령줄 도구인 경우 package.json
의 man
속성을 통해 man
명령으로 검색한 문서 주소를 지정할 수 있습니다.
man
파일은 숫자로 끝나거나 압축된 경우 .gz
로 끝나야 합니다. 숫자는 파일이 설치될 man
의 어느 부분을 나타냅니다. man
파일 이름이 모듈 이름으로 시작하지 않으면 설치 중에 모듈 이름이 앞에 붙습니다.
예를 들어 다음 구성은 다음
과 같습니다. "남성" : [ "/Users/isaacs/dev/npm/cli/man/man1/npm-access.1", "/Users/isaacs/dev/npm/cli/man/man1/npm-audit.1" ] }
명령줄에 man npm-audit
입력합니다.
CommonJS
node.js
은 CommonJS
모듈 사양을 기반으로 구현되며 패키지 설명 파일 package.json
외에도 모듈 디렉터리에는 다음 디렉터리도 포함되어야 합니다.
bin
: 여기서 실행 가능한 바이너리 파일이 저장됩니다. 디렉토리lib
: js 코드가 저장되는 디렉토리doc
: 문서가 저장되는 디렉토리test
: 단위 테스트 케이스 코드가 저장되는 디렉토리모듈 디렉토리에서는 위의 구조를 엄격하게 따르지 않거나 이름을 지정할 수 없습니다. . package.json
속성에서 directories
지정하여 디렉터리 구조가 위의 표준 구조와 일치하는 방식을 지정할 수 있습니다. 이 외에도 directories
속성에는 당분간 다른 응용 프로그램이 없습니다.
{ "디렉터리": { "lib": "src/lib/", "빈": "src/bin/", "남자": "src/남자/", "doc": "src/doc/", "예제": "src/예제/" } }
그러나 공식 문서에는 이 속성이 현재는 중요한 역할을 하지 않지만 앞으로 몇 가지 트릭이 개발될 수 있다고 명시되어 있습니다. 예를 들어 doc에 저장된 마크다운 파일과 example에 저장된 예제 파일이 친숙한 방식으로 표시될 수 있습니다.
{ "스크립트": { "테스트": "jest --config .jest.js --no-cache", "dist": "antd-tools는 dist를 실행합니다", "compile": "antd-tools 실행 컴파일", "build": "npm 실행 컴파일 && npm 실행 dist" } }
scripts
일부 스크립트 명령의 약어를 구성하는 데 사용됩니다. 각 스크립트는 서로 조합하여 사용할 수 있습니다. 이러한 스크립트는 구성 후 npm run command
사용하여 호출할 수 있습니다. npm
키워드인 경우 직접 호출할 수 있습니다. 예를 들어 위 구성은 npm run test
, npm run dist
, npm run compile
, npm run build
명령을 지정합니다.
config
필드는 스크립트에 사용되는 환경 변수를 구성하는 데 사용됩니다. 예를 들어 스크립트에서 process.env.npm_package_config_port
사용하여 다음 구성을 얻을 수 있습니다.
{ "구성": { "포트": "8080" } }
node.js
모듈이 주로 전역 명령줄 도구를 설치하는 데 사용되는 경우 이 값은 true
로 설정되며 사용자가 모듈을 로컬로 설치할 때 경고가 표시됩니다. 이 구성은 사용자가 설치하는 것을 방지하지는 않지만 일부 문제를 일으킬 수 있는 잘못된 사용을 방지하도록 사용자에게 메시지를 표시합니다.
private
속성이 true
로 설정되면 npm은 이를 게시하는 것을 거부합니다. 이는 비공개 모듈이 실수로 게시되는 것을 방지하기 위한 것입니다.
"publishConfig": { "레지스트리": "https://registry.npmjs.org/" },
모듈을 게시할 때 더 자세한 구성을 수행합니다. 예를 들어 특정 tag
만 게시하도록 구성하고 게시할 비공개 npm
소스를 구성할 수 있습니다. 보다 자세한 구성은 npm-config os를 참고하세요
darwin
시스템에서만 실행 가능한 모듈을 개발하는 경우, 불필요한 오류를 방지하기 위해 windows
사용자가 해당 모듈을 설치하지 않도록 해야 합니다.
os
속성을 사용하면 위의 요구 사항을 충족하는 데 도움이 될 수 있습니다. 모듈을 특정 시스템에만 설치할 수 있도록 지정하거나 설치할 수 없는 시스템의 블랙리스트를 지정할 수 있습니다.
"os" : [ "darwin", "linux" ] "os" : [ "!win32" ]
예를 들어, 시스템 블랙리스트에 테스트 모듈을 할당합니다: "os" : [ "!darwin" ]
이 시스템에 설치하면 다음 오류가 나타납니다.
노드 환경에서는 process.platform을 사용하여 운영 체제를 확인할 수 있습니다.
위의 os
와 유사합니다. cpu
속성을 사용하여 사용자의 설치 환경을 보다 정확하게 제한할 수 있습니다.
"cpu" : [ "x64", "ia32" ] "cpu" : [ "!arm", "!mips" ]
노드 환경에서는 process.arch를 사용하여 CPU 아키텍처를 결정할 수 있습니다.
Nodejs
의 성공은 npm
의 뛰어난 종속성 관리 시스템과 불가분의 관계에 있습니다. 전체 종속성 시스템을 소개하기 전에 npm
종속 패키지의 버전을 관리하는 방법을 이해해야 합니다. 이 장에서는 npm包
의 버전 릴리스 사양, 다양한 종속 패키지의 버전을 관리하는 방법 및 패키지 버전과 관련된 몇 가지 모범 사례를 소개합니다.
npm view package version
실행하면 package
의 최신 버전을 볼 수 있습니다.
npm view conard versions
실행하면 npm 서버에 게시된 모든 package
버전을 볼 수 있습니다.
npm ls
실행하여 현재 웨어하우스 종속성 트리에 있는 모든 패키지의 버전 정보를 확인하세요.
npm包
의 모듈 버전은 SemVer
사양( Github
에서 초안한 안내, 통합 버전 번호 표시 규칙)을 따라야 합니다. 실제로는 Semantic Version
의 약어입니다.
SemVer 사양 공식 웹사이트: https://semver.org/Standard
SemVer
사양의 표준 버전 번호는 XYZ
형식을 채택합니다. 여기서 X, Y 및 Z는 음수가 아닌 정수이고 숫자 앞의 제로 패딩은 다음과 같습니다. 금지. X는 주 버전 번호, Y는 부 버전 번호, Z는 개정 번호입니다. 각 요소는 수치적으로 증가해야 합니다.
major
): 호환되지 않는 API 수정을 하는 경우minor
): 이전 버전과 호환되는 기능을 만드는 경우 새patch
): 이전 버전과의 호환성 문제를 만드는 경우 수정합니다.예: 1.9.1 -> 1.10.0 -> 1.11.0
버전에 큰 변경 사항이 있고, 안정적이지 않으며, 예상되는 호환성 요구 사항을 충족하지 못하는 경우 고급 버전을 먼저 릴리스할 수 있습니다.
선행 버전 번호는 "주 버전 번호, 부 버전 번호, 개정 번호" 끝에 추가할 수 있습니다. 먼저 연결 번호를 추가한 다음 마침표로 구분된 일련의 식별자와 버전 컴파일 정보를 추가합니다.
alpha
):beta
):rc
Release candiate
React
살펴보겠습니다
버전은 SemVer
사양에 따라 엄격하게 릴리스되었음을 알 수 있습니다.
主版本号.次版本号.修订号
16.8.0 -> 16.8.1 -> 16.8.2
16.8.0 -> 16.8.1 -> 16.8.2
alpha
, beta
, rc
및 기타 고급 버전이. npm
패키지의 특정 기능을 수정한 후 일반적으로 우리의 일반적인 접근 방식은 package.json
지정된 버전으로 직접 수정하는 것입니다. 작업이 올바르지 않으면 버전 번호에 혼동이 생기기 쉽습니다. Semver
사양을 준수하는 명령을 사용하여 이 작업을 완료할 수 있습니다.
npm version patch
: 개정 번호 업그레이드npm version minor
: 마이너 버전 번호npm version major
npm version major
: 메이저 버전 번호일부 버전 번호의 작동에 반드시 필요합니다. 이러한 버전 번호가 SemVer
사양을 준수하는 경우 운영 버전에 npm 패키지 semver
사용하여 도움을 받을 수 있습니다. 버전 크기 비교, 버전 정보 추출 및 기타 작업을 수행합니다.
Npm은 또한 이 도구를 사용하여 버전 관리 작업을 처리합니다.
npm install semver
semver.gt('1.2.3', '9.8.7') // false semver.lt('1.2.3', '9.8.7') // true는
semver.valid('1.2.3') // '1.2.3' semver.valid('abc') // null은
semver.valid(semver.coerce('v2')) // '2.0.0' semver.valid(semver.coerce('42.6.7.9.3-alpha')) //'42.6.7'
semver.clean(' =v1.2.3 ') // '1.2.3' semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true semver.minVersion('>=1.0.0') // '1.0.0'
위의 내용은 semver의 가장 일반적인 용도입니다. 자세한 내용은 semver 설명서(https://github.com/npm/node)를 참조하세요. -semver
우리는 package.json
에서 다양한 종속성을 작성하는 다양한 방법을 종종 볼 수 있습니다
. "신호": "1.4.0", "figlet": "*", "반응": "16.x", "테이블": "~5.4.6", "yargs": "^14.0.0" }
처음 세 개는 이해하기 쉽습니다.
"signale": "1.4.0"
: 고정 버전 번호"figlet": "*"
: 모든 버전( >=0.0.0
)"react": "16.x"
: 일치 메인 버전( >=16.0.0 <17.0.0
)"react": "16.3.x"
: 메이저 버전과 마이너 버전 일치( >=16.3.0 <16.4.0
)마지막 두 버전을 살펴보겠습니다. 버전 번호 ~
및 ^
기호는 다음과 같이 인용됩니다.
~
: 종속성을 설치할 때 새 버전을 얻으면 xyz
에 최신 버전의 z
설치합니다. 즉, 메이저 버전 번호와 마이너 버전 번호를 변경하지 않고 최신 개정 번호를 유지합니다.^
: 종속성을 설치할 때 새 버전을 얻으면 설치된 xyz
의 y
와 z
모두 최신 버전입니다. 즉, 메이저 버전 번호는 그대로 유지하면서 마이너 버전 번호와 개정 번호는 최신 버전으로 유지합니다.package.json
파일의 가장 일반적인 종속성은 "yargs": "^14.0.0"
이어야 합니다. 왜냐하면 npm install package
사용하여 패키지를 설치할 때 npm
기본적으로 최신 버전을 설치한 다음 Add에 설치하기 때문입니다. 버전 번호 앞에 ^
기호가 있습니다.
주 버전 번호가 0
이면 불안정한 버전으로 간주됩니다. 상황은 위와 다릅니다.
0
입니다. ^0.0.z
및 ~0.0.z
는 모두 0입니다. 고정 버전으로 간주되므로 종속성을 설치할 때 변경 사항이 발생하지 않습니다.0
입니다. ^0.yz
~0.yz
와 동일하게 동작하며 개정 번호만 최신 버전으로 유지됩니다.버전 번호 1.0.0은 공개 API를 정의하는 데 사용됩니다. 귀하의 소프트웨어가 공식 환경에 출시되거나 안정적인 API가 있으면 버전 1.0.0을 출시할 수 있습니다. 따라서 npm 패키지의 공식 버전을 외부에 출시하기로 결정한 경우 해당 버전을 1.0.0으로 표시하세요.
실제 개발에서는 다양한 종속성의 불일치로 인해 이상한 문제가 자주 발생하거나 일부 시나리오에서는 종속성을 업데이트하지 않으려는 경우 개발 중에 package-lock.json
사용하는 것이 좋습니다.
종속성 버전을 잠그면 수동으로 업데이트를 수행하지 않는 한 종속성을 설치할 때마다 수정된 버전이 설치됩니다. 전체 팀이 일관된 버전 번호의 종속성을 사용하는지 확인하세요.
고정 버전을 설치할 때마다 종속성 버전 범위를 계산할 필요가 없으므로 대부분의 시나리오에서 종속성 설치 시간이 크게 단축될 수 있습니다.
package-lock.json을 사용할 때 npm 버전이 5.6 이상인지 확인하세요. 5.0과 5.6 사이에서 package-lock.json의 처리 로직이 여러 번 업데이트되고 버전 5.6의 후처리 로직이 점차 안정화되었기 때문입니다.
이후 장에서 package-lock.json
의 세부 구조를 분석할 것입니다.
목적은
이러한 종속성을 절대 업데이트하지 않고 팀에서 사용되는 종속성이 일관되고 안정적인지 확인하는 것입니다.실제 개발 시나리오에서는 매번 새 버전을 설치할 필요는 없지만 종속성 패키지 업그레이드로 인한 문제 수정, 성능 개선 및 새로운 기능 업데이트를 즐길 수 있도록 정기적으로 종속성 버전을 업그레이드해야 합니다.
npm outdated
사용하면 최신 버전으로 업그레이드되지 않은 종속성을 나열하는 데 도움이 될 수 있습니다.
하고 npm update
실행하세요. 모든 빨간색 종속성을 업그레이드하세요.
1.0.0
으로 표시하세요.主版本号.次版本号.修订号
릴리스alpha、beta、rc
및 다른 고급 버전을 먼저 선택하세요.npm
패키지입니다. 이때 버전 접두어가 잠겨 ~
변경하는 것이 좋습니다. 메인 프로젝트의 종속성은 하위 종속성이 업데이트될 때마다 업그레이드해야 하는데, 이는 매우 번거로운 작업입니다. 하위 종속성이 완전히 신뢰된 경우 직접 엽니다 ^
매번 최신 버전으로 업그레이드하세요.docker
라인에서 실행되며 하위 종속성은 여전히 로컬에서 개발 및 업그레이드되고 있습니다. docker
버전이 출시되기 전에 로컬 하위 종속성이 해제된 후 온라인에서 문제가 발생하지 않도록 모든 종속성 버전을 잠가야 합니다. 출시된.npm
버전이 5.6
이상인지 확인하고, package-lock.json
파일이 기본적으로 활성화되어 있는지 확인하세요.npm inatall
실행된 후 package-lock.json
원격 창고에 제출됩니다. node_modules
원격 저장소에 직접 제출하지 마십시오.npm update
실행하여 종속성을 업그레이드하고, 다른 구성원이 동시에 종속성을 업데이트할 수 있도록 lock
파일을 제출하세요. lock
파일을 수동으로 변경하지 마세요.package.json
파일의 종속성 버전을 수정하고 npm install
실행lock
npm install package@version
직접 실행( package.json
변경해도 종속성이 다운그레이드되지 않음)npm install
아마도 위의 과정을 거치게 될 것입니다. 이 장에서는 각 프로세스의 구현 세부 사항, 개발 및 이유에 대해 설명합니다.
우리 모두는 npm install
실행한 후 종속 패키지가 node_modules
에 설치된다는 것을 알고 있습니다. npm
종속 패키지를 node_modules
에 설치하는 구체적인 메커니즘을 자세히 살펴보겠습니다.
npm
의 초기 버전에서 npm
종속성 처리 방식은 간단하고 조잡했습니다. 이는 package.json
구조와 하위 종속성 패키지의 package.json
구조를 엄격하게 따라 재귀적인 방식으로 해당 node_modules
에 종속성을 설치했습니다. 더 이상 다른 모듈에 의존하지 않는 하위 종속 패키지가 나올 때까지.
예를 들어, my-app
모듈은 이제 buffer
와 ignore
두 모듈에 의존합니다
. "이름": "내 앱", "종속성": { "버퍼": "^5.4.3", "무시": "^5.1.4", } }
ignore
다른 모듈에 의존하지 않는 순수 JS
모듈이며, buffer
base64-js
및 ieee754
두 모듈에 의존합니다.
{ "이름": "버퍼", "종속성": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }
그런 다음 npm install
실행한 후 얻은 node_modules
의 모듈 디렉터리 구조는 다음과 같습니다.
이 접근 방식의 장점은 명백합니다. node_modules
의 구조는 package.json
의 구조와 일대일로 대응하고, 계층 구조가 명확하며, 각 설치의 디렉터리 구조가 동일하다는 것이 보장됩니다.
그러나 많은 모듈에 의존한다면 node_modules
가 매우 크고 중첩 수준이 매우 깊어질 것이라고 상상해 보십시오.
Windows
시스템에서 최대 파일 경로 길이는 260자이며 중첩 수준이 너무 깊으면 예측할 수 없는 문제가 발생할 수 있습니다.위의 문제를 해결하기 위해 NPM
버전 3.x
에서 대규모 업데이트를 진행했습니다. 초기 중첩 구조를 플랫 구조로 변경합니다.
node_modules
루트 디렉터리에 설치됩니다.위의 종속성 구조를 유지하면서 npm install
실행하면 다음 디렉터리 구조를 얻게 됩니다.
현재 모듈에서 [email protected]
버전에 의존하면 :
{ "이름": "My-App", "종속성": { "버퍼": "^5.4.3", "무시 :"^5.1.4 ", "Base64-JS": "1.0.1", } }
node_modules
를 일치시킵니다.이 시점에서 npm install
실행 한 후 다음 디렉토리 구조를 얻게됩니다.
이에 따라 프로젝트 코드의 모듈을 참조하면 모듈 검색 프로세스
node_modules
node_modules
패키지 buffer2@^5.4.3
[email protected]
따라
node_modules
경로가 검색되며따라서 npm 3.x
버전은 이전 버전의 모듈 중복성 문제를 완전히 해결하지 못하고 새로운 문제를 일으킬 수도 있습니다.
앱이 [email protected]
버전에 의존하지 않지만 다른 base64-js
버전에 의존하는 buffer
및 buffer2
에도 의존한다고 상상해보십시오. npm install
실행할 때 package.json
의 종속성은 순서대로 구문 분석되므로 buffer
와 buffer2
의 순서가 package.json
에 배치됩니다 .json은 node_modules
의 종속성 구조를 결정합니다.
buffer2
에 의존합니다.
먼저 buffer
에 의존합니다.
또한 개발자가 안전 전제에 따라 최신 종속성 패키지를 사용할 수 있도록하기 위해서는 일반적으로 큰 버전 만 package.json
만 잠그게합니다. 즉, 일부 종속성 패키지의 마이너 버전이 업데이트되면 종속성 구조가 업데이트 될 수 있습니다. 의존성 구조에서 불확실성이 변경되면 프로그램에 예측할 수없는 문제가 발생할 수 있습니다.
npm install
의 불확실성 문제를 해결하기 위해 package-lock.json
파일이 npm 5.x
버전에 추가되었으며 설치 방법은 npm 3.x
의 플랫 메소드를 따릅니다.
package-lock.json
의 기능은 디렉토리에 package-lock.json
파일이있는 한 npm install
의 각 실행 후 생성 된 node_modules
디렉토리 구조가있는 한 종속성 구조를 잠그는 것입니다. .
예를 들어, 우리는 다음의 종속성 구조를 가지고 있습니다.
{ "이름": "My-App", "종속성": { "버퍼": "^5.4.3", "무시 :"^5.1.4 ", "Base64-JS": "1.0.1", } }
npm install
실행 한 후 생성 된 package-lock.json
다음과 같습니다
. "이름": "My-App", "버전": "1.0.0", "종속성": { "Base64-JS": { "버전": "1.0.1", "Resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz", "무결성": "SHA1-ASBRSZT7XZE47TUTDW3I/NP+PAG =" }, "버퍼": { "버전": "5.4.3", "Resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", "무결성": "SHA512-ZVJ65TKFEIT3I6AJ5BIVJDZJJQQGS4O/SNOEZG1f1f1KYAP9NU2JCUDPWZRSJTHMMMZG0H7BZKN4RNQPIMHUXWX2A ==", "필수": { "Base64-JS": "^1.0.2", "IEEE754": "^1.1.4" }, "종속성": { "Base64-JS": { "버전": "1.3.1", "Resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.tgz", "무결성": "SHA512-MLQ4I2QO1YTVGWFWMCNGKO // jXAQUEZVWEKTJGQFM4JIK0KU+YTMFPLL8J+N5MSPOFJHWOAG+9YHB7BWAHM36G ==" } } }, "IEEE754": { "버전": "1.1.13", "Resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "무결성": "SHA512-4VF7I2LYV/HAWERSO3XMLMKP5EZ83I+/CDLUXI/igts/O1Sejbnhttnxzmrzfvouqj7lzjqhketvpgsfdlwztg ==" }, "무시하다": { "버전": "5.1.4", "Resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", "무결성": "SHA512-MZBUSAHKTW1U7JPKKKJY7LCARD1FU5W2RLDXLM4KDKAYUCWZIMJKPLUF9CM1ALEWYJGUPDQEWLAM18Y6AU69A8A ==" " } } }
위의 구조를 자세히 살펴 보겠습니다.
두 개의 바깥 쪽 속성 name
과 version
package.json
의 name
및 version
과 동일하며 현재 패키지 이름과 버전을 설명하는 데 사용됩니다.
dependencies
node_modules
의 패키지 구조에 해당하는 객체입니다. 객체의 key
패키지 이름이며 값은 패키지의 일부 설명입니다.
version
: 패키지 버전 - 현재 node_modules
에 설치된이 패키지의 버전resolved
: 패키지 특정 설치 소스integrity
: 설치된 소프트웨어 패키지가 수정되었는지 여부를 확인하기 위해 Subresource Integrity
을 기반으로 한 패키지 hash
값requires
은 하위의 dependencies
과 동일합니다. 종속성 package.json
.dependencies
: 구조는 외부 dependencies
구조와 동일하며 하위 의존성 node_modules
에 설치된 종속성 패키지를 저장합니다.여기서 모든 하위 의존성에 dependencies
속성이있는 것은 아닙니다.이 속성은 하위 의존성의 종속성이 루트 디렉토리의 node_modules
에 현재 설치된 종속성과 충돌 한 후에 만 나타납니다.
예를 들어, 위의 종속성을 검토하십시오.
[email protected]
버전에서 우리는 base64-js@^1.0.2
와 my-app
buffer
에 의존하는 버전에서 의존하여 [email protected]
의 node_modules
에 설치해야합니다. package-lock.json
에서 buffer
의 dependencies
속성에 해당하는 buffer
패키지가 변경되었습니다. 이것은 또한 npm
의 종속성에 대한 평평한 접근 방식에 해당합니다.
따라서 위의 분석에 따르면 package-lock.json
package-lock.json
과 node_modules
디렉토리 구조는 일대일 서신에 있습니다. 각 설치에 의해 생성됩니다.
또한 프로젝트에서 package-lock.json
을 사용하면 종속성 설치 시간의 속도를 크게 높일 수 있습니다.
npm i --timing=true --loglevel=verbose
lock
lock
사용하여 npm install
의 전체 프로세스를 확인하겠습니다. 비교하기 전에 npm
캐시를 청소하십시오.
lock
파일을 사용하지 않고 :
lock
파일 사용 :
각 패키지의 특정 버전 및 다운로드 링크는 package-lock.json
에 캐시되었음을 알 수 있습니다. 많은 수의 네트워크 요청.
시스템 응용 프로그램을 개발할 때는 모든 팀 개발자가 설치 한 종속성 버전과 npm install
실행할 때 CI
버전 저장소에 package-lock.json
파일을 제출하는 것이 좋습니다.
npm
패키지를 semver
때는 npm
패키지가 다른 리포지토리에 의존해야합니다 범위 내에서 불필요한 중복성을 유발합니다. 따라서 package-lock.json
파일을 게시해서는 안됩니다 ( npm
기본적으로 package-lock.json
파일을 게시하지 않습니다).
npm install
또는 npm update
명령을 실행 한 후 종속성을 다운로드하려면 node_modules
디렉토리에 종속성 패키지를 설치하는 것 외에도 로컬 캐시 디렉토리에 사본도 캐시됩니다.
npm config get cache
명령 : Linux
또는 Mac
에서 기본값은 사용자의 홈 디렉토리의 .npm/_cacache
디렉토리입니다.
이 디렉토리에는 content-v2
와 index-v5
두 디렉토리가 있습니다. content-v2
디렉토리는 tar
패키지의 캐시를 저장하는 데 사용되며 index-v5
디렉토리는 tar
패키지의 hash
저장하는 데 사용됩니다.
NPM이 설치를 실행할 때 package-lock.json
에 저장된 integrity、version、name
기반으로 index-v5
디렉토리의 캐시 레코드에 해당하는 고유 key
생성하여 tar
패키지의 hash
찾을 수 있습니다. 그리고 hash
tar
으로하는 것은 직접 사용됩니다.
캐시 디렉토리에서 검색 및 테스트 할 패키지를 찾을 수 있으며 index-v5
:
grep "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1에서 패키지 경로를 검색 할 수 있습니다. TGZ "-R Index -V5
그런 다음 우리는 JSON을 포맷합니다
. "키": "Pacote : 버전-관리 : https : //registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz : sha1-asbrszt7xze47tutdw3i/np+pag =", "무결성": "SHA512-C2EKHXWXVLSBRUCJTRS3FHV7MF/Y9KLKDXPTE8YEVCOH5H8AE69Y+/LP+AHPW91CRNZGO78ELOK2E6APJFIQ ==", "시간": 1575554308857, "크기": 1, "메타 데이터": { "ID": "[email protected]", "매니페스트": { "이름": "Base64-JS", "버전": "1.0.1", "엔진": { "노드": "> = 0.4" }, "종속성": {}, "옵션 의존성": {}, "devDependency": { "표준": "^5.2.2", "테이프": "4.x" }, "번들 의존성": 거짓, "PeerDependencies": {}, "감가 상각": 거짓, "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz", "_integrity": "SHA1-ASBRSZT7XZE47TUTDW3I/NP+PAG =", "_shasum": "6926D1B194FBC737B8EED513756DE2FCDA7EA408", "_shrinkwrap": null, "빈": NULL, "_id": "[email protected]" }, "유형": "최종 관리" } }
위의 _shasum
속성 6926d1b194fbc737b8eed513756de2fcda7ea408
은 tar
패키지의 hash
이며, hash
의 첫 번째 숫자 6926
디렉토리에 입력했을 때 첫 두 레벨의 캐시 디렉토리입니다.
위의 캐싱 전략은 NPM V5 버전에서 시작하여 각 캐시 된 모듈은 모듈 이름 형태의 ~/.npm 폴더에 직접 저장되며 스토리지 구조는 {cache}/{name}/{버전입니다. }.
npm
캐시 데이터를 관리하기위한 몇 가지 명령을 제공합니다.
npm cache add
: 공식 설명은이 명령이 주로 npm
에서 내부적으로 사용되지만 지정된 패키지에 캐시를 수동으로 추가하는 데 사용될 수도 있습니다.npm cache clean
: 캐시 디렉토리의 모든 데이터를 삭제하려면 캐시 데이터의 무결성을 확인하려면 --force
매개 변수를 추가해야합니다.npm cache verify
: 캐시 데이터의 유효성과 무결성을 확인하고 정크 데이터를 정리하십시오.캐시 된 데이터를 기반으로 NPM은 다음과 같이 오프라인 설치 모드를 제공합니다.-
--prefer-offline
: 캐시 된 데이터가 일치하지 않으면 원격 창고에서 다운로드하십시오.--prefer-online
: 네트워크 데이터 요청이 실패한 경우이 모드는 최신 모듈을 얻을 수 있습니다.--offline
: 캐시 된 데이터가 존재하지 않으면 캐시 된 데이터를 직접 사용하지 마십시오.파일 무결성을 여러 번 언급 했으므로 파일 무결성 확인이란 무엇입니까?
tarball
패키지를 다운로드하기 전에 일반적으로 npm info
명령을 실행하면 npm
shasum
의해 계산 된 hash
값 hash
얻을 수 있습니다.
사용자는 종속성 패키지를 로컬로 다운로드 한 후 다운로드 프로세스 중에 오류가 발생하지 hash
hash
동일합니다. 다운로드 된 의존성이 다른 경우, 다른 경우.
전체 프로세스가 완료되었으므로 위의 프로세스를 요약하겠습니다.
.npmrc
파일을 확인하십시오. 우선 순위는 다음과 같습니다. Project-level .npmrc
파일> 사용자 수준 .npmrc
파일> 글로벌 레벨 .npmrc
파일> NPM 내장 내장. .npmrc
파일
프로젝트에 lock
파일이 있는지 확인하십시오.
lock
파일 없음 :
npm
원격 창고에서 패키지 정보를 얻고package.json
기반으로 종속성 node_modules
루트 디렉토리에서.node_modules
에서.npm
에서 원격 창고 다운로드 패키지는npm
캐시 디렉토리로 복사node_modules
로 추출합니다.lock
package-lock.json
package.json
node_modules
node_modules
lock
을 생성합니다package-lock.json
.위의 프로세스는 npm install package --timing=true --loglevel=verbose
npm install
의 일반적인 프로세스를 간략하게 설명합니다. 특정 패키지의 설치 프로세스 및 세부 사항.
yarn
2016
에 출시되었습니다. 그 당시 npm
여전히 V3
언급 한 것처럼 package-lock.json
파일이 없었습니다. 개발자의. 이 시점에서 yarn
사는 다음과 같습니다.
위는 공식 웹 사이트에서 언급 된 yarn
의 장점이며, 그 당시에는 여전히 매우 매력적이었습니다. 물론 npm
나중에 자체 문제를 실현하고 후속 최적화 ( lock
파일, 캐시, 기본값)에서 yarn
의 그림자 yarn
볼 수 있습니다 디자인은 여전히 매우 좋습니다.
의존성
yarn
npm v3
yarn.lock
yarn.lock
.
자율 파일입니다.이 파일을 직접 편집하지 마십시오. # 원사 잠금 파일 v1 [email protected] : 버전 "1.0.1" "https://registry.yarnpkg.com/base64-js/-/base64-js-1.0.1.tgz#6926D1B194FBC737B8EED513756DE2FCDA7EA408". 무결성 SHA1-ASBRSZT7XZE47TUTDW3I/NP+PAG = base64-js@^1.0.2 : 버전 "1.3.1" "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75ddd07e71ed08c736abc5fac4dbf8df1" 무결성 SHA512-MLQ4I2QO1YTVGWFWMCNGKO // JXAQUEZVWEKTJGQFM4JIK0KU+YTMFPLL8J+N5MSPOFJHWOAG+9YHB7BWAHM36G == buffer@^5.4.3 : 버전 "5.4.3" "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.3fbc9c69eb713d323e3fc1a895ee0710c072115". 무결성 SHA512-ZVJ65TKFEIT3I6AJ5BIVJDZJJQQGS4O/SNOEZG1F1KYAP9NU2JCUDPWZRSJTHMMMZG0H7BZKN4RNQPIMHUXWX2A == 종속성: Base64-JS "^1.0.2" IEEE754 "^1.1.4" IEEE754@^1.1.4 : 버전 "1.1.13" "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95AA181FD87D37F55C32BBCB6708B84" 무결성 SHA512-4VF7I2LYV/HAWERSO3XMLMKP5EZ83I+/CDLUXI/IGTS/O1SEJBNHTTNXZMRZFVOUQJ7LZQHKKHKKHKKKHKKHKKHKTGSFDLWZTG == INGORE@^5.1.4 : 버전 "5.1.4" "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf를 해결했습니다." integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
It can be seen that it is quite similar to the package-lock.json
file, and there are some differences:
package-lock.json
uses json
format, yarn.lock
uses a custom formatyarn.lock
The yarn.lock
중성자 종속성의 버전 번호는 고정되지 않았으므로 yarn.lock
만으로는 node_modules
디렉토리 구조를 결정할 수 없으며 package.json
파일과 조정해야합니다. 그리고 package-lock.json
결정하기 위해 하나의 파일 만 있으면됩니다.yarn
의 캐싱 전략은 npm v5
이전과 매우 유사합니다. 캐시 된 데이터의 디렉토리를보기 위해 명령 yarn cache dir
사용하십시오.
기본적으로
yarn
prefer-online
모드를 사용합니다. 즉, 네트워크 데이터가 먼저 사용되면 캐시 된 데이터가 요청됩니다.
이 기사를 읽은 후에는 다음과 같이 도움이되기를 바랍니다.
pacakge.json
의 세부 구성을 이해하여npm
의 버전 관리 메커니즘을 마스터하고 합리적으로 종속성을 구성 할 수 있습니다npm
npm install
원리 package-lock.json
이해합니다