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'));
})