JavaScript прошёл путь от языка для анимации кнопок до мощной экосистемы, на которой строят целые приложения. Если вы всё ещё пишете на нём как в 2010-м, эта статья для вас. Разберём, как сегодня пишут код, чтобы он был быстрым, читаемым и поддерживаемым.
Модули: больше не глобальный хаос
Раньше весь код лежал в одном файле или в глобальной области. Сейчас так никто не делает. Современный подход — ES-модули (ESM). Они позволяют разбивать код на части и подключать только нужное.
Пример: у вас есть файл math.js с функциями сложения и вычитания. Вы экспортируете их, а в другом файле импортируете.
// math.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// main.js
import { add } from './math.js';
console.log(add(2, 3)); // 5
Это чище, чем старые IIFE или глобальные переменные. Плюс сборщики вроде Webpack или Vite автоматически оптимизируют такие модули.
Асинхронность: от колбеков к async/await
Асинхронный код — боль любого новичка. Сначала были колбеки, потом промисы, а сейчас стандарт — async/await. Он делает асинхронный код похожим на синхронный, что упрощает чтение.
Вот как выглядит запрос к API с async/await:
async function fetchUser() {
try {
const response = await fetch('https://api.example.com/user/1');
const user = await response.json();
console.log(user);
} catch (error) {
console.error('Ошибка:', error);
}
}
fetchUser();
Согласитесь, это читается легче, чем цепочка .then(). Но не забывайте про обработку ошибок — try/catch обязателен.
Promise.all(). Это сэкономит время.
Функциональное программирование и неизменяемость
Современный JavaScript тяготеет к функциональному стилю. Это значит, что мы избегаем побочных эффектов и стараемся не менять данные, а создавать новые. Особенно это важно в React и Redux.
Вместо того чтобы менять массив, используйте методы вроде map, filter, reduce.
const numbers = [1, 2, 3, 4];
// Плохо: мутация
// numbers.push(5);
// Хорошо: создание нового массива
const newNumbers = [...numbers, 5];
// Ещё пример: удвоение каждого элемента
const doubled = numbers.map(n => n * 2);
console.log(doubled); // [2, 4, 6, 8]
Такой подход уменьшает количество багов, связанных с неожиданным изменением данных.
Инструменты: сборщики, линтеры, форматтеры
Писать код в блокноте уже никто не будет. Современный разработчик использует целый арсенал инструментов.
- Сборщики: Vite, Webpack, Parcel. Они собирают модули в один файл, оптимизируют и минифицируют код.
- Линтеры: ESLint. Находит ошибки и потенциальные проблемы.
- Форматтеры: Prettier. Приводит код к единому стилю автоматически.
- Транспиляторы: Babel. Позволяет использовать новый синтаксис даже в старых браузерах.
Сравним популярные сборщики:
| Инструмент | Скорость | Сложность настройки | Основное применение |
|---|---|---|---|
| Vite | Очень высокая | Низкая | Современные SPA |
| Webpack | Средняя | Высокая | Крупные проекты |
| Parcel | Высокая | Очень низкая | Быстрый старт |
Фреймворки: React, Vue, Angular и другие
Чистый JavaScript хорош для небольших скриптов, но для серьёзных приложений нужен фреймворк. Сегодня популярны три кита: React, Vue и Angular. Выбор зависит от задачи и команды.
- React — гибкий, огромное сообщество, много вакансий. Но требует знания JSX и экосистемы.
- Vue — простой вход, отличная документация, подходит для быстрого прототипирования.
- Angular — строгий, полноценный фреймворк с TypeScript из коробки. Хорош для энтерпрайза.
Вот пример компонента на React:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
Вы нажали {count} раз
);
}
export default Counter;
А вот тот же компонент на Vue:
// Vue 3 Composition API
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
return { count };
},
template: `
Вы нажали {{ count }} раз
`
};
Оба подхода хороши, но React даёт больше свободы, а Vue — более структурирован.
Тестирование: не забываем про качество
Современный подход немыслим без тестов. Jest, Mocha, Vitest — вот основные инструменты. Они позволяют писать unit-тесты, интеграционные и end-to-end.
Простой тест на Jest:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
test('складывает 1 + 2 = 3', () => {
expect(sum(1, 2)).toBe(3);
});
Тесты помогают избежать регрессий при рефакторинге. Не пренебрегайте ими, даже в маленьких проектах.
TypeScript: строгая типизация набирает обороты
Многие проекты переходят на TypeScript. Он добавляет статические типы поверх JavaScript, что позволяет ловить ошибки на этапе компиляции. Это особенно ценно в больших командах.
Пример на TypeScript:
// typescript
function greet(name: string): string {
return `Привет, ${name}!`;
}
console.log(greet('Мир')); // Привет, Мир!
// console.log(greet(123)); // Ошибка компиляции
TypeScript не заменяет JavaScript, а расширяет его. Если вы ещё не пробовали — самое время.
Что в итоге
Современная разработка на JavaScript — это не просто язык, а целая экосистема. Используйте модули, async/await, функциональные подходы, инструменты автоматизации и тестирование. Выбирайте фреймворк под задачу, а не потому что модно. И не бойтесь TypeScript — он делает код надёжнее.
Главное — не стоять на месте. JavaScript развивается быстро, но освоив базовые современные подходы, вы будете востребованы в любой команде.



