首屏加载太多请求,怎么合并减少?
我们首页现在首屏要加载七八个CSS和JS文件,Lighthouse说请求数太多影响性能。我试过把小图标转成base64内联,但CSS还是拆成了好几个,比如 reset.css、header.css、banner.css……能不能直接合成一个?
比如现在HTML里这样引用:
<link rel="stylesheet" href="/css/reset.css" rel="external nofollow" >
<link rel="stylesheet" href="/css/header.css" rel="external nofollow" >
<link rel="stylesheet" href="/css/banner.css" rel="external nofollow" >
<script src="/js/utils.js"></script>
<script src="/js/home.js"></script>
合并之后会不会有样式冲突或者加载顺序问题?有没有啥工具能自动处理这个?
解决方案:用构建工具自动合并
最靠谱的做法是上构建工具,webpack或者vite都行。我推荐vite,因为配置简单很多,新人上手快。
为什么构建工具好?
它不仅能合并文件,还能帮你处理依赖顺序、压缩代码、加上缓存hash避免改一点代码整个缓存失效。
具体操作步骤
第一步:安装vite
第二步:把CSS文件合并到一个main.css
新建一个入口CSS文件,用@import把其他几个引进去:
第三步:同样处理JS,合并到一个main.js
第四步:配置vite生成单一文件
第五步:在HTML里只引用生成后的文件
第六步:运行构建
然后你dist目录里就两个文件,一个JS一个CSS,完事。
你担心的两个问题
1. 样式冲突怎么办?
这里需要注意,合并文件本身不会导致冲突,冲突是因为你们CSS命名没做好。建议:
用BEM命名规范,比如
.header__logo--active,或者直接上CSS Modules让构建工具帮你生成唯一的类名。如果你们项目已经写乱了,那合并前先重构一下CSS。2. 加载顺序怎么办?
构建工具会根据import顺序自动处理JS执行顺序。你需要做的就是在main.js里按正确顺序import。比如utils.js被home.js引用,那就必须先import utils。
CSS的@import顺序就是加载顺序,这个也要注意。
缓存问题
构建工具会在文件名里加hash,比如
main.a1b2c3.js,这样你改代码重新构建后hash变了,浏览器就会重新请求,不用担心用户缓存旧文件。如果你们项目比较老,不想搭构建工具,也可以用在线工具比如 Online CSS Minifier 或者 jscompress 手动合并,但每次改代码都要手动合并一遍,麻烦且容易出错。
长远来看,还是建议上构建工具,一步到位。