Обзор современных сред выполнения JavaScript
Среда выполнения JavaScript: от браузера до сервера
Как запустить JavaScript на сервере с помощью Node.js?
Node.js - это среда выполнения JavaScript, построенная на движке V8 от Google. Она позволяет выполнять JavaScript вне браузера, что открывает возможности для серверной разработки, создания утилит и инструментов командной строки. Основное преимущество - неблокирующий ввод-вывод и широкая экосистема пакетов npm.
Пример простого HTTP-сервера:
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello, World!');
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
Js runtimes (среды выполнения javascript (runtimes))
Запуск: node server.js. Результат: в браузере по адресу http://localhost:3000 отобразится сообщение "Hello, World!".
Типичные ошибки:
- Использование
importвместоrequireбез настройки модулей. В Node.js по умолчанию CommonJS, для ES модулей нужно указать"type": "module"в package.json или использовать расширение .mjs. - Незакрытые соединения или отсутствие обработки ошибок. Рекомендуется добавлять обработчик
server.on('error', ...).
Как использовать безопасную среду с TypeScript - Deno?
Deno - это среда выполнения JavaScript и TypeScript, созданная Райаном Далом (автором Node.js). Основные отличия: безопасность по умолчанию (доступ к ресурсам требуется разрешать явно), встроенная поддержка TypeScript, модули по URL, современный API.
Пример простого сервера:
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";
serve((_req) => new Response("Hello, Deno!"), { port: 3000 });
Запуск: deno run --allow-net server.ts. Флаг --allow-net необходим для сетевого доступа.
Возможные проблемы:
- Необходимость указания флагов разрешений, что может быть неудобно на начальном этапе.
- API все еще развивается, некоторые функции могут меняться.
Как получить высокую производительность с Bun?
Bun - это новая среда выполнения JavaScript, оптимизированная для скорости. Использует движок JavaScriptCore (Safari) и собственный менеджер пакетов, совместимый с npm. Bun стремится заменить Node.js с более быстрым стартом и выполнением.
Пример HTTP сервера:
Bun.serve({
port: 3000,
fetch(req) {
return new Response("Hello from Bun!");
},
});
Запуск: bun run server.js.
Ограничения:
- Не все npm-пакеты полностью совместимы, хотя Bun стремится к максимальной совместимости.
- Сообщество меньше, чем у Node.js, но быстро растет.
Как выполнить JavaScript в браузере?
Браузеры - это изначальная среда выполнения JavaScript. Каждый браузер имеет свой движок (V8 в Chrome, SpiderMonkey в Firefox, JavaScriptCore в Safari). В браузере JavaScript может взаимодействовать с DOM, обрабатывать события и работать с Web API.
Пример использования модулей:
<script type="module">
import { format } from "./utils.js";
console.log(format("Привет"));
</script>
Файл utils.js:
export function format(text) {
return `**${text.toUpperCase()}**`;
}
Результат в консоли: **ПРИВЕТ**.
Проблемы:
- CORS ограничивает загрузку модулей с других доменов.
- В браузере нет доступа к файловой системе или процессам, что делает его непригодным для серверных задач.
Расширенные примеры
Рассмотрим несколько нестандартных сценариев использования разных сред выполнения.
Node.js: асинхронная работа с файловой системой
const fs = require('fs/promises');
async function readAndProcess(path) {
try {
const data = await fs.readFile(path, 'utf-8');
const lines = data.split('\n').filter(line => line.trim() !== '');
console.log(`Файл содержит ${lines.length} непустых строк.`);
return lines;
} catch (err) {
console.error('Ошибка:', err);
}
}
readAndProcess('./example.txt');
Файл содержит 3 непустых строк.
Deno: использование встроенной поддержки TypeScript и безопасных разрешений
// types.ts
export interface User {
name: string;
age: number;
}
// main.ts
import { User } from "./types.ts";
const user: User = { name: "Alice", age: 30 };
console.log(`User: ${user.name}, ${user.age}`);
User: Alice, 30
Запуск: deno run main.ts (без дополнительных флагов, так как нет сетевого доступа).
Bun: работа с JSON и встроенный HTTP-сервер с маршрутизацией
const server = Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/api/data") {
return new Response(JSON.stringify({ message: "OK" }), {
headers: { "Content-Type": "application/json" },
});
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Server running on ${server.hostname}:${server.port}`);
Server running on localhost:3000
Браузер: использование Web Workers для параллельных вычислений
// worker.js
self.onmessage = function(e) {
const result = e.data * 2;
self.postMessage(result);
};
// main.js
const worker = new Worker('worker.js');
worker.postMessage(5);
worker.onmessage = function(e) {
console.log('Результат:', e.data); // 10
};
Результат: 10