Служите gzip html-странице в узле

Я использую веб-пакет-сжатия-плагин, чтобы заранее сжимать все мои статические и hml-файлы в формат gzip и brotli. Если браузер поддерживает это, я использую brotli, если не gzip и последний вариант - оригинальный файл. Так что я бы хотел что-то подобное, например, после комплектации.

bundle.js
bundle.js.gz
bundle.js.br

На сервере я использую express-static-gzip для обслуживания статических файлов, и все работает нормально. Все мои статические активы клиента сжимаются и обслуживаются таким образом.

import expressStaticGzip from 'express-static-gzip'
const app: Express = new Express()
process.env.PWD = process.cwd()

app.set('view engine', 'ejs')
app.set('views', path.join(process.env.PWD + '/src/server/views'))

app.use(expressStaticGzip(path.join(process.env.PWD + '/src/dist'), {indexFromEmptyFile: false, enableBrotli: true, maxAge: '1y'}))

app.use((req, res, next) => {
  res.set('Cache-Control', 'no-cache')
  return next()
})

/* Use server side rendering for first load */
app.use(appRenderer)

// Routes
app.get('*', (req, res) => {
  res.render('index')
})

app.listen(PORT, () => {
  console.log(`
  Express server is up on port ${PORT}
  Production environment
  `)
})

У меня проблема с моим html-файлом, root. Хотя у меня также есть версия gzip и br, это не так. Я делаю это путем объединения кода на стороне сервера. Модуль экспресс-сжатия не работает, и я также хочу статическое сжатие. Я не использую nginx. введите описание изображения здесь

1 ответ

С помощью этого плагина и как было предложено здесь, я получил его работать

Мой код: убедитесь, что вы предварительно распаковали .js а также .css файлы

const checkForHTML = req => {
    const url = req.url.split('.');
    const extension = url[url.length -1];

    if (['/'].indexOf(extension) > -1) {
        return true; //compress only .html files sent from server
    }

    return false;
};

var compress = require('compression');
app.use(compress({filter: checkForHTML}));

const encodeResToGzip = contentType => (req, res, next) => {
    req.url = req.url + '.gz';
    res.set('Content-Encoding', 'gzip');
    res.set('Content-Type', contentType);

    next();
};

app.get("*.js", encodeResToGzip('text/javascript'));
app.get("*.css", encodeResToGzip('text/css'));

Я хотел, чтобы сжатие происходило только для.html, потому что я использую .ejs шаблон, поэтому необходимо сжать.html во время выполнения. Сжатие статических файлов (js/css) с использованием express compression не очень хорошая идея, потому что он будет делать это при каждом запросе, а это статические файлы. Или же, кешируйте свои результаты как предложено здесь

Другое решение, использующее nginx, как вы разместили в своих комментариях, также кажется хорошим.

Другие вопросы по тегам