WEB/Node.js

서드파티 모듈 (심화)

Hard_Try 2021. 3. 5. 00:47

 

Node.js에서 모듈이 검색되는 순서

 

 

  • package.json 이라는 파일을 가진 디렉토리가 패키지다
  • 하나의 서드 파티 모듈은 하나의 패키지다
  • 서드 파티 모듈을 관리할 떄 쓰는 npm은 node package manager의 줄임말이다.

 

 

 

  • dependency 패키지는 남은 dependency가 없어질 때 까지 하위 의존 패키지를 지속적으로 설치한다.

 

  • engines는 최소 필요한 버전이 적혀있다.
  • name 은 패키지의 이름이다.
  • version 은 패키지의 버전이다. name필드와 version 필드를 결합하면 특정 패키지의 특정 버전을 나타낼 수 있다.
  • description 은 패키지에 대한 설명이다. 패키지 검색시 여기 있는 내용도 검색 기준으로 활용되기 때문에 자신의 패키지가 잘 검색되도록 하려면 여기에 알맞은 설명을 써두는게 좋다.
  • keywords 패키지에 대한 키워드들이다.
  • homepage 패키지 관련 사이트의 URL이다.
  • bugs 패키지를 사용하다가 발생하는 버그들을 신고할 수 있는 URL이나 이메일주소
  • license 패키지의 라이센스 정보가 담겨있다.
  • author 패키지를 만든 사람 , contributors 패키지를 만드는데 기여한사람
  • main : require('패키지 이름') 로 로드했을 때 실제로 로드되는 파일의 이름이 적혀있는 필드.

    예를 들어 A라는 패키지가 있고 package.json 파일의 내용 중, main 필드에 start.js라는 값이 적혀있다고 가정한다. js 파일안에서 require('A') 코드는 start.js 파일을 로드하고 exports, module.exports 등으로 외부에 공개한 객체를 가져오게 된다. 대부분의 패키지가 이런 방식으로 사용되기 때문에 보통 package.json 파일에는 main 필드가 존재한다.

  • man 이 패키지의 사용 설명사가 담긴 파일들의 경로가 적혀있다.
  • repository 이 패키지의 코드가 관리되고 있는 레포지토리의 주소를 나타낸다.
  • scripts : npm으로 간편하게 실행할 수 있는 스크립트 파일들의 정보가 담겨있다.
    "scripts" : {
    	"test" : "실행할 커맨드 A"
    }

    이런 식으로 적혀있으면 터미널에서

     

    npm run test

    이렇게 치고 실행했을 때 실행할 커맨드 A 가 실행된다.

     

    console.log('Test scripts!')

    sample.js 파일에 위와 같이 저장하고

     

    "scripts" : {
    	"test" : "node sample.js"
    }

    scripts 필드에 위와 같이 저장하면

     

    터미널에서 npm run test 을 치고 실행하면 node sample.js 가 실행되고

    Test scripts! 구문이 출력된다.

     


     

    Semantic Version

     

    X. Y. Z
    • X를 메이저 버전
    • Y를 마이너 버전
    • Z를 패치 버전이라고 한다.

     

    이 패키지의 버전을 업데이트할 때 일정한 규칙이 있는데 그전에 API를 알고 가야한다.

     

    API

     

    Z : API에 변화를 주지 않는 범위 내에서 변화가 이루어진 경우 업데이트. 버그 해결, 알고리즘 변경으로 인한 효율성 증가 등에 해당

    Y : API와 호환되는 API 상의 변화가 발생했을 때 업데이트. 새로운 API가 생겼지만 이미 존재했던 API 들은 건드리지 않는 범위의 변화에 해당

    X : 이전 버전의 API와 호환되지 않는 API 상의 변화가 발생했을 때 업데이트. 기존 API를 삭제했거나 이름을 바꾸는 등의 변화가 이것에 해당

     

     

    Version Range Syntax

    왼쪽에 물결 모양 기호가 붙어있는 버전. 정식 명칭은 틸드(Tilde)이다.

     

    Basic Syntax
    • "version" : "2.3.1" : 정확히 2.3.1의 버전의 version 패키지가 필요하다.
    • "version" : ">2.3.1" : 2.3.1보다 높은 버전의 version 패키지가 필요하다.
    • "version" : "2.3.1 || ≥2.5.0 < 3.1.2" : 2.3.1버전 또는 2.5.0 이상, 3.1.2버전 미만의 version 패키지 필요하다.

     

    Advanced Syntax
    • Hyphen Range

      "version" : "2.3.1 - 3.1.2" : 2.3.1이상 3.1.2 이하의 version 패키지 필요

      주의할 점은 빈자리는 0이 있는 것으로 친다는 점

      예를 들어 2.3.1 - 3.1(3.1.99999..) 이면 2.3.1이상 3.2.0 미만을 의미한다.

    • X-range
      1. "version" : "*"

        어느 버전의 version 패키지도 상관없다

      1. "version" : "3.x"

        3이상 4미만의 버전을 요한다.

      1. "version" : "3.1.x"

        3.1.0 이상 3.2.0 미만 버전을 요한다.

    • Tilde Range
      1. "version" : "~3.1.2"

        3.1.2 이상 3.2.0 미만

      1. "version" : "~3.1"

        3.1.0 이상 3.2.0 미만

      1. "version" : "~3"

        3.0.0 이상 4.0.0 미만

    • Caret Range
      1. "version" : "^1.2.3"

        가장 왼쪽의 0이 아닌 버전, 1이 바뀌지 않는 선에서 버전 업데이트 허용

        1.2.3 이상 2.0.0 미만

      1. "version" : "^0.2.3"

        2가 바뀌지 않는 선에서 버전 업데이트 허용

        0.2.3 이상 0.3.0 미만

      1. "version" : "^0.0.3"

        3이 바뀌지 않는 선에서 버전 업데이트 허용

        0.0.3 이상 0.0.4 미만

         

     

    package.json과 package-lock.json의 차이
    • 패키지를 공유할 때는 보통 그 안의 node_modules 디렉토리를 제외하고 공유합니다.
    • 이때 패키지 안의 package.json 파일 내용 중 dependencies 필드의 정보가
    • 공유받는 측에서 node_modules 디렉토리를 재생성(npm install)하는 데 사용되며
    • 이때 공유해준 사람과 공유받은 사람 간에 node_modules 디렉토리 내부의 차이가 발생하지 않도록 방지하려면
    • package-lock.json 파일도 package.json 파일과 함께 공유해줘야 합니다.

     

     

    npm 패키지 내 코드의 취약점 문제
    • npm outdated(현재 패키지에 설치된 하위 패키지들 중에 버전이 최신이 아닌 ㄱ서들이 무엇이 있는지 보여주는 명령어) , npm update(현재 자신의 패키지에 설치된 모든 패키지들을 최신 패키지로 업데이트해주는 명령어) 정기적으로 실행하기
      npm update [패키지명]@[버전]

       

     

    • npm audit, npm audit fix로 취약점 점검하기

      npm이 현재 설치된 패키지들의 이름과 버전을 보고, 발표된 취약점이 있는 것들은 그 정보를 출력해준다.

       

       

    패키지의 가용성 문제
    • 사용 중이던 패키지가 갑자기 사라져버리거나 관리되지 않고 방치될 수 있는 문제점이 있다.
    • 72시간이 지나면 함부로 삭제할 수 없도록 되어 있지만 앞으로도 잘 관리될 패키지인지를 확인하는 것은 여전히 중요하다.

     

  •  
  •  
  •  
  •  
  • Application Programming Interface의 약자로 '외부에서 사용할 수 있도록 공개된 함수'를 의미한다. 코드 내에서 require 함수를 써서 어떤 패키지를 로드하는 이유는 그 패키지가 공개하는 함수 등을 사용하기 위함이다. 이렇게 외부에서 사용할 수 있도록 공개된 함수 등을 모두 API라고 한다. 이 API의 변화를 기준으로 버전을 업데이트 해야한다.
  • 이렇게 이루어진 버전을 해석해보자면
  • dependencies 필드에 있는 각 패키지 이름 옆의 버전은 Semantic Version이라고 한다.