JavaScript κ°μ Έμ€κΈ° μμ±μ κ°λ ₯ν κΈ°λ₯μ νμ©ν΄ 보μΈμ. λ©νλ°μ΄ν°μ νμ μ λ³΄λ‘ λͺ¨λμ κ°ννμ¬ μ½λ νμ§κ³Ό μ μ§λ³΄μμ±μ ν₯μμν€λ λ°©λ²μ μμ보μΈμ.
JavaScript κ°μ Έμ€κΈ° μμ±: λͺ¨λ λ©νλ°μ΄ν° λ° νμ μ 보
JavaScriptμ λͺ¨λ μμ€ν μ λμ λ μ΄νλ‘ μλΉν λ°μ μ κ±°λν΄ μμ΅λλ€. μ΅κ·Όμ μΆκ°λ κ°μ₯ μν₯λ ₯ μλ κΈ°λ₯ μ€ νλλ κ°μ Έμ€κΈ° μμ±(import attributes)(μ΄μ μλ κ°μ Έμ€κΈ° λ¨μΈ(import assertions)μΌλ‘ μλ €μ§)μ λλ€. μ΄ μμ±μ μ¬μ©νλ©΄ κ°λ°μλ λͺ¨λμ κ°μ Έμ¬ λ JavaScript λ°νμμ μΆκ° λ©νλ°μ΄ν°λ₯Ό μ 곡νμ¬ μμ λͺ¨λ νμ μ μ§μ νκ±°λ λͺ¨λ 무결μ±μ νμΈνλ λ±μ κΈ°λ₯μ νμ±νν μ μμ΅λλ€. μ΄ κΈμμλ κ°μ Έμ€κΈ° μμ±μ λν΄ κΉμ΄ νκ³ λ€μ΄ κ·Έ λͺ©μ , μ¬μ©λ² λ° μ΅μ JavaScript κ°λ°μμμ μ΄μ μ μ΄ν΄λ΄ λλ€.
κ°μ Έμ€κΈ° μμ± μ΄ν΄νκΈ°
κ°μ Έμ€κΈ° μμ±μ `import` λ¬Έμ μΆκ°λλ ν€-κ° μμ λλ€. μ΄λ JavaScript λ°νμμ λν ννΈλ μ§μ μν μ νμ¬ λͺ¨λμ΄ μ²λ¦¬λκ³ λ‘λλλ λ°©μμ μν₯μ μ€λλ€. μ΄ μμ±λ€μ λͺ¨λ μ½λ μ체μλ μν₯μ λ―ΈμΉμ§ μμ§λ§ λͺ¨λ λ‘λμ μΆκ° μ 보λ₯Ό μ 곡ν©λλ€. ꡬ문μ λ€μκ³Ό κ°μ΅λλ€:
import module from './module.json' with { type: 'json' };
μ΄ μμ μμ `with { type: 'json' }`μ΄ κ°μ Έμ€κΈ° μμ±μ λλ€. μ΄λ λ°νμμκ² κ°μ Έμ¨ λͺ¨λμ΄ JSON νμΌμΌ κ²μΌλ‘ μμλλ€κ³ μλ €μ€λλ€. λ§μ½ λͺ¨λμ΄ μ ν¨ν JSON νμΌμ΄ μλλΌλ©΄, λ°νμμ μ€λ₯λ₯Ό λ°μμμΌ λμ€μ λ°μν μ μλ μκΈ°μΉ μμ λμμ λ°©μ§ν μ μμ΅λλ€.
κ°μ Έμ€κΈ° μμ±μ λͺ©μ
κ°μ Έμ€κΈ° μμ±μ μ¬λ¬ κ°μ§ μ€μν λͺ©μ μ μνν©λλ€:
- νμ μ 보: λͺ¨λμ νμ (μ: JSON, CSS, WebAssembly)μ μ§μ νλ©΄ λ°νμμ΄ λͺ¨λμ μ¬λ°λ₯΄κ² ꡬ문 λΆμνκ³ μ²λ¦¬ν μ μμ΅λλ€.
- 보μ: μμ±μ μ¬μ©νμ¬ λ¬΄κ²°μ± κ²μ¬λ₯Ό κ°μ ν μ μμΌλ©°, λ‘λλ λͺ¨λμ΄ μμλ ν΄μλ μλͺ κ³Ό μΌμΉνλμ§ νμΈνμ¬ μ μ¬μ μΈ λ³΄μ μνμ μνν μ μμ΅λλ€.
- λͺ¨λ λ‘λ© μ μ΄: μμ±μ λͺ¨λμ΄ λ‘λλλ λ°©μμ μν₯μ μ€ μ μμΌλ©°, μ μ¬μ μΌλ‘ μ¬μ©μ μ μ λ‘λλ νΉμ λ‘λ© μ λ΅κ³Ό κ°μ κΈ°λ₯μ νμ±νν μ μμ΅λλ€.
- λ―Έλ νμ₯μ±: μμ± κ΅¬λ¬Έμ ν₯ν μλ‘μ΄ κΈ°λ₯μΌλ‘ λͺ¨λ μμ€ν μ νμ₯ν μ μλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€.
ꡬ문 λ° μ¬μ©λ²
κ°μ Έμ€κΈ° μμ±μ ꡬ문μ κ°λ¨ν©λλ€. `with` ν€μλλ₯Ό μ¬μ©νμ¬ μμ± λΈλ‘μ μμνκ³ , κ·Έ λ€μ ν€-κ° μμ ν¬ν¨νλ κ°μ²΄ 리ν°λ΄μ΄ λ°λΌμ΅λλ€. λΆμμ λ€μκ³Ό κ°μ΅λλ€:
import identifier from 'module-specifier' with { attributeKey: 'attributeValue' };
λͺ κ°μ§ μ€μ©μ μΈ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μμ 1: JSON λ°μ΄ν° κ°μ Έμ€κΈ°
JSON νμμ μ€μ νμΌμ μκ°ν΄ λ΄ μλ€:
// config.json
{
"apiUrl": "https://api.example.com",
"timeout": 5000
}
μ΄ JSON νμΌμ κ°μ Έμ€κΈ° μμ±κ³Ό ν¨κ» κ°μ Έμ€λ €λ©΄ λ€μκ³Ό κ°μ΄ μμ±ν©λλ€:
import config from './config.json' with { type: 'json' };
console.log(config.apiUrl); // Output: https://api.example.com
`type: 'json'` μμ±μ λ°νμμ΄ `./config.json`μ JSON νμΌλ‘ νμ±νλλ‘ λ³΄μ₯ν©λλ€. νμΌμ μ ν¨νμ§ μμ JSONμ΄ ν¬ν¨λμ΄ μμΌλ©΄ λͺ¨λ λ‘λ© μ€μ μ€λ₯κ° λ°μν©λλ€.
μμ 2: CSS λͺ¨λ κ°μ Έμ€κΈ°
κ°μ Έμ€κΈ° μμ±μ CSS λͺ¨λκ³Ό ν¨κ» μ¬μ©ν μλ μμ΅λλ€:
import styles from './styles.module.css' with { type: 'css' };
document.adoptedStyleSheets = [styles];
`type: 'css'` μμ±μ λ°νμμκ² `./styles.module.css`λ₯Ό CSS λͺ¨λλ‘ μ·¨κΈνλλ‘ μ§μνμ¬ CSS λ³μ λ° κΈ°ν κ³ κΈ κΈ°λ₯μ μ¬μ©ν μ μκ² ν©λλ€.
μμ 3: WebAssembly λͺ¨λ κ°μ Έμ€κΈ°
WebAssembly (Wasm) λͺ¨λ λν κ°μ Έμ€κΈ° μμ±μ μ΄μ μ νμ©ν μ μμ΅λλ€:
import wasmModule from './module.wasm' with { type: 'webassembly' };
wasmModule.then(instance => {
console.log(instance.exports.add(10, 20));
});
`type: 'webassembly'` μμ±μ λ°νμμκ² κ°μ Έμ¨ νμΌμ΄ WebAssembly λͺ¨λμμ μλ €, λΈλΌμ°μ κ° Wasm μ½λλ₯Ό ν¨μ¨μ μΌλ‘ μ»΄νμΌνκ³ μ€νν μ μλλ‘ ν©λλ€.
μμ 4: `integrity`λ‘ λͺ¨λ λ¬΄κ²°μ± κ°μ νκΈ°
μ΄κ²μ κ³ κΈ μ¬μ© μ¬λ‘μ΄μ§λ§, κ°μ Έμ€κΈ° μμ±μ μ¬μ©νμ¬ λͺ¨λμ 무결μ±μ νμΈν μ μμ΅λλ€. μ΄λ₯Ό μν΄μλ λͺ¨λμ μνΈν ν΄μλ₯Ό μμ±ν λ€μ, ν΄λΉ ν΄μλ₯Ό import λ¬Έμ μ¬μ©ν΄μΌ ν©λλ€.
import module from './my-module.js' with { integrity: 'sha384-EXAMPLE_HASH' };
λ§μ½ `my-module.js`μ μ€μ λ΄μ©μ΄ μ 곡λ SHA-384 ν΄μμ μΌμΉνμ§ μμΌλ©΄, κ°μ Έμ€κΈ°κ° μ€ν¨νμ¬ μ μ¬μ μΌλ‘ μμλ μ½λμ λ‘λ©μ λ°©μ§ν©λλ€.
κ°μ Έμ€κΈ° μμ± μ¬μ©μ μ΄μ
κ°μ Έμ€κΈ° μμ±μ JavaScript κ°λ°μμκ² λͺ κ°μ§ μ£Όμ μ΄μ μ μ 곡ν©λλ€:
- μ½λ νμ§ ν₯μ: λͺ¨λ νμ μ λͺ μμ μΌλ‘ μ§μ ν¨μΌλ‘μ¨ λͺ¨λ λ‘λ© μ΄κΈ°μ μ€λ₯λ₯Ό λ°κ²¬νμ¬ λ°νμμμμ μκΈ°μΉ μμ λ¬Έμ λ₯Ό λ°©μ§ν μ μμ΅λλ€.
- 보μ κ°ν: λ¬΄κ²°μ± κ²μ¬λ μ μ± μ½λ μ£Όμ λ° λ³μ‘°λ‘λΆν° 보νΈνλ λ° λμμ΄ λ©λλ€.
- μ±λ₯ ν₯μ: λ°νμμ μ 곡λ νμ μ 보λ₯Ό κΈ°λ°μΌλ‘ λͺ¨λ λ‘λ© λ° νμ±μ μ΅μ νν μ μμ΅λλ€.
- μ μ§λ³΄μμ± μ¦λ: λͺ ννκ³ λͺ μμ μΈ κ°μ Έμ€κΈ° μμ±μ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μκ² λ§λλλ€.
- λ―Έλ λλΉ: κ°μ Έμ€κΈ° μμ±μ νμ₯ κ°λ₯ν νΉμ±μ μλ‘μ΄ λͺ¨λ νμ κ³Ό κΈ°λ₯μ μνν ν΅ν©μ κ°λ₯νκ² ν©λλ€.
λΈλΌμ°μ λ° λ°νμ μ§μ
κ°μ Έμ€κΈ° μμ±μ λν μ§μμ μ¦κ°νκ³ μμ§λ§, νλ‘λμ νκ²½μμ μ¬μ©νκΈ° μ μλ νΈνμ±μ νμΈνλ κ²μ΄ μ€μν©λλ€. 2024λ νλ° κΈ°μ€μΌλ‘ λλΆλΆμ μ΅μ λΈλΌμ°μ (Chrome, Firefox, Safari, Edge)μ Node.jsλ κ°μ Έμ€κΈ° μμ±μ μ§μν©λλ€. κ·Έλ¬λ ꡬν λΈλΌμ°μ μμλ ν΄λ¦¬νμ΄λ νΈλμ€νμΌλ§μ΄ νμν μ μμ΅λλ€.
caniuse.comκ³Ό κ°μ μΉμ¬μ΄νΈμμ "import assertions"(κ°μ Έμ€κΈ° μμ±μ μλ μ΄λ¦)λ₯Ό κ²μνμ¬ μ΅μ λΈλΌμ°μ νΈνμ± μ 보λ₯Ό νμΈν μ μμ΅λλ€.
Node.js: Node.jsλ λ²μ 16.17.0λΆν° κ°μ Έμ€κΈ° μμ±μ μ§μν©λλ€. μ΄ κΈ°λ₯μ νμ©νλ €λ©΄ μ΅μ λ²μ μ Node.jsλ₯Ό μ¬μ©νκ³ μλμ§ νμΈνμΈμ. Node.jsμμ κ°μ Έμ€κΈ° μμ±μ νμ±ννλ €λ©΄ μ€ν¬λ¦½νΈλ₯Ό μ€νν λ `--experimental-import-attributes` νλκ·Έλ₯Ό μ¬μ©νκ±°λ, `package.json` νμΌμ "type":"module" μ€μ νμ `"experimental-import-attributes": true` νλκ·Έλ₯Ό μ€μ ν΄μΌ ν©λλ€(ES λͺ¨λμ μ¬μ©νλ κ²½μ°).
ν΄λ¦¬ν λ° νΈλμ€νμΌλ§
κ°μ Έμ€κΈ° μμ±μ κΈ°λ³Έμ μΌλ‘ μ§μνμ§ μλ ꡬν λΈλΌμ°μ λ νκ²½μ μ§μν΄μΌ νλ κ²½μ°, Babelκ³Ό κ°μ ν΄λ¦¬νμ΄λ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν λꡬλ μ½λλ₯Ό ꡬν νκ²½κ³Ό νΈνλλλ‘ λ³νν μ μμ΅λλ€.
Babel
μΈκΈ° μλ JavaScript νΈλμ€νμΌλ¬μΈ Babelμ κ°μ Έμ€κΈ° μμ±μ νΈν κ°λ₯ν μ½λλ‘ λ³ννλλ‘ κ΅¬μ±ν μ μμ΅λλ€. `@babel/plugin-proposal-import-attributes` νλ¬κ·ΈμΈμ μ€μΉνκ³ Babel μ€μ νμΌ(μ: `.babelrc` λλ `babel.config.js`)μμ ꡬμ±ν΄μΌ ν©λλ€.
// babel.config.js
module.exports = {
plugins: ['@babel/plugin-proposal-import-attributes']
};
μ΄λ κ² νλ©΄ κ°μ Έμ€κΈ° μμ±μ΄ ꡬν JavaScript νκ²½κ³Ό νΈνλλ μ½λλ‘ λ³νλ©λλ€.
λ€μν λ§₯λ½μμμ μ€μ μμ
λ€μν μλ리μ€μμ κ°μ Έμ€κΈ° μμ±μ΄ μ΄λ»κ² μ¬μ©λ μ μλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μμ 1: κ΅μ ν(i18n) μ€μ
λ€κ΅μ΄ μ ν리μΌμ΄μ μμλ κ° μΈμ΄μ λ²μμ μν λ³λμ JSON νμΌμ΄ μμ μ μμ΅λλ€:
// en.json
{
"greeting": "Hello",
"farewell": "Goodbye"
}
// fr.json
{
"greeting": "Bonjour",
"farewell": "Au revoir"
}
κ°μ Έμ€κΈ° μμ±μ μ¬μ©νμ¬ μ΄λ¬ν νμΌλ€μ΄ JSONμΌλ‘ μ¬λ°λ₯΄κ² νμ±λλλ‘ ν μ μμ΅λλ€:
import en from './en.json' with { type: 'json' };
import fr from './fr.json' with { type: 'json' };
function greet(language) {
if (language === 'en') {
console.log(en.greeting);
} else if (language === 'fr') {
console.log(fr.greeting);
}
}
greet('en'); // Output: Hello
greet('fr'); // Output: Bonjour
μμ 2: λμ ν λ§ λ‘λ©
μ¬λ¬ ν λ§λ₯Ό μ§μνλ μΉ μ ν리μΌμ΄μ μμ, μ¬μ©μ μ νΈλμ λ°λΌ λμ μΌλ‘ CSS νμΌμ λ‘λνκΈ° μν΄ κ°μ Έμ€κΈ° μμ±μ μ¬μ©ν μ μμ΅λλ€:
// light-theme.css
:root {
--background-color: #fff;
--text-color: #000;
}
// dark-theme.css
:root {
--background-color: #000;
--text-color: #fff;
}
async function loadTheme(theme) {
let themeFile = `./${theme}-theme.css`;
try {
const themeModule = await import(themeFile, { with: { type: 'css' } });
document.adoptedStyleSheets = [themeModule.default];
} catch (error) {
console.error("Failed to load theme", error);
}
}
loadTheme('light'); // Loads the light theme
loadTheme('dark'); // Loads the dark theme
κ°μ Έμ€κΈ° μμ±κ³Ό ν¨κ» λμ κ°μ Έμ€κΈ°(`import()`)λ₯Ό μ¬μ©νλ μ μ μ μνμΈμ. μ΄λ₯Ό ν΅ν΄ νμμ λ°λΌ λͺ¨λμ λ‘λν μ μμ΅λλ€.
μμ 3: μ격 μλ²μμ μ€μ λ‘λ©νκΈ°
μ격 μλ²μμ μ€μ νμΌμ κ°μ Έμμ κ°μ Έμ€κΈ° μμ±μ μ¬μ©νμ¬ μ¬λ°λ₯΄κ² νμ±λλλ‘ ν μ μμ΅λλ€:
async function loadRemoteConfig() {
try {
const response = await fetch('https://example.com/config.json');
const configData = await response.json();
// Assuming you have a way to create a data URL from the JSON data
const dataURL = 'data:application/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(configData));
const configModule = await import(dataURL, { with: { type: 'json' } });
console.log(configModule.default.apiUrl);
} catch (error) {
console.error("Failed to load remote config", error);
}
}
loadRemoteConfig();
μ΄ μμ λ `fetch`λ₯Ό μ¬μ©νμ¬ μ격 μλ²μμ JSON νμΌμ κ²μν λ€μ, λ°μ΄ν° URLκ³Ό κ°μ Έμ€κΈ° μμ±μ ν¨κ» μ¬μ©νμ¬ μ€μ λ°μ΄ν°λ₯Ό λ‘λνλ λ°©λ²μ 보μ¬μ€λλ€.
κ³ λ €μ¬ν λ° λͺ¨λ² μ¬λ‘
- μ€λ₯ μ²λ¦¬: κ°μ Έμ€κΈ° μμ±μ μ¬μ©ν λλ νμ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ν¬ν¨νμΈμ. μ ν¨νμ§ μμ νμ μ΄λ λ¬΄κ²°μ± κ²μ¬λ‘ μΈν΄ λͺ¨λ λ‘λμ μ€ν¨ν κ²½μ°, μ€λ₯λ₯Ό μ°μνκ² μ²λ¦¬ν΄μΌ ν©λλ€.
- μ±λ₯: λͺ¨λμ λμ μΌλ‘ λ‘λν λμ μ±λ₯ μν₯μ μΌλμ λμΈμ. λ‘λ© μκ°μ κ°μ νκΈ° μν΄ μ¬μ λ‘λ©μ΄λ λ€λ₯Έ μ΅μ ν κΈ°μ μ¬μ©μ κ³ λ €νμΈμ.
- 보μ: λ¬΄κ²°μ± κ²μ¬λ₯Ό μ¬μ©ν λλ ν΄μκ° μμ νκ² μμ±λκ³ μ μ νκ² μ μ₯λμλμ§ νμΈνμΈμ.
- ν΄λ¦¬ν: ꡬν νκ²½μ μ§μν΄μΌ νλ κ²½μ°, νΈνμ±μ 보μ₯νκΈ° μν΄ ν΄λ¦¬νμ΄λ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©νμΈμ.
- λͺ¨λμ±: μ½λμ λͺ¨λμ±μ ν₯μμν€κΈ° μν΄ κ°μ Έμ€κΈ° μμ±μ μ¬μ©νμΈμ. λͺ¨λ νμ κ³Ό λ¬΄κ²°μ± κ²μ¬λ₯Ό λͺ μμ μΌλ‘ μ§μ ν¨μΌλ‘μ¨ λ κ²¬κ³ νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.
- μ½λ 리뷰: μμΈν μ½λ 리뷰μ μ κ·Ό λ°©μμ λν ν ν©μλ₯Ό ν΅ν΄ μ μ ν μ¬μ©μ 보μ₯νμΈμ.
κ°μ Έμ€κΈ° μμ±μ λ―Έλ
κ°μ Έμ€κΈ° μμ±μ λΉκ΅μ μλ‘μ΄ κΈ°λ₯μ΄λ©°, κ·Έ κΈ°λ₯μ μμΌλ‘ νμ₯λ κ°λ₯μ±μ΄ λμ΅λλ€. JavaScript μνκ³κ° λ°μ ν¨μ λ°λΌ λ€μκ³Ό κ°μ λ€μν μ¬μ© μ¬λ‘λ₯Ό μ§μνκΈ° μν΄ μλ‘μ΄ μμ±μ΄ λμ λ κ²μΌλ‘ μμλ©λλ€:
- μ¬μ©μ μ μ λͺ¨λ λ‘λ: μμ±μ μ¬μ©νμ¬ μ¬μ©μ μ μ λͺ¨λ λ‘λλ₯Ό μ§μ ν μ μκ² λμ΄, κ°λ°μκ° μμ λ§μ λ‘λ© μ λ΅μ ꡬνν μ μμ΅λλ€.
- κ³ κΈ λ³΄μ κΈ°λ₯: κ°μ Έμ€κΈ° μμ±μ μ¬μ©νμ¬ μΈλΆνλ μ κ·Ό μ μ΄μ κ°μ λ μ κ΅ν 보μ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
- ν₯μλ νμ κ²μ¬: μμ±μ μ¬μ©νμ¬ λ μμΈν νμ μ 보λ₯Ό μ 곡ν¨μΌλ‘μ¨, μ μ λΆμ λκ΅¬κ° λ μ νν νμ κ²μ¬λ₯Ό μνν μ μκ² λ μ μμ΅λλ€.
κ²°λ‘
JavaScript κ°μ Έμ€κΈ° μμ±μ μΈμ΄μ κ°λ ₯νκ² μΆκ°λ κΈ°λ₯μΌλ‘, κ°λ°μμκ² λ©νλ°μ΄ν°μ νμ μ λ³΄λ‘ λͺ¨λμ ν₯μμν¬ μ μλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€. κ°μ Έμ€κΈ° μμ±μ μ¬μ©ν¨μΌλ‘μ¨ μ½λ νμ§μ κ°μ νκ³ , 보μμ κ°ννλ©°, μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€. κ°μ Έμ€κΈ° μμ±μ λν μ§μμ μμ§ λ°μ μ€μ΄μ§λ§, μ΄λ―Έ μ΅μ JavaScript κ°λ°μ μμ΄ κ·μ€ν λꡬμ λλ€. JavaScript μνκ³κ° κ³μ μ±μ₯ν¨μ λ°λΌ, κ°μ Έμ€κΈ° μμ±μ λͺ¨λ λ‘λ© λ° κ΄λ¦¬μ λ―Έλλ₯Ό νμ±νλ λ° μ μ λ μ€μν μν μ ν κ²μΌλ‘ κΈ°λλ©λλ€. μ΄ κΈ°λ₯μ μ‘°κΈ°μ μ±ννλ©΄ κ°λ°μλ μ μΈκ³ μ¬μ©μλ₯Ό μν΄ λ κ²¬κ³ νκ³ μμ νλ©° μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ λ§λ€ μ μμ κ²μ λλ€.