Другое

Как обслуживать HTML с помощью веб-сервера Node.js

Узнайте, как обслуживать HTML-страницы с помощью веб-сервера Node.js. Полное руководство, охватывающее подходы с использованием Express.js и чистого Node.js для обслуживания статических файлов, таких как CSS, JS и изображения.

Как обслуживать одну HTML-страницу с сопутствующими ресурсами с помощью Node.js в качестве простого веб-сервера?

Я хочу запустить очень простой HTTP-сервер, где каждый GET-запрос к example.com обслуживает index.html как обычную HTML-страницу (а не как обычный текст).

Используя следующий код, я могу прочитать содержимое index.html, но оно обслуживается как обычный текст:

javascript
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(index);
}).listen(9615);

Как мне изменить этот код, чтобы обслуживать index.html как обычную веб-страницу с правильным рендерингом HTML?

Кроме того, мне нужно обслуживать одну HTML-страницу вместе с её сопутствующими ресурсами (CSS, JavaScript и изображения) без необходимости писать отдельные обработчики маршрутов для каждого файла. Какой самый простой способ достичь этого в Node.js?

Вам нужно изменить заголовок Content-Type с ‘text/plain’ на ‘text/html’, чтобы правильно обслуживать ваш HTML-файл. Для обслуживания одной HTML-страницы с сопутствующими ресурсами самый простой подход - использовать Express.js с промежуточным программным обеспечением express.static, которое автоматически обрабатывает все статические файлы без необходимости создания отдельных обработчиков маршрутов.

Содержание

Быстрое решение: Изменение Content-Type

Немедленное решение вашей проблемы - это простое изменение заголовка Content-Type:

javascript
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'}); // Изменено с 'text/plain'
  res.end(index);
}).listen(9615);

Однако этот подход обслуживает только файл index.html и не правильно обрабатывает CSS, JavaScript или изображения.

Простое решение: Express.js со статическими файлами

Express.js предоставляет самый простой способ обслуживания статических файлов с минимальным количеством кода:

javascript
const express = require('express');
const app = express();
const port = 9615;

// Обслуживание статических файлов из текущей директории
app.use(express.static(__dirname));

// Обслуживание index.html для корневого пути
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

app.listen(port, () => {
  console.log(`Сервер запущен на http://localhost:${port}/`);
});

Этот подход:

  • Автоматически обслуживает все статические файлы (CSS, JS, изображения) из текущей директории
  • Автоматически обрабатывает типы MIME
  • Требует всего 2 строки кода для обслуживания статических файлов
  • Работает с любой имеющейся структурой файлов

Подход с использованием чистого Node.js

Если вы предпочитаете не использовать Express.js, вот полное решение с использованием встроенных модулей Node.js:

javascript
const http = require('http');
const fs = require('fs');
const path = require('path');

const port = 9615;

// Сопоставление типов MIME
const mimeType = {
  '.ico': 'image/x-icon',
  '.html': 'text/html',
  '.js': 'text/javascript',
  '.json': 'application/json',
  '.css': 'text/css',
  '.png': 'image/png',
  '.jpg': 'image/jpeg',
  '.wav': 'audio/wav',
  '.mp3': 'audio/mpeg',
  '.svg': 'image/svg+xml',
  '.pdf': 'application/pdf',
  '.doc': 'application/msword'
};

http.createServer(function(req, res) {
  let filePath = req.url;
  
  // Обслуживание index.html для корневого пути
  if (filePath === '/') {
    filePath = '/index.html';
  }
  
  // Получение расширения файла и определение типа MIME
  const extname = path.extname(filePath);
  const contentType = mimeType[extname] || 'application/octet-stream';
  
  // Чтение файла и его обслуживание
  fs.readFile(__dirname + filePath, function(err, content) {
    if (err) {
      res.writeHead(404);
      res.end('Файл не найден');
    } else {
      res.writeHead(200, {'Content-Type': contentType});
      res.end(content, 'utf-8');
    }
  });
}).listen(port);

console.log(`Сервер запущен на http://localhost:${port}/`);

Структура файлов и настройка

Для самой простой настройки организуйте ваши файлы следующим образом:

ваш-проект/
├── server.js          # Файл сервера Node.js
├── index.html          # Ваш основной HTML-файл
├── style.css           # CSS-файл
├── script.js           # JavaScript-файл
├── images/
│   ├── logo.png
│   └── background.jpg

В вашем HTML-файле ссылайтесь на ресурсы с относительными путями:

html
<!DOCTYPE html>
<html>
<head>
    <title>Моя страница</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <img src="images/logo.png" alt="Логотип">
    <script src="script.js"></script>
</body>
</html>

Полные рабочие примеры

Пример с Express.js (Рекомендуется)

  1. Сначала установите Express:
bash
npm install express
  1. Создайте server.js:
javascript
const express = require('express');
const app = express();
const port = 9615;

// Обслуживание всех статических файлов из текущей директории
app.use(express.static(__dirname));

// Обслуживание index.html для корневого пути
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

app.listen(port, () => {
  console.log(`Сервер запущен на http://localhost:${port}/`);
});
  1. Запустите:
bash
node server.js

Пример с чистым Node.js

Создайте server.js с полным кодом из раздела Подход с использованием чистого Node.js, затем запустите:

bash
node server.js

Выбор правильного метода

Метод Плюсы Минусы Лучше всего подходит для
Express.js • Простой синтаксис
• Автоматические типы MIME
• Встроенное обслуживание статических файлов
• Масштабируемость
• Требует установки npm
• Добавляет зависимость
Большинства проектов, особенно если вы планируете добавить больше функций позже
Чистый Node.js • Нет зависимостей
• Полный контроль над сервером
• Легковесный
• Более сложный код
• Ручная обработка типов MIME
• Более многословный
Быстрых прототипов, обучения или минимальных окружений

Для обслуживания одной HTML-страницы с сопутствующими ресурсами Express.js является рекомендуемым подходом, так как он предоставляет самое простое решение с наименьшим количеством кода, при этом будучи надежным и поддерживаемым.

Источники

  1. Обслуживание статических файлов в Express - Документация Express.js
  2. Быстрый файловый сервер Node.js (статические файлы по HTTP) - Stack Overflow
  3. Обслуживание статических файлов с Node и Express.js - Stack Abuse
  4. Обслуживание статических ресурсов в Node.js - Tutorialsteacher
  5. Использование Node.js в качестве простого веб-сервера - Stack Overflow

Заключение

Чтобы обслуживать одну HTML-страницу с сопутствующими ресурсами с помощью Node.js:

  1. Быстрое решение: Измените Content-Type с ‘text/plain’ на ‘text/html’ в вашем существующем коде
  2. Лучшее решение: Используйте Express.js с промежуточным программным обеспечением express.static() для автоматического обслуживания статических файлов
  3. Структура файлов: Разместите все статические файлы в той же директории или поддиректориях с относительными путями в HTML
  4. Запуск сервера: Выполните с помощью node server.js и получите доступ по адресу http://localhost:9615

Подход с Express.js предоставляет самое простое и поддерживаемое решение для обслуживания статических файлов, при этом оставляя вам возможность расширить ваше приложение в будущем. Для большинства случаев использования это рекомендуемый подход по сравнению с ручной реализацией на Node.js.

Авторы
Проверено модерацией
Модерация