Кэширование фреймворка Nodejs Express - PullRequest
24 голосов
/ 17 октября 2011

Я использую Nodejs и Express Js.Также я добавляю NowJS в Express Js для выполнения некоторых операций в реальном времени.

В файле конфигурации у меня есть

app.configure('production', function() {
var oneYear = 31557600000;
app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
app.use(express.errorHandler());});

И я запускаю приложение с помощью этой команды:

$ NODE_ENV=production node app.js

Однако файлы (изображения, css, js), похоже, не кэшируются, они всегда передаются как новый файл.

P / s: я только что проверил это с помощью localhost, кешпохоже, работает на localhost, однако при загрузке на сервер кеш больше не работает.

Ответы [ 4 ]

25 голосов
/ 04 ноября 2011

Express построен на Connect, а Connect предоставляет «статическое» промежуточное ПО. Вот код под капотом для кеширования:

if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));

Вы можете найти этот код здесь:

https://github.com/senchalabs/connect/blob/master/lib/middleware/static.js#L147

Итак, как вы можете видеть, Express отправляет заголовок «Cache-Control» в браузер, приказывая ему на некоторое время кэшировать этот файл. Таким образом, это не «загрузить файл один раз и затем всегда предоставлять его всем клиентам», а скорее «сказать каждому клиенту о необходимости кэшировать файл при первой загрузке» (это означает, что все клиенты должны будут загрузить этот файл один раз, прежде чем он кешируется для них).

13 голосов
/ 08 апреля 2014

Следующий код выполняет работу:

app.use(function (req, res, next) {
    if (req.url.match(/^\/(css|js|img|font)\/.+/)) {
        res.setHeader('Cache-Control', 'public, max-age=3600'); // cache header
    }
    next();
});
10 голосов
/ 13 июня 2014

Следующий код помогает:

var cacheTime = 86400000*7;     // 7 days

app.use(express.static(__dirname + '/public',{ maxAge: cacheTime }));

Однако мой публичный каталог содержит CSS, а также HTML-файлы.

Есть ли способ, которым я могу кэшировать только CSS-файлы, а не HTML-файлы?.

Я попытался установить параметр no-cache в метатеге для файла html, но он не работал.

2 голосов
/ 14 декабря 2011

РЕДАКТИРОВАТЬ: я был не прав, см. Комментарий Eug ниже

Connect включает промежуточное программное обеспечение для кэширования: http://senchalabs.github.com/connect/middleware-staticCache.html

так что это должно быть так же просто, как

app.use(express.cache(...));
app.use(express.static(...));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...