Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Статические файлы

Статические файлы — те, что браузер получает как есть, без обработки на сервере: стили CSS, картинки, шрифты, клиентские скрипты. Писать для каждого файла маршрут не нужно: встроенная middleware express.static() раздаёт целую папку.

Папка public

Создайте в корне проекта папку public/ и в ней файл стилей public/css/style.css:

body {
  max-width: 720px;
  margin: 0 auto;
  font-family: system-ui, sans-serif;
}

Подключение

Добавьте в src/app.js одну строку перед маршрутами:

// src/app.js
app.use(express.static('public'));

Откройте http://localhost:3000/css/style.css — браузер покажет содержимое файла. Имя папки public в адрес не входит: файл public/images/logo.png будет доступен по /images/logo.png.

Как использовать на странице

В HTML пишите адрес от корня сайта, с косой черты в начале:

<link rel="stylesheet" href="/css/style.css">
<img src="/images/logo.png" alt="Логотип блога">

Тогда стили и картинка загрузятся на любой странице блога — и на /posts, и на /posts/2.

Префикс адреса

Если файлы должны открываться по отдельному адресу, укажите его первым аргументом:

// src/app.js
app.use('/static', express.static('public'));

Теперь стили доступны по /static/css/style.css, а по /css/style.css — уже нет.

Абсолютный путь

Путь 'public' считается от папки, из которой запущен Node.js. Если запустить сервер из другого места, файлы не найдутся. Надёжнее строить путь от расположения самого app.js:

// src/app.js
import path from 'node:path';
 
const publicDir = path.join(import.meta.dirname, '..', 'public');
app.use(express.static(publicDir));

import.meta.dirname — папка текущего модуля, здесь src/. Две точки поднимаются на уровень выше, в корень проекта.

Кеширование

Опция maxAge разрешает браузеру хранить файлы у себя и не запрашивать их снова:

// src/app.js
app.use(express.static('public', { maxAge: '1d' }));

Браузер будет брать файлы из своего кеша в течение суток. На время разработки это лучше не включать: правки в CSS не будут видны сразу.

Частая ошибка

Всё, что лежит в public/, доступно любому, кто знает адрес. Не кладите туда файл .env, базу данных, исходный код сервера или загруженные пользователями документы, которые должны быть закрыты. В public/ — только то, что не жалко показать всему интернету.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.