Подтвердить что ты не робот

Кэширование структуры Nodejs Express

Я использую 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, однако при загрузке на сервер кеш больше не работает.

4b9b3361

Ответ 1

Экспресс построен на 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", говоря ему, чтобы он кэшировал этот файл в течение определенного периода времени. Таким образом, это не "загрузка файла один раз, а затем его всегда обслуживать для всех клиентов", но больше "скажите каждому клиенту кэшировать файл при первом скачивании" (что означает, что все клиенты должны будут загрузить этот файл один раз перед тем, как он кэшируется для них).

Ответ 2

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

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

Ответ 3

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

var cacheTime = 86400000*7;     // 7 days

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

Однако мой общий каталог содержит CSS, а также html файлы.

Есть ли способ кэшировать только файлы css, а не html.

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

Ответ 4

EDIT: я ошибался, см. комментарий ниже

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

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

app.use(express.cache(...));
app.use(express.static(...));