node.js 의 path, import meta, fileURLToPath 모듈 경로
node.js 의 path, import meta, fileURLToPath 모듈 경로
운영체제
파일이나 디렉토리의 경로를 다루는 데 필요한 모듈인 path
경로처리를 할 때 은근히 오류 발생의 소지가 있기 때문에 따로 설정하게 되면 오류가 생길 수 있다.
예를 들어 유닉스 계열의 OS와 윈도우 계열의 OS는 서로 다른 문자로 디렉토리 구조를 표현한다.
유닉스 계열 운영체제는 /
문자를 사용하는 반면 윈도우 운영체제는 ₩
문자를 사용한다.
- 유닉스 계열
$ pwd /Users/user
- 윈도우
$ cd C:\Users\user
또한 이 두 운영체제는 PATH
환경변수를 표현할 때도 서로다른 문자를 사용하여 여러 경로를 나열한다.
유닉스 계열의 운영체제에서는 :
문자를 사용하는 반면, 윈도우 운영체제는 ;
문자를 사용한다.
- 유닉스 계열
/Users/user/.nvm/versions/node/v17.0.1/bin:/Users/user/.pyenv/shims:/Users/user/.pyenv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
- 윈도우
/Users/user는 윈도우에서는 하나의 디렉토리로 인식되며, C:\Users\user는 유닉스에서는 하나의 디렉토리로 인식된다. 각 운영체제에 따라 다른 디렉토리 구조를 가지기 때문에 파일이나 디렉토리의 경로를 단순히 문자열을 이용하여 접근하면 프로그램이 특정 운영체제에서만 돌아갈 위험이 생기게 된다.$ echo %PATH% C:\Windows\system32;C:\Windows;C:\Program Files\node\;C:\Program Files\python\;C:\Program Files\java
즉, 파일이나 디렉토리의 경로를 단순히 문자열을 이용하여 접근하면 프로그램이 특정 운영체제에서만 돌아갈 위험이 생기게 되는데,
node.js
에서는 path
모듈을 제공하여 자바스크립트 개발자들이 이러한 위험없이 경로를 다룰 수 있도록 도와준다.
불러오기
path
모듈은 node.js
에 내장되어 있기 때문에 별도의 라이브러리 설치없이 바로 불러와 사용할 수 있다.
CommonJS 모듈 시스템을 사용하는 프로젝트에서는 require
키워드로 불러오고, ES 모듈 시스템을 사용하는 프로젝트에서는 import
키워드를 사용할 수 있다.
경로 구분자
path
모듈은 운영체제 별로 상이할 수 있는 경로 관련 구분자를 sep
와 delimiter
라는 속성으로 제공한다.
예를 들어 MacOS를 사용하고 있는 곳에서는
아래와 같이 속성값을 확인할 수 있다.
> { sep: path.sep, delimiter: path.delimiter }
{ sep: '/', delimiter: ':' }
경로 만들기(join, resolve)
운영체제 별로 경로를 구분짓는 방법이 상이하기 때문에 코드가 실행되는 운영체제를 고려하여 경로를 만들어내는 것은 매우 중요하다.
path
의 join()
함수는 여러 개의 문자열을 가변 인자(variadic arguments)로 받아서 하나의 완전한 경로로 조합해준다.
> path.join("Users", "user", "test.txt")
'Users/user/test.txt'
MacOS에서는 위와 같이 / 문자를 사용하여 디렉토리를 구분해주고 있습니다. 동일한 코드를 윈도우에서 실행했더라면 Users\user\test.txt
가 반환되었을 것.
경로를 만들어 내는 또 다른 방법으로 resolve() 함수를 사용할 수도 있는데 마치 터미널에서 cd 명령어를 연속해서 날리는 것처럼 작동을 하고 항상 절대 경로를 반환한다.
> path.resolve(“/Users”, “../user”, “test.txt”)
‘/user/test.txt’
예를 들어, 위와 같이 resolve() 함수를 사용하면, 터미널에서 아래와 같이 디렉토리를 이동 후에 도착하는 파일의 경로를 얻게 된다.
join()은 각 문자열을 구분자로 연결해주는 함수라면,
resolve()는 `cd` 명령어를 사용하는 듯이 경로를 조합하게 된다.
$ cd Users
$ cd ../user
$ ls test.txt
$ path.resolve(‘/a’, ‘b’, ‘c’)
‘C:\a\b\c’
$ path.resolve(‘/a’, ‘/b’, ‘c’)
‘C:\b\c’
$ path.resolve(‘/a’, ‘/b’, ‘/c’)
‘C:\c’
여기서 눈 여겨 볼 부분은 개발자가 경로 구분자로 / 문자와 \ 문자 중 어떤 것을 사용하든 크게 상관이 없다는 것이다.
디렉토리 얻기(dirname)
dirname()
함수를 사용하면 주어진 경로에서 파일 이름을 제외한 디렉토리 부분은 얻을 수 있다.
> path.dirname("/Users/user/test.txt")
'/Users/user'
파일 이름 얻기(basename)
basename()
함수를 사용하면 주어진 경로에서 파일이름을 얻을 수 있다.
> path.basename("/Users/user/test.txt")
'test.txt'
두번째인자에 .
를 포함한 확장자를 넘기면 순수 파일 이름만 얻을 수도 있다.
> path.basename("/Users/user/test.txt". ".txt")
'test'
파일 확장자 얻기 (extname)
extname()
함수는 주어진 경로에서 파일의 .
를 포함한 확장자를 얻을 수 있다.
> path.extname("/Users/user/test.txt")
'.txt'
절대 경로인지 알아내기(isAbsolute)
경로가 절대 경로인지 상대 경로인지 알아내려면 isAbsolute()
함수를 사용하면 된다.
> path.isAbsolute("/Users/user/test.txt")
true
> path.isAbsolute("./test.txt")
false
경로 단순화 하기 (normalize)
./, ../, / 문자를 남용한 경로는 파일 시스템에서 정확히 어느 위치를 나타내는지 햇갈리는 경우가 있다. 이럴 때는 normalize() 함수를 사용하여 불필요한 부분을 정리하여 경로를 단순화 할 수 있다.
> path.normalize(“/Users/../user/test.txt”)
‘/user/test.txt’
상대경로구하기 (relative)
간혹 어떤 경로를 기준으로 다른 경로의 상대 경로를 알고 싶은 경우 relative() 함수에 기준의 되는 경로를 첫번째 인자로 대상이 되는 경로를 두번째 인자로 넘기면 상대 경로를 구해줍니다.
> path.relative(“/Users”, “/Users/user/test.txt”)
‘user/test.txt’
> path.relative(“/Users/user/test.txt”, “/Applications”)
‘../../../Applications’
import.meta
import.meta - JavaScript | MDNimport.meta
객체는 컨텍스트별 메타 데이터를 JS 모듈에 노출한다. 여기에는 모듈의 URL 과 같은 모듈에 대한 정보가 포함된다.
Syntax
import.meta
Description
해당 신텍스는 import
라는 키워드와 .
그리고 meta
라는 식별자로 구성되어 있다.
통상적으로 .
의 왼쪽에 있는 부분은 프로퍼티에 대한 접근이 이루어지는 객체이지만, 여기서 import
는 실제 객체가 아니다.
import.meta
객체는 null 프로토타입과 함계 ECMAScript 구현에 의해 생성된다. 객체는 확장 가능하고, 객체의 프로퍼티는 쓰기, 열거, configurable이 가능하다
Examples
using import.meta
my-module.js
라는 모듈이 있고,
<script type="module" src="my-module.js"></script>
import.meta
객체를 사용해서 해당 모듈(my-modules.js)의 메타 정보에 접근할 수 있다.
console.log(import.meta); // { url: "file:///home/user/my-module.js" }
모듈의 베이스 url 를 가리키는 url 프로퍼티를 가지고 있는 객체를 리턴한다.
이것은 외부 스크립트의 경우 스크립트를 가져온 URL이거나 인라인 스크립트의 경우 포함하는 문서의 문서 기본 URL입니다.
URL module
URL | Node.js v18.4.0 Documentation
fileURLToPaht(url)
URL | Node.js v18.4.0 Documentation
- url | The file URL string or URL object to convert to a path.
- Returns: The fully-resolved platform-specific Node.js file path.
참조)
https://www.daleseo.com/js-node-path/
import.meta - JavaScript | MDN