개발👩‍💻/기타

node.js 의 path, import meta, fileURLToPath 모듈 경로

gigibean 2022. 7. 4. 21:10
728x90

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
  • 윈도우
    $ echo %PATH%
    C:\Windows\system32;C:\Windows;C:\Program Files\node\;C:\Program Files\python\;C:\Program Files\java
    /Users/user는 윈도우에서는 하나의 디렉토리로 인식되며, C:\Users\user는 유닉스에서는 하나의 디렉토리로 인식된다. 각 운영체제에 따라 다른 디렉토리 구조를 가지기 때문에 파일이나 디렉토리의 경로를 단순히 문자열을 이용하여 접근하면 프로그램이 특정 운영체제에서만 돌아갈 위험이 생기게 된다.

즉, 파일이나 디렉토리의 경로를 단순히 문자열을 이용하여 접근하면 프로그램이 특정 운영체제에서만 돌아갈 위험이 생기게 되는데,

node.js에서는 path모듈을 제공하여 자바스크립트 개발자들이 이러한 위험없이 경로를 다룰 수 있도록 도와준다.

불러오기

path 모듈은 node.js에 내장되어 있기 때문에 별도의 라이브러리 설치없이 바로 불러와 사용할 수 있다.

CommonJS vs ES Modules

CommonJS 모듈 시스템을 사용하는 프로젝트에서는 require 키워드로 불러오고, ES 모듈 시스템을 사용하는 프로젝트에서는 import 키워드를 사용할 수 있다.

경로 구분자

path 모듈은 운영체제 별로 상이할 수 있는 경로 관련 구분자를 sepdelimiter 라는 속성으로 제공한다.
예를 들어 MacOS를 사용하고 있는 곳에서는
아래와 같이 속성값을 확인할 수 있다.

> { sep: path.sep, delimiter: path.delimiter }
{ sep: '/', delimiter: ':' }

경로 만들기(join, resolve)

운영체제 별로 경로를 구분짓는 방법이 상이하기 때문에 코드가 실행되는 운영체제를 고려하여 경로를 만들어내는 것은 매우 중요하다.

pathjoin()함수는 여러 개의 문자열을 가변 인자(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 | MDN
import.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

 

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

 

반응형