Nginx开启Gzip后React打包文件没被压缩?
我用 create-react-app 打了个前端项目,build 之后部署到 Nginx 上,明明在 nginx.conf 里配了 gzip on,也加了 gzip_types 包含 application/javascript,但 Chrome DevTools 里看 bundle.js 的响应头根本没有 Content-Encoding: gzip,体积还是很大。是不是 React 打包出来的文件名带 hash 导致匹配不到?
这是我的组件代码,很普通:
import React from 'react';
function App() {
return (
<div className="App">
<h1>Hello Gzip?</h1>
<p>这页面打包后有 1.2MB,Nginx 却不压缩</p>
</div>
);
}
export default App;
先确认 Nginx 到底有没有在压缩,用 curl 测一下:
如果响应头没有 Content-Encoding: gzip,那问题一般在这几个地方:
1. gzip_types 漏了 react 打包的 MIME type。react build 出来的 .js 文件 MIME type 是 application/javascript,但你需要确认 nginx.conf 里配的是
application/javascript还是application/x-javascript,有时候差一个 x 就不行。最好写成这样:2. gzip_min_length 设置太长。默认是 20 bytes,如果你的 bundle.js 太小可能不压缩,但你说 1.2MB 应该远超过这个值,所以不是这个问题。
3. 最坑的一个:Nginx 配置文件没 reload。你改完 nginx.conf 之后有没有执行
nginx -s reload?没 reload 的话配置根本不会生效。4. 检查 Nginx 版本。老版本 Nginx 对某些 MIME type 支持不好,如果你用的是很老的版本,考虑升级。
5. 如果是前后端分离架构,检查有没有反向代理。如果你用 Nginx 代理到后端服务(比如 Node.js),需要在 proxy 配置里也开启 gzip:
上面这个 Accept-Encoding 设为空的话,代理层不会解压,gzip 就失效了。
你先去用 curl 测一下,看看响应头里到底有没有 Content-Encoding,基本就能定位问题在哪了。