허원철의 개발 블로그

Node.js - 로컬 모듈 접근에 대한 다양한 개선 방법 본문

javasript

Node.js - 로컬 모듈 접근에 대한 다양한 개선 방법

허원철 2017. 10. 20. 15:39

Node.js를 접한지 얼마 되지 않았지만, 로컬 모듈을 접근할 시에 상대경로로 접근해야 하는 것에 대해서 불편함을 느꼈습니다. 그래서 다른 개발자분들은 어떤 식으로 해결하고 있을까? 라는 의문이 들었고 관련되서 멋진 gist을 접하게 되었습니다.


이 포스팅은 bran님께 허락을 구하고 작성한 글입니다.



문제점


예를 들어, 다음과 같이 depth가 깊은 모듈을 접근해야 합니다.


1
2
const Article = require('../../../models/article');   // (O)
const Article = require('models/article');            // (X)
cs



절대 경로로 접근할 순 없을까?


해당 링크를 참고하면 2017년을 기준으로 약 4년 동안에 많은 개발자들의 경험과 노하우를 엿볼 수 있습니다. bran님은 글을 작성하신 이후에도 또 다른 다양한 방법들을 추가해주셨습니다. 요약하자면,



1. IoC 컨테이너 구성


 IoC 컨테이너를 구성할 수 있는 electrolyte 모듈을 사용하는 것 입니다.

 


2. node_modules 하위에 링크파일 만들기


- Linux


1
ln -nsf node_modules app
cs


- Windows


1
mklink /D app node_modules
cs


※ CVS나 SVN을 사용하는 경우만 사용이 가능합니다. (Git에서는 사용 불가능)


 추가적으로 package.json에서 scripts - postinstall 옵션을 이용하여 만들 수 있습니다. ( scripts )



3. global 객체


 app.js에 다음과 같이 선언할 수 있습니다.


1
global.__base = __dirname + '/';
cs


 그리고, __base를 활용하여 require를 다음과 같이 작성할 수 있습니다.


1
const Aritcle = require(__base + 'app/models/article');
cs



4. 외장모듈 설치


 대표적인(?) app-module-path 설치


1
npm install app-module-path --save
cs


 app.js 최상위에 다음과 같이 선언합니다.


1
require('app-module-path').addPath(__dirname + '/app');
cs


- 이외에도 다양한 외장 모듈이 존재합니다. (본글 참고)



5. 환경변수 추가


 NODE_PATH 환경 변수를 application의 절대 경로로 설정하고 모듈을 기준으로 할 디렉토리로 만듭니다.


1) node app명령어를 실행 이전에


- Linux


1
export NODE_PATH=.
cs


- Windows


1
set NODE_PATH=.
cs


※ 다음과 같은 변수 설정은 해당 쉘이 열려있는 환경에서만 유지가 되므로, 전역으로 사용하려면 profile을 수정해야 합니다.


2) node가 실행하는 동안


- Linux


1
NODE_PATH=. node app
cs


- Windows


1
cmd.exe \C "set NODE=.&& node app"
cs



6. 시작 스크립트


 application을 실행할 수 있는 스크립트를 만드는 것 입니다.


1) Node.js에서 하는 방법(참고)


2) OS별 스크립트 작성


- Linux : 프로젝트 최상위에 shell script를 작성합니다.


1
2
#!/bin/sh
NODE_PATH=. node app.js
cs


- Windows : 프로젝트 최상위에 batch script를 작성합니다.


1
2
@echo off
cmd.exe \C "set NODE_PATH=.&& node app.js"
cs



7. Hack


 해당 방법은 [ 5 - node가 실행하는 동안 ]과 동일하지만, 노드의 버전 변경에 의해 동작하지 않을 수 있다는 것을 유의해야 합니다.

1
2
3
4
process.env.NODE_PATH = __dirname;
require.('module').Module._initPaths();
 
// ...
cs



8. Wrapper


1) require()를 래핑해서 사용하는 방법입니다.


1
2
3
global.rootRequire = function(name) {
    return require(__dirname + '/' + name);
}
cs


2) 또 다른 방법은 require() 래퍼 없이 기본적으로 같은 기능을 하는 초기 함수 를 항상 사용하는 것 입니다. 다른 방법과 달리 실제로 문서화된 기능입니다.


1
require.main.require('app/models/ariticle');
cs



출처


https://gist.github.com/branneman/8048520

'javasript' 카테고리의 다른 글

Node.js - 시작하기  (422) 2017.10.11
JSON vs JSONP  (415) 2017.06.16
Java Script - ECMAScript 6th(ES6)  (416) 2017.04.20
[펌] TypeScript  (412) 2016.12.04
Comments