【问题标题】:Serve gzip html page in node在节点中提供 gzip html 页面
【发布时间】:2017-06-24 17:58:04
【问题描述】:

我使用 webpack-compression-plugin 预先将我所有的静态文件和 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。

【问题讨论】:

  • 你找到解决方案了吗?否则,我使用stackoverflow.com/a/15323082/3241111 这对我有用。不知道,如何将它用于 .html 而不是 .js 和 .css bcoz 我不希望服务器在每个请求上为 SSR 压缩 js 和 css
  • 我没有找到简单的解决方案,但我确实找到了一个。我用过 Nginx。使用 Nginx,我可以使用 gzip_static 模块来提供预压缩的静态文件和常规的 gzip 动态模式,它只动态压缩 html 文件。
  • 很好。你也压缩图像吗?
  • 不,不是图片。在使用 pthotoshop save for web feature 和 TinyPNG 在线之前,我会压缩每个图像,因此图像已经被压缩,不建议对它们进行 gzip。
  • 啊,好吧...这很有意义..使用 tinypng 压缩图像之前,但是当我使用 tinypng 压缩我的一张图像(51kb)时,它只下降了 1.5kB 但灯塔抱怨原始图像(51kb)要压缩到 25% :P 我在请求标头中检查了content-type,它接受 gzip 格式.. 可能我需要阅读更多关于此的内容:) 还要在 2 分钟内检查下面的答案...我有什么工作..

标签: express webpack compression gzip brotli


【解决方案1】:

在plugin 的帮助下,正如here 所建议的那样,我得到了它的工作

我的代码: 确保您已预压缩 .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。使用express compression 压缩静态文件(js/css)不是一个好主意,因为它会在每个请求上执行它并且这些是静态文件。 或者,按照建议here

缓存您的结果

您在 cmets 中发布的其他使用 nginx 的解决方案似乎也不错。

【讨论】:

  • 下次有机会我一定会尝试您的解决方案。我也忘了告诉有一个插件brotli-compression-plugin。 Brotli 是一个新标准,而不是 gzip。一切都应该一样。您有三个文件 .js、.js.gz 和 .js.br,浏览器按从最后到第一个的顺序使用它。你也可以用 Nginx 来服务它。我认为这对我来说是最好的方式。我有 .ejs 模板、包、供应商、样式......并且每个静态文件都是用 chunkhash 生成的,并且它的缓存标头设置为 1 年。继续 =>
  • Html 文件没有缓存头,因此浏览器在每次加载时都会联系它,但它会缓存其他所有内容。如果静态文件之间有变化,浏览器会知道,因为它会联系 html。这样,它将仅下载已更改的文件并使用缓存中的所有其他内容。在这种情况下,不使用预压缩的 gzip 但在运行中是有益的。
  • 我也使用.ejs 并将chunkhash 缓存css-js 1 年。不缓存 index.html .. 在这种情况下我不知道如何提供离线支持...另外,“不使用预压缩的 gzip 而是在运行中...”意思是,在这种情况下?我有预缓存的 css-js,它给了我 200(来自磁盘缓存)而不是 304(未修改),这意味着预压缩很好@Igor-Vuk
  • 我说的是 .html。我所有的静态文件也都给出了 200,除了给出 304 的 .html。您可以使用 CDN 进行离线支持。
猜你喜欢
  • 2018-03-24
  • 2011-03-24
  • 1970-01-01
  • 2013-02-13
  • 2017-09-17
  • 2012-09-06
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多