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/
Node.js의 path 모듈로 경로 다루기
Engineering Blog by Dale Seo
www.daleseo.com
CommonJS vs ES Modules
배경 함수들끼리 데이터를 공유하고 싶다면 어떻게 해야할까? 전역 스코프에 해당 데이터를 둔다면 다른 내부 요소에 의해 망가질 수도 있고, 순서가 뒤엉켜 전역 스코프의 요소가 존재하지 않
hini7.tistory.com
import.meta - JavaScript | MDN
import.meta - JavaScript | MDN
The import.meta object exposes context-specific metadata to a JavaScript module. It contains information about the module, like the module's URL.
developer.mozilla.org
'개발👩💻 > 기타' 카테고리의 다른 글
geeksforgeeks contribute 하기 (0) | 2022.09.17 |
---|