'2016/06'에 해당되는 글 13건

  1. 2016.06.12 [node.js] 노드 패키지 관리에 대하여
반응형

node.js 의 생태계는 매우 광범위하다고 할 수 있다. 노드 패키지 관리는 npm이라는 패키지관리자를 이용한다. 기본적으로 npm은 npm 레지스트리(https://www.npmjs.org/)에서 가져온다.


1. npm install

 npm install <모듈이름> 으로 명령을 내리면 해당 모듈이름의 가장 최신의 버전을 현재 디랙토리의 node_modules에 설치한다. npm install 이라고만 명령을 내리면 현재 디렉토리의 package.json 파일에 열거된 모든 모듈을 설치한다. 

 모듈을 전역으로 설치가 가능한데, 이때 루트권한이 필요하다. --global 옵션을 주면 전역으로 설치 가능하다. 전역 설치를 위한 prefix는 다음과 같이 변경 가능하다. npm config set prefix [Directory] 이럴 경우 디렉토리를 해당 유저가 권한이 있는 곳을 지정해 주면 루트권한 없이 전역 객체 설치가 가능하다.


2. npm search

 npm 레지스트리를 질의하는 방법이다. 다음과 같이 npm 레지스트리에 해당 키워드가 들어간 모듈을 검색할 수 있다. npm search [keyword] 다음은 npm search language로 질의한 내용의 일부 캡춰 화며니다.


3. package.json

 npm install명령은 현재 디렉토리에 있는 package.json을 읽어서 나열된 패키지를 설치한다. 다음은 express-generator로 express 앱 코드를 생성한 폴더의 package.json의 예이다.

{

  "name": "hello_exp",

  "version": "0.0.0",                                                 

  "private": true,

  "scripts": {

    "start": "node ./bin/www"

  },

  "dependencies": {

    "body-parser": "~1.13.2",

    "cookie-parser": "~1.3.5",

    "debug": "~2.2.0",

    "express": "~4.13.1",

    "jade": "~1.11.0",

    "morgan": "~1.6.1",

    "serve-favicon": "~2.3.0"

  }

} 

1. name: 모듈의 이름, npm install <모듈이름> 의 모듈이름과 같다. node, js등이 들어가면 안되며, url에 사용 불가능한 문자는 피해야 한다.


2. version: 주버전, 부버전, 패치 형태로 표현된다.


3. script : 는 npm run 명령으로 실행할 스크립트이다. npm run start 명령을 주면 node ./bin/www 를 실행한다.


4. dependencies : 는 해당 앱을 실행하기 위해 필요한 모듈들이다. npm install하게 되면 여기에 열거된 모듈들을 설치한다.






 package.json을 편집기로 직접 작성하는 것은 권장되지 않는다. npm init 과 같은 명령으로 package.json을 생성하기를 권장한다. 


4. node_modules 디렉토리 및 모듈 의존성

 node_modules 디렉토리에 로컬 모듈들이 설치된다. 해당 모듈에 들어가 보면 하부 디렉토리로 node_modules가 또 있는데, 모듈마다 해당 모듈에 필요한 모듈들을 node_modules에 설치한다. 따라서 중복이 있을 수 있다.


5. require()

 require() 함수는 특정 모듈을 현재 프로그램에 로딩하기 위한 노드 전용 함수이다. 현재 위치에서 해당 모듈을 찾는데, 해당 위치에 명시한 모듈을 찾지 못하면 다음과 같이 탐색하여 모듈을 찾는다.

 1) 핵심 모듈인지 확인, 2) 현재 디렉토리의 node_modules 디렉토리 검사, 3) 디렉토리를 하나 거슬러 올라가 node_modules 디렉토리가 있따면 검사, 4) 최상위 디렉토리에 도달할 떄까지 반복, 5) 전역 디렉토리 검사 이런 과정에도 해당 모듈을 찾을 수 없으면 오류를 던진다.

 require()는 지정한 모듈의 자바스크립트를 실행한다. 그래서 String 과 같은 기본 타입의 프로토타입에 메소드를 추가할 수 있다. require()는 데이터베이스 초기화, 로그 싱글컨 생성, 내장 타입과 객체 변경과 같은 '한번만 동작하는' 코드를 수행하기 위해서 사용할 수 있다. require() 로 모듈을 불러올 때 파일 경로를 명시할 수 있다.


6. module.exports

  node.js에서는 모듈이 하나의 파일이 된다. 이 모듈에서 외부에서 공개하고자 하는 함수는 module.exports의 속성으로 지정해 줘야 한다. 나머지는 private 한 상태가 된다. 다음과 같은 x.js 모듈에서는 외부에서 호출 가능한 함수는 hello, world  두가지 이다. counter 변수와 increase는 접근이 불가능하다. 또한 require는 한번 실행되면 캐싱되어 다시 동일한 모듈에 대하여 다시 실행하지 않는다.

[x.js 모듈]

var counter=0;

function increase(){

        counter++;

}

module.exports.hello=function(){

        increase();

        console.log('hello:'+counter);

};

module.exports.world=function(){

        increase();

        console.log('world:'+counter);

};

console.log("Module is being loaded.."); 


[실행 예]

> var test=require('./x.js')

Module is being loaded..

> test.hello()

hello:1

> test.world()

world:2

> test.counter

undefined

> test.increase()

TypeError: test.increase is not a function

  (..중략..)

> var test2=require('./x')

> test2.hello()

hello:3  


 캐시는 파일 경로를 키로 사용한다. 경로를 바꿔서 지정하면 같은 모듈이라도 다른 모듈처럼 처리된다.


7. npm link

 npm link는 해당 모듈에 전역 심벌릭 링크를 설정하는 방법이다. 마치 외부 모듈이 현재 프로젝트의 지역 node_modules 디렉터리에 설치된 것처럼 사용할 수 있도록 해준다. 

 우선 global link를 만들고자 하는 패키지 디렉토리로 이동한다. 예를 들어 ~/projects/a-module 이라고 하면 cd ~/projects/a-module 로 이동하고 npm link 를 입력한다. (package.json 에 a 모듈로 선언)

 그리고 이 모듈을 사용하고자 하는 패키지의 디렉토리로 이동하여 npm link a 라고 하면 ~/project/a-module 에 있는 a 모듈을 이용 가능하다. 물론 ~/projects/a-module 에 무엇인가를 변경시키게 되면 글로벌 링크를 이용하는 패키지는 변경된 a 모듈을 참조하게 된다.


반응형
Posted by alias
,