모듈 경로 확인 규칙
숙련된 C 프로그래머는 새 프로그램을 작성할 때 make 파일부터 시작합니다. 마찬가지로, NodeJS를 사용하여 프로그램을 작성하기 전에, 집을 수리할 때 먼저 비계를 세우는 것처럼, 좋은 시작을 위해 먼저 디렉터리 구조와 코드의 배포 방법을 준비해야 합니다. 본 장에서는 이와 관련된 다양한 지식을 소개한다.
모듈 경로 확인 규칙
require 함수는 슬래시(/) 또는 드라이브 문자(C:)로 시작하는 절대 경로와 ./로 시작하는 상대 경로도 지원한다는 것을 이미 알고 있습니다. 그러나 이 두 경로는 모듈 간에 강한 결합 관계를 형성합니다. 모듈 파일의 저장 위치가 변경되면 이 모듈을 사용하는 다른 모듈의 코드도 이에 맞게 조정되어야 하므로 전체적으로 문제가 됩니다. . 따라서 require 함수는 foo/bar와 유사하게 작성된 세 번째 형태의 경로를 지원하며, 모듈 위치를 찾을 때까지 다음 규칙에 따라 경로를 차례로 구문 분석합니다.
내장 모듈
require 함수에 전달된 이름이 NodeJS 내장 모듈 이름인 경우 경로 분석이 수행되지 않고 require('fs')와 같이 내보낸 내부 모듈의 객체가 직접 반환됩니다.
node_modules 디렉터리
NodeJS는 모듈 저장을 위한 특별한 node_modules 디렉터리를 정의합니다. 예를 들어, 모듈의 절대 경로는 /home/user/hello.js입니다. require('foo/bar') 메소드를 사용하여 모듈에 모듈을 로드하면 NodeJS는 다음 경로를 순서대로 사용하려고 시도합니다. .
/home/user/node_modules/foo/bar /home/node_modules/foo/bar /node_modules/foo/bar
NODE_PATH 환경 변수
PATH 환경 변수와 유사하게 NodeJS에서는 NODE_PATH 환경 변수를 통해 추가 모듈 검색 경로를 지정할 수 있습니다. NODE_PATH 환경 변수에는 하나 이상의 디렉터리 경로가 포함되어 있으며 Linux에서는 :로, Windows에서는 ;로 구분됩니다. 예를 들어 다음 NODE_PATH 환경 변수가 정의됩니다.
NODE_PATH=/home/user/lib:/home/lib
require('foo/bar')를 사용하여 모듈을 로드할 때 NodeJS는 다음 경로를 순서대로 시도합니다.
/home/user/lib/foo/bar /home/lib/foo/bar
팩
우리는 JS 모듈의 기본 단위가 단일 JS 파일이라는 것을 이미 알고 있지만 더 복잡한 모듈은 여러 하위 모듈로 구성되는 경우가 많습니다. 관리 및 사용을 용이하게 하기 위해 여러 하위 모듈로 구성된 대규모 모듈을 패키지라고 부르고 모든 하위 모듈을 동일한 디렉터리에 넣을 수 있습니다.
패키지를 구성하는 모든 하위 모듈 중에는 엔트리 모듈이 있어야 하며, 엔트리 모듈의 내보내기 개체는 패키지의 내보내기 개체로 사용됩니다. 예를 들어 다음과 같은 디렉터리 구조가 있습니다.
- /home/user/lib/ - cat/ head.js body.js main.js
cat 디렉토리는 3개의 하위 모듈을 포함하는 패키지를 정의합니다. main.js는 입력 모듈 역할을 하며 그 내용은 다음과 같습니다.
var head = require('./head'); var body = require('./body'); exports.create = function (name) { return { name: name, head: head.create(), body: body.create() }; };
다른 모듈에서 패키지를 사용하는 경우 해당 패키지의 진입 모듈을 로드해야 합니다. 위의 예를 계속해서 require('/home/user/lib/cat/main')을 사용하면 목표를 달성할 수 있지만 경로에 항목 모듈 이름이 나타나는 것은 좋은 생각이 아닌 것 같습니다. 따라서 패키지가 단일 모듈처럼 작동하도록 하려면 약간의 추가 작업을 수행해야 합니다.
index.js
모듈의 파일명이 index.js인 경우, 모듈을 로딩할 때 모듈 파일 경로 대신에 모듈이 위치한 디렉터리의 경로를 사용할 수 있습니다. 따라서 위의 예에 따르면 다음 두 가지가 있습니다. 진술은 동일합니다.
var cat = require('/home/user/lib/cat'); var cat = require('/home/user/lib/cat/index');
이런 방식으로 처리한 후에는 패키지 디렉터리 경로만 require 함수에 전달하면 됩니다. 전체 디렉터리가 단일 모듈로 사용되는 것처럼 느껴져 더욱 전체적인 느낌을 줍니다.
package.json
항목 모듈의 파일 이름과 저장 위치를 맞춤 설정하려면 패키지 디렉터리에 package.json 파일을 포함하고 여기에 항목 모듈의 경로를 지정해야 합니다. 위 예제의 cat 모듈은 다음과 같이 리팩터링될 수 있습니다.
- /home/user/lib/ - cat/ + doc/ - lib/ head.js body.js main.js + tests/ package.json
package.json의 내용은 다음과 같습니다.
{ "name": "cat", "main": "./lib/main.js" }
이런 방식으로 require('/home/user/lib/cat')를 사용하여 모듈을 로드할 수도 있습니다. NodeJS는 패키지 디렉터리의 package.json을 기반으로 항목 모듈의 위치를 찾습니다.