Express.static vs. res.sendFile

Какая разница и какую мне использовать? Моя цель - просто статические html-страницы и файлы.

router.use('/', express.static(path.resolve(public + '/index.html')))

или

router.get('/', function(req, res) {
  res.sendFile(path.resolve(public + '/index.html'))
})

Ответ 1

Статическое промежуточное ПО и sendFile() в основном одинаковы - они оба передают поток файлов в поток ответов.

Разница в том, что express.static будет:

  • установите ETag для вас
  • позволяет вам устанавливать резервные копии расширения (например, html → htm)

sendFile, с другой стороны, будет:

  • установить HTTP-заголовок ответа Content-Type на основе расширения файла

Оба они будут:

  • установить свойство max-age для Cache-Control
  • set Last-Modified header
  • позволяет вам устанавливать любые другие заголовки через объекты параметров
  • позволяют игнорировать dotfiles

Основным преимуществом использования статического промежуточного программного обеспечения является то, что вам не нужно писать конкретный маршрут для каждого файла отдельно (или дезинфицировать параметры), а просто указывать промежуточное программное обеспечение в нужном каталоге.

Ответ 2

Если вы хотите обслуживать любые файлы из вашего каталога public, вы должны использовать промежуточное программное обеспечение express.static для обслуживания всего каталога, установленного в корневой каталог приложения.

(Кроме того, вы можете подумать о включении промежуточного ПО статической службы в качестве зависимости от вашего проекта как serve-static, чтобы он мог обновляться независимо от Express.)

var serveStatic = require('serve-static'); // same as express.static

/* ... app initialization stuff goes here ... */

router.use(serveStatic(public)); // assuming you've defined `public` to some path above

Это ответит на запросы файлов, отправив файлы, прочитав index.html файлы для ответа на запросы для корней каталогов.

Если, однако, у вас есть какая-то сложная логика на вашем маршруте (или вы можете в какой-то момент в будущем), тогда вы должны использовать sendFile. Например, для сервера, который каждую минуту посылает разные значки:

router.get('/favicon.ico', function(req, res) {
  return res.sendFile(path.resolve(public, '/icons/' + new Date().getMinutes() + '.ico'));
})