Code Example 1: Named Export (именованный экспорт)
❓ Какие два способа именованного экспорта показаны в первых двух вкладках? Как правильно импортировать именованные экспорты?
Tab 1 — Объявление с export:
// utils/math.js
export const PI = 3.14159;
export function sum(a, b) {
return a + b;
}
export class Calculator {
add(a, b) {
return a + b;
}
}
Tab 2 — Отдельный export:
// utils/math.js
const PI = 3.14159;
function sum(a, b) {
return a + b;
}
class Calculator {
add(a, b) {
return a + b;
}
}
export { PI, sum, Calculator };
Tab 3 — Импорт:
// app.js
import { PI, sum, Calculator } from './utils/math';
console.log(PI);
console.log(sum(2, 3));
const calc = new Calculator();
console.log(calc.add(10, 20));
Code Example 2: Default Export (экспорт по умолчанию)
❓ Чем отличается синтаксис импорта default export от named export? Можно ли использовать произвольное имя при импорте?
Tab 1 — Экспорт:
// models/User.js
export default class User {
constructor(name) {
this.name = name;
}
greet() {
return `Привет, я ${this.name}!`;
}
}
class User {
// ...
}
export default User;
export default function() { /* ... */ }
export default 42;
Tab 2 — Импорт:
// app.js
import User from './models/User';
import MyUser from './models/User';
const user = new User('Иван');
console.log(user.greet());
Code Example 3: Комбинирование named и default экспортов
❓ Как в одном файле совместить default и named экспорты? Как выглядит импорт обоих типов в одной строке?
// services/api.js
export const BASE_URL = 'https://api.example.com';
export const TIMEOUT = 5000;
export default class ApiClient {
constructor() {
this.baseUrl = BASE_URL;
}
fetch(endpoint) {
return fetch(this.baseUrl + endpoint);
}
}
// app.js
import ApiClient, { BASE_URL, TIMEOUT } from './services/api';
console.log(BASE_URL);
const client = new ApiClient();
Code Example 4: Ошибка при импорте named export
❓ Какая ошибка допущена в первом варианте импорта? Что произойдёт при выполнении?
import sum from './math';
import { sum } from './math';
Code Example 5: Реэкспорт (Re-export)
❓ Зачем нужен реэкспорт? Что делает синтаксис export { ... } from?
// utils/index.js
export { sum, PI } from './math';
export { formatDate } from './date';
export { default as User } from '../models/User';
export * from './helpers';
// app.js
import { sum, PI, formatDate, User } from './utils';
Code Example 6: Экспорт изменяемых значений
❓ Почему экспорт let считается антипаттерном? Что произойдёт при попытке изменить импортированную переменную?
export let counter = 0;
let counter = 0;
export function getCounter() { return counter; }
export function increment() { counter++; }
Code Example 7: Динамический импорт
❓ Чем динамический import() отличается от статического import? Что возвращает import()?
import { heavy } from './heavy-module';
async function loadModule() {
const module = await import('./heavy-module');
module.heavy();
}
if (needFeature) {
const { feature } = await import('./optional-feature');
feature();
}
Code Example 8: Импорт в браузере
❓ Какой атрибут необходим в теге <script> для использования ES6 модулей в браузере?
<script type="module" src="app.js"></script>
<script type="module">
import { greet } from './utils.js';
greet('Мир');
</script>
Code Example 9: Import assertions
❓ Для чего используется assert { type: ... } при импорте? Какие типы файлов можно импортировать таким образом?
import data from './data.json' assert { type: 'json' };
import styles from './styles.css' assert { type: 'css' };