JavaScriptμ `import.meta` κ°μ²΄λ₯Ό μ¬μΈ΅ λΆμνμ¬ λΈλΌμ°μ , Node.js λ± λ€μν νλ«νΌμμ λ°νμ νκ²½ κ°μ§ λ° λμ ꡬμ±μ μν κΈ°λ₯μ νμν©λλ€.
JavaScript Import Meta νκ²½ κ°μ§: λ°νμ 컨ν μ€νΈ λΆμ
νλ JavaScript κ°λ°μ μΉ λΈλΌμ°μ , Node.jsμ κ°μ μλ² μΈ‘ λ°νμ, μ£μ§ ν¨μ, μ¬μ§μ΄ μλ² λλ μμ€ν
μ μ΄λ₯΄κΈ°κΉμ§ λ€μν νκ²½μμ μ€νλλ μ½λλ₯Ό μμ±νλ κ²½μ°κ° λ§μ΅λλ€. λ°νμ 컨ν
μ€νΈλ₯Ό μ΄ν΄νλ κ²μ μ ν리μΌμ΄μ
λμμ μ‘°μ νκ³ , νκ²½λ³ κ΅¬μ±μ λ‘λνλ©°, μ°μν μ μ§μ μ±λ₯ μ ν μ λ΅μ ꡬννλ λ° μ€μν©λλ€. ECMAScript λͺ¨λ(ESM)κ³Ό ν¨κ» λμ
λ import.meta κ°μ²΄λ JavaScript λͺ¨λ λ΄μμ 컨ν
μ€νΈ λ©νλ°μ΄ν°μ μ‘μΈμ€ν μ μλ νμ€νλκ³ μμ μ μΈ λ°©λ²μ μ 곡ν©λλ€. μ΄ κΈμμλ import.metaμ κΈ°λ₯μ νμνκ³ λ€μν νλ«νΌμμ νκ²½ κ°μ§ λ° λμ ꡬμ±μ μ¬μ©λλ μ¬λ‘λ₯Ό 보μ¬μ€λλ€.
import.metaλ 무μμΈκ°μ?
import.metaλ JavaScript λ°νμμ΄ νμ¬ λͺ¨λμ λν λ©νλ°μ΄ν°λ‘ μλμΌλ‘ μ±μμ§λ κ°μ²΄μ
λλ€. μμ±μ νΈμ€νΈ νκ²½(μ: λΈλΌμ°μ , Node.js)μ μν΄ μ μλλ©°, λͺ¨λμ URL, μ€ν¬λ¦½νΈμ μ λ¬λ λͺ
λ Ήμ€ μΈμ, νκ²½λ³ μΈλΆ μ 보μ κ°μ μ 보λ₯Ό μ 곡ν©λλ€. μ μ λ³μμ λ¬λ¦¬ import.metaλ λͺ¨λ λ²μμ΄λ―λ‘ μ΄λ¦ μΆ©λμ λ°©μ§νκ³ λ€μν λͺ¨λ μμ€ν
μμ μΌκ΄λ λμμ 보μ₯ν©λλ€. κ°μ₯ μΌλ°μ μΈ μμ±μ νμ¬ λͺ¨λμ URLμ μ 곡νλ import.meta.urlμ
λλ€.
κΈ°λ³Έ μ¬μ©λ²: λͺ¨λ URL μ‘μΈμ€
import.metaμ κ°μ₯ κ°λ¨ν μ¬μ© μ¬λ‘λ νμ¬ λͺ¨λμ URLμ κ²μνλ κ²μ
λλ€. μ΄λ μλ κ²½λ‘λ₯Ό ν΄μνκ³ λͺ¨λ μμΉμ μλμ μΈ λ¦¬μμ€λ₯Ό λ‘λνλ λ° νΉν μ μ©ν©λλ€.
μμ: μλ κ²½λ‘ ν΄μ
λμΌν λλ ν 리μ μλ κ΅¬μ± νμΌμ λ‘λν΄μΌ νλ λͺ¨λμ κ³ λ €ν΄ λ³΄μΈμ. import.meta.urlμ μ¬μ©νλ©΄ κ΅¬μ± νμΌμ μ λ κ²½λ‘λ₯Ό ꡬμ±ν μ μμ΅λλ€.
// my-module.js
async function loadConfig() {
const moduleURL = new URL(import.meta.url);
const configURL = new URL('./config.json', moduleURL);
const response = await fetch(configURL);
const config = await response.json();
return config;
}
loadConfig().then(config => {
console.log('Configuration:', config);
});
μ΄ μμμμλ my-module.jsμ λμΌν λλ ν 리μ μμΉν config.json νμΌμ΄ λ‘λλ©λλ€. URL μμ±μλ μλ κ²½λ‘μμ μ λ URLμ λ§λλ λ° μ¬μ©λμ΄ νμ¬ μμ
λλ ν 리μ κ΄κ³μμ΄ κ΅¬μ± νμΌμ΄ μ¬λ°λ₯΄κ² λ‘λλλλ‘ ν©λλ€.
import.metaλ₯Ό μ¬μ©ν νκ²½ κ°μ§
import.meta.urlμ λ리 μ§μλμ§λ§, import.metaμμ μ¬μ©ν μ μλ μμ±μ νκ²½λ§λ€ μλΉν λ€λ₯Ό μ μμ΅λλ€. μ΄λ¬ν μμ±μ κ²μ¬νλ©΄ λ°νμ 컨ν
μ€νΈλ₯Ό κ°μ§νκ³ μ½λλ₯Ό κ·Έμ λ§κ² μ‘°μ ν μ μμ΅λλ€.
λΈλΌμ°μ νκ²½
λΈλΌμ°μ νκ²½μμ import.meta.urlμ μΌλ°μ μΌλ‘ λͺ¨λμ μ 체 URLμ ν¬ν¨ν©λλ€. λΈλΌμ°μ λ κΈ°λ³Έμ μΌλ‘ import.metaμμ λ€λ₯Έ μμ±μ λ
ΈμΆνμ§ μμ§λ§, μΌλΆ μ€νμ μΈ κΈ°λ₯μ΄λ λΈλΌμ°μ νμ₯ νλ‘κ·Έλ¨μ μ¬μ©μ μ μ μμ±μ μΆκ°ν μ μμ΅λλ€.
// Browser environment
console.log('Module URL:', import.meta.url);
// Attempt to access a non-standard property (may result in undefined)
console.log('Custom Property:', import.meta.customProperty);
Node.js νκ²½
Node.jsμμ ESM(ECMAScript λͺ¨λ)μ μ¬μ©ν λ import.meta.urlμ νμΌ μμ€ν
μ λͺ¨λ μμΉλ₯Ό λνλ΄λ file:// URLμ ν¬ν¨ν©λλ€. Node.jsλ import.meta.resolveμ κ°μ λ€λ₯Έ μμ±λ μ 곡νλ©°, μ΄λ νμ¬ λͺ¨λμ μλμ μΈ λͺ¨λ μ§μ μλ₯Ό ν΄μν©λλ€.
// Node.js environment (ESM)
console.log('Module URL:', import.meta.url);
console.log('Module Resolve:', import.meta.resolve('./another-module.js')); // Resolves the path to another-module.js
Deno νκ²½
JavaScript λ° TypeScriptλ₯Ό μν μ΅μ λ°νμμΈ Denoλ import.metaλ₯Ό μ§μν©λλ€. Node.jsμ μ μ¬νκ² import.meta.urlμ λͺ¨λμ URLμ μ 곡ν©λλ€. Denoλ ν₯ν import.metaμμ μΆκ°μ μΈ νκ²½λ³ μμ±μ λ
ΈμΆν μλ μμ΅λλ€.
λ°νμ κ°μ§
import.metaμμ μ¬μ© κ°λ₯ν μμ±μ λν κ²μ¬λ₯Ό λ€λ₯Έ νκ²½ κ°μ§ κΈ°μ (μ: window λλ processμ μ‘΄μ¬ μ¬λΆ νμΈ)κ³Ό κ²°ν©νλ©΄ λ°νμ 컨ν
μ€νΈλ₯Ό μμ μ μΌλ‘ κ²°μ ν μ μμ΅λλ€.
function getRuntime() {
if (typeof window !== 'undefined') {
return 'browser';
} else if (typeof process !== 'undefined' && process.versions && process.versions.node) {
return 'node';
} else if (typeof Deno !== 'undefined') {
return 'deno';
} else {
return 'unknown';
}
}
function detectEnvironment() {
const runtime = getRuntime();
if (runtime === 'browser') {
console.log('Running in a browser environment.');
} else if (runtime === 'node') {
console.log('Running in a Node.js environment.');
} else if (runtime === 'deno') {
console.log('Running in a Deno environment.');
} else {
console.log('Running in an unknown environment.');
}
console.log('import.meta.url:', import.meta.url);
try {
console.log('import.meta.resolve:', import.meta.resolve('./another-module.js'));
} catch (error) {
console.log('import.meta.resolve not supported in this environment.');
}
}
detectEnvironment();
μ΄ μ½λ μ‘°κ°μ λ¨Όμ κΈ°λ₯ κ°μ§(`typeof window`, `typeof process`, `typeof Deno`)λ₯Ό μ¬μ©νμ¬ λ°νμμ μλ³ν©λλ€. κ·Έλ° λ€μ import.meta.url λ° import.meta.resolveμ μ‘μΈμ€νλ €κ³ μλν©λλ€. import.meta.resolveλ₯Ό μ¬μ©ν μ μλ κ²½μ° try...catch λΈλ‘μ΄ μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νμ¬ ν΄λΉ νκ²½μμ μ΄ μμ±μ μ§μνμ§ μμμ λνλ
λλ€.
λ°νμ 컨ν μ€νΈλ₯Ό κΈ°λ°μΌλ‘ ν λμ ꡬμ±
λ°νμ νκ²½μ μλ³ν νμλ μ΄ μ 보λ₯Ό μ¬μ©νμ¬ ν΄λΉ νκ²½μ νΉνλ ꡬμ±, ν΄λ¦¬ν λλ λͺ¨λμ λμ λ‘λν μ μμ΅λλ€. μ΄λ ν΄λΌμ΄μΈνΈμ μλ² λͺ¨λμμ μ€νλλ λν λλ λ²μ© JavaScript μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νΉν μ μ©ν©λλ€.
μμ: νκ²½λ³ κ΅¬μ± λ‘λ
// config-loader.js
async function loadConfig() {
let configURL;
if (typeof window !== 'undefined') {
// Browser environment
configURL = './config/browser.json';
} else if (typeof process !== 'undefined' && process.versions && process.versions.node) {
// Node.js environment
configURL = './config/node.json';
} else {
// Default configuration
configURL = './config/default.json';
}
const absoluteConfigURL = new URL(configURL, import.meta.url);
const response = await fetch(absoluteConfigURL);
const config = await response.json();
return config;
}
loadConfig().then(config => {
console.log('Loaded configuration:', config);
});
μ΄ μμμμλ κ°μ§λ λ°νμ νκ²½μ λ°λΌ λ€λ₯Έ κ΅¬μ± νμΌμ λ‘λνλ λ°©λ²μ 보μ¬μ€λλ€. window(λΈλΌμ°μ ) λ° process(Node.js)μ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈνμ¬ νκ²½μ κ²°μ νκ³ ν΄λΉ κ΅¬μ± νμΌμ λ‘λν©λλ€. νκ²½μ κ²°μ ν μ μλ κ²½μ° κΈ°λ³Έ ꡬμ±μ΄ λ‘λλ©λλ€. URL μμ±μλ λͺ¨λμ `import.meta.url`λΆν° μμνμ¬ config νμΌμ μ λ URLμ μμ±νλ λ° λ€μ μ¬μ©λ©λλ€.
μμ: μ‘°κ±΄λΆ λͺ¨λ λ‘λ©
λλ‘λ λ°νμ νκ²½μ λ°λΌ λ€λ₯Έ λͺ¨λμ λ‘λν΄μΌ ν μλ μμ΅λλ€. λμ κ°μ Έμ€κΈ°(`import()`)λ₯Ό νκ²½ κ°μ§μ ν¨κ» μ¬μ©νμ¬ μ΄λ₯Ό λ¬μ±ν μ μμ΅λλ€.
// module-loader.js
async function loadEnvironmentSpecificModule() {
let modulePath;
if (typeof window !== 'undefined') {
// Browser environment
modulePath = './browser-module.js';
} else if (typeof process !== 'undefined' && process.versions && process.versions.node) {
// Node.js environment
modulePath = './node-module.js';
} else {
console.log('Unsupported environment.');
return;
}
const absoluteModulePath = new URL(modulePath, import.meta.url).href;
const module = await import(absoluteModulePath);
module.default(); // Assuming the module exports a default function
}
loadEnvironmentSpecificModule();
μ΄ μμμμλ λ°νμ νκ²½μ λ°λΌ browser-module.js λλ node-module.jsκ° λμ μΌλ‘ κ°μ Έμμ§λλ€. import() ν¨μλ λͺ¨λ κ°μ²΄λ‘ ν΄κ²°λλ νλ‘λ―Έμ€λ₯Ό λ°ννμ¬ ν΄λΉ λͺ¨λμ λ΄λ³΄λ΄κΈ°μ μ‘μΈμ€ν μ μλλ‘ ν©λλ€. λμ κ°μ Έμ€κΈ°λ₯Ό μ¬μ©νκΈ° μ μ λΈλΌμ°μ μ§μμ κ³ λ €νμΈμ. ꡬν λΈλΌμ°μ μ κ²½μ° ν΄λ¦¬νμ ν¬ν¨ν΄μΌ ν μ μμ΅λλ€.
κ³ λ € μ¬ν λ° λͺ¨λ² μ¬λ‘
- μ¬μ©μ μμ΄μ νΈ κ°μ§ λμ κΈ°λ₯ κ°μ§: λ°νμ νκ²½μ κ²°μ νκΈ° μν΄ μ¬μ©μ μμ΄μ νΈ λ¬Έμμ΄μ΄ μλ κΈ°λ₯ κ°μ§(νΉμ μμ± λλ ν¨μμ μ‘΄μ¬ μ¬λΆ νμΈ)μ μμ‘΄ν©λλ€. μ¬μ©μ μμ΄μ νΈ λ¬Έμμ΄μ μ λ’°ν μ μμΌλ©° μ½κ² μμ‘°λ μ μμ΅λλ€.
- μ μ§μ μ±λ₯ μ ν: λͺ μμ μΌλ‘ μ§μλμ§ μλ νκ²½μ λν λ체 λ©μ»€λμ¦ λλ κΈ°λ³Έ ꡬμ±μ μ 곡ν©λλ€. μ΄λ κ² νλ©΄ μμμΉ λͺ»ν λ°νμ 컨ν μ€νΈμμλ μ ν리μΌμ΄μ μ΄ κ³μ μλν©λλ€.
- 보μ: νκ²½ κ°μ§λ₯Ό κΈ°λ°μΌλ‘ μΈλΆ 리μμ€λ₯Ό λ‘λνκ±°λ μ½λλ₯Ό μ€νν λ μ£Όμνμμμ€. νΉν μ ν리μΌμ΄μ μ΄ μ¬μ©μ μ 곡 λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ²½μ° λ³΄μ μ·¨μ½μ μ λ°©μ§νκΈ° μν΄ μ λ ₯μ κ²μ¦νκ³ λ°μ΄ν°λ₯Ό μ 리ν©λλ€.
- ν μ€νΈ: λ€μν λ°νμ νκ²½μμ μ ν리μΌμ΄μ μ μ² μ ν ν μ€νΈνμ¬ νκ²½ κ°μ§ λ‘μ§μ΄ μ ννκ³ μ½λκ° μμλλ‘ μλνλμ§ νμΈν©λλ€. μ¬λ¬ νκ²½μμ ν μ€νΈ μ€νμ μ§μνλ ν μ€νΈ νλ μμν¬(μ: Jest, Mocha)λ₯Ό μ¬μ©ν©λλ€.
- ν΄λ¦¬ν λ° νΈλμ€νμΌλ¬: ν΄λ¦¬ν λ° νΈλμ€νμΌλ¬λ₯Ό μ¬μ©νμ¬ κ΅¬ν λΈλΌμ°μ λ° λ°νμ νκ²½κ³Όμ νΈνμ±μ 보μ₯ν©λλ€. Babel λ° Webpackμ μ½λλ₯Ό μ΄μ ECMAScript λ²μ μΌλ‘ νΈλμ€νμΌνκ³ νμν ν΄λ¦¬νμ ν¬ν¨νλ λ° λμμ΄ λ μ μμ΅λλ€.
- νκ²½ λ³μ: μλ² μΈ‘ μ ν리μΌμ΄μ
μ κ²½μ° νκ²½ λ³μλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ
λμμ ꡬμ±νλ κ²μ κ³ λ €ν©λλ€. μ΄λ κ² νλ©΄ μ½λλ₯Ό μ§μ μμ νμ§ μκ³ λ μ ν리μΌμ΄μ
μ€μ μ μ½κ² μ¬μ©μ μ μν μ μμ΅λλ€. Node.jsμ
dotenvμ κ°μ λΌμ΄λΈλ¬λ¦¬λ νκ²½ λ³μλ₯Ό κ΄λ¦¬νλ λ° λμμ΄ λ μ μμ΅λλ€.
λΈλΌμ°μ λ° Node.jsλ₯Ό λμ΄μ: import.meta νμ₯
import.metaλ νμ€νλμ΄ μμ§λ§, λ
ΈμΆνλ μμ±μ κΆκ·Ήμ μΌλ‘ νΈμ€νΈ νκ²½μ λ°λΌ λ¬λΌμ§λλ€. μ΄λ₯Ό ν΅ν΄ μλ² λ© νκ²½μ μ ν리μΌμ΄μ
λ²μ , κ³ μ μλ³μ λλ νλ«νΌλ³ μ€μ κ³Ό κ°μ μ¬μ©μ μ μ μ 보λ₯Ό import.metaλ‘ νμ₯ν μ μμ΅λλ€. μ΄λ λΈλΌμ°μ λ Node.js λ°νμμ΄ μλ JavaScript μ½λλ₯Ό μ€ννλ νκ²½μ λ§€μ° κ°λ ₯ν©λλ€.
κ²°λ‘
import.meta κ°μ²΄λ JavaScriptμμ λͺ¨λ λ©νλ°μ΄ν°μ μ‘μΈμ€ν μ μλ νμ€νλκ³ μμ μ μΈ λ°©λ²μ μ 곡ν©λλ€. import.metaμμ μ¬μ© κ°λ₯ν μμ±μ κ²μ¬νλ©΄ λ°νμ νκ²½μ κ°μ§νκ³ μ½λλ₯Ό κ·Έμ λ§κ² μ‘°μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ€μν νλ«νΌμμ μννκ² μ€νλλ λ³΄λ€ μ΄μ κ°λ₯νκ³ μ μμ±μ΄ λ°μ΄λλ©° κ°λ ₯ν JavaScript μ ν리μΌμ΄μ
μ μμ±ν μ μμ΅λλ€. import.metaλ₯Ό μ΄ν΄νκ³ νμ©νλ κ²μ νΉν μ¬λ¬ νκ²½μ λμμΌλ‘ νλ λν λλ λ²μ© μ ν리μΌμ΄μ
μ ꡬμΆν λ νλ JavaScript κ°λ°μ λ§€μ° μ€μν©λλ€. JavaScriptκ° κ³μ λ°μ νκ³ μλ‘μ΄ μμμΌλ‘ νμ₯λ¨μ λ°λΌ import.metaλ λ°νμ 컨ν
μ€νΈ λΆμ λ° λμ ꡬμ±μμ μ μ λ μ€μν μν μ ν κ²μ
λλ€. νμ JavaScript λ°νμ νκ²½λ³ μ€λͺ
μλ₯Ό μ°Έμ‘°νμ¬ `import.meta`μμ μ¬μ©ν μ μλ μμ±κ³Ό μ¬μ© λ°©λ²μ μ΄ν΄νμμμ€.