Обзор современных сред выполнения JavaScript

Раздел: JavaScript -> Среды выполнения 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

Среды выполнения JavaScript (runtimes) - comments

En
Js runtimes (javascript)