SHIN
Node.js 실전 팁 20선
20편Windows와 Unix 경로 구분자가 다르기 때문에 문자열 연결 대신 path 모듈을 항상 사용해야 합니다.
import path from 'path';
const filePath = '/project/src/utils/helper.ts';
path.basename(filePath) // 'helper.ts'
path.basename(filePath, '.ts') // 'helper'
path.extname(filePath) // '.ts'
path.dirname(filePath) // '/project/src/utils'
path.parse(filePath)
// { root: '/', dir: '/project/src/utils', base: 'helper.ts',
// ext: '.ts', name: 'helper' }// join: 세그먼트를 OS 구분자로 이어붙임
path.join('/foo', 'bar', 'baz.txt') // '/foo/bar/baz.txt'
path.join('/foo', '../bar') // '/bar'
path.join('src', 'components', 'App') // 'src/components/App' (상대경로)
// resolve: 절대경로를 만듦 (오른쪽에서 왼쪽으로 처리)
path.resolve('/foo', '/bar') // '/bar' (절대경로면 이전 것 버림)
path.resolve('/foo', 'bar') // '/foo/bar'
path.resolve('src', 'app.js') // CWD + '/src/app.js'// CommonJS: __dirname, __filename 기본 제공
const dir = __dirname;
// ESM에서는 직접 구현
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
// 프로젝트 루트 기준 경로
const ROOT = path.resolve(__dirname, '../..');
const CONFIG_PATH = path.join(ROOT, 'config', 'app.json');
const UPLOAD_DIR = path.join(ROOT, 'public', 'uploads');
// 확장자 변경
function changeExt(filePath, newExt) {
const parsed = path.parse(filePath);
return path.format({ ...parsed, base: '', ext: newExt });
}
changeExt('src/app.ts', '.js'); // 'src/app.js'path.relative('/data/demo', '/data/demo/file.txt') // 'file.txt'
path.relative('/data/demo', '/data/other.txt') // '../other.txt'
// 임포트 경로 자동 생성에 유용
function getImportPath(from, to) {
const rel = path.relative(path.dirname(from), to);
const noExt = rel.replace(/\.tsx?$/, '');
return noExt.startsWith('.') ? noExt : './' + noExt;
}path.normalize('/foo//bar/../baz/') // '/foo/baz'
path.normalize('C:\\Users\\..\\temp') // 'C:\temp' (Windows)규칙: 경로를 직접 문자열 연결(
+또는 템플릿 리터럴)로 만들지 말고 항상path.join또는path.resolve를 사용하세요.