#webpack #compression #express #node
在实现我想做的事情时,将所有信息分组是具有挑战性的。下面是我如何创建webpack并将其与express相关联的方法。
这是webpack文件中的插件部分:webpack.config.js
示例(对象数组)
plugins: [confi1, config2, confi3]
plugins: [
new CompressionPlugin({
filename: '[path][base].gz',
algorithm: 'gzip',
test: /\.js$|\.css$|\.html$/,
threshold: 10240,
minRatio: 0.8
}),
new CompressionPlugin({
filename: '[path][base].br',
algorithm: 'brotliCompress',
test: /\.(js|css|html|svg)$/,
compressionOptions: {
params: {
[zlib.constants.BROTLI_PARAM_QUALITY]: 11
}
},
threshold: 10240,
minRatio: 0.8
})
]
![在此输入图片描述](https://istack.dev59.com/G7pHC.webp)
如果您注意到,我只使用了两种压缩方式,虽然还有更多的方式,但我认为这两种已经足够了。
此外,如果您想学习如何修改选项,可以查看此页面:https://webpack.js.org/plugins/compression-webpack-plugin/
br = Brotli is a lossless data compression algorithm developed by Google)
gzip = is a software library used for data compression (STANDAR). zlib was written by Jean-loup Gailly
我同时使用两种方式,用于支持换行的情况下我们发送br标签;如果不支持,则发送gzip文件;最坏的情况下,我们发送.js文件:现在我们来看看它
如何通过express向客户端发送正确的文件:
以下是...
app.use(
'/static',
expressStaticGzip(path.join('dist', 'frontend'), {
enableBrotli: true,
customCompressions: [
{
encodingName: 'deflate',
fileExtension: 'zz'
}
],
orderPreference: ['br', 'gz'],
setHeaders: function (res, path) {
res.setHeader('Cache-Control', 'public, max-age=0');
}
})
);
![enter image description here](https://istack.dev59.com/4dOu3.webp)
请查看图像中的文件: 如果您使用webpack进行编译,请注意JS的插件(br,gz)。在这种情况下,bundle.js有bundle.js.br和bundle.js.gz;对于CSS,我们也一样。如果客户端发出请求到Static文件夹,在那里将发送给express客户端的文件,他们会根据请求中的标头来决定发送什么。例如,如果您使用Chrome,express将向您发送“br”,但如果您使用Safari,express将向您发送“gz”。
Chrome和Safari的示例:
Chrome: ![example crome](https://istack.dev59.com/uy09X.webp)
Safari的示例:
![example safari](https://istack.dev59.com/RdHx6.webp)
通过这种方法,我们将HTML文件发送给客户端,然后客户端将请求JS文件,但服务器将以压缩形式发送JS文件
app.get('/*', function (req, res) {
let pathServer = process.env.subDOMAIN == "true" ? "" : "/scheduler_app";
res.render('pages/index', { App: "stringApp", script: `<script src="${pathServer}/static/bundle.js"></script>`, css: `<link rel="stylesheet" href="${pathServer}/static/main.css">` });
});