内容简介:如何提高页面加载性能?http2 为什么特殊,资源为啥不用捆绑打包?在 HTTP/1 中:
如何提高页面加载性能?
网页性能分析工具
如何提高网页加载性能
网页主要在处理文本字符串
- Minify Your Code 压缩清理空格等减小文本体积
- Compress Text Resources (Gzip)
- 减少库的使用
图片资源处理
- 移除不必要的图片 (是否真正的需要图片?)
- 选择合适的图片类型
- 清除图片 元数据(拍着日期,地点,设备等)
- 如有必要,调整图片尺寸
- 压缩
合并文本资源(从 http 请求角度考虑,暂不考虑 http2)
- 合并 css 文件(css 是什么?层叠样式表,所以合并注意层叠覆盖现象)
- 合并 js 文件(js 作用域问题,存在和 css 同样的问题)
- 内联 js 和 css 文件
- 调整资源加载优先级
<!-- 预加载 (提高资源请求优先级)--> <link rel="preload" as="script" href="xxx.js"> <link rel="preload" as="style" href="xxx.css"> <!-- 预连接 (提前简历http请求连接,做好资源提取准备工作)--> <link rel="preconnect" href="https://example.com"> <!-- 预提取 (非关键操作更早发生)--> <link rel="prefetch" href="other.html">
http2 为什么特殊,资源为啥不用捆绑打包?
- 复用请求连接
- 服务器主动推送资源到浏览器
在 HTTP/1 中:
浏览器请求 HTML 文件。
服务器返回 HTML 文件,然后浏览器开始解析。
浏览器遇到
标记,启动对样式表的新请求。
浏览器接收样式表。
http 缓存
Cache-control & Expires
网页构建绘制
协调好 html css javascript 三者依赖关系
webpack 优化加载速度
1.减小生产环境资源文件大小
从两个方面处理:
-
减小打包文件 bundle 大小
启用 mode 为 production 即可,也可通过 optimization 增加自定义配置
webpack3 需要 UglifyJsPlugin -
从 loader 加载器着手处理
比如:
/* comments.css */ .comment { color: black; }
构建压缩后:
// 这里为什么没有压缩呢? (exports = module.exports = __webpack_require__(1)()), exports.push([module.i, '.comment {\r\n color: black;\r\n}', '']);
// webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { minimize: true } }, ], }, ], }, };
2.声明构建环境 Evn 变量
第三方库文件会依赖此条件判断
process.env.NODE_ENV = production;
3. 启用 ES modules
压缩的时候会清除 没有使用的 代码
const render = () => { return 'Rendered!'; }; /* harmony export (immutable) */ __webpack_exports__['a'] = render; const commentRestEndpoint = '/rest/comments'; /* unused harmony export commentRestEndpoint */
4. images 优化
url-loader 内联 base64
5. 优化依赖库
比如:lodash.js Moment.js
babel - plugin - lodash; moment - locales - webpack - plugin;
6. 选择启用 externals 选项
启用 externals,从 cdn 加载
7. webpack mode
// webpack.production.config.js module.exports = { + mode: 'production', - performance: { - hints: 'warning' - }, - output: { - pathinfo: false - }, - optimization: { - namedModules: false, - namedChunks: false, - nodeEnv: 'production', - flagIncludedChunks: true, - occurrenceOrder: true, - sideEffects: true, - usedExports: true, - concatenateModules: true, - splitChunks: { - hidePathInfo: true, - minSize: 30000, - maxAsyncRequests: 5, - maxInitialRequests: 3, - }, - noEmitOnErrors: true, - checkWasmTypes: true, - minimize: true, - }, - plugins: [ - new TerserPlugin(/* ... */), - new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }), - new webpack.optimize.ModuleConcatenationPlugin(), - new webpack.NoEmitOnErrorsPlugin() - ] } // webpack.development.config.js module.exports = { + mode: 'development' - devtool: 'eval', - cache: true, - performance: { - hints: false - }, - output: { - pathinfo: true - }, - optimization: { - namedModules: true, - namedChunks: true, - nodeEnv: 'development', - flagIncludedChunks: false, - occurrenceOrder: false, - sideEffects: false, - usedExports: false, - concatenateModules: false, - splitChunks: { - hidePathInfo: false, - minSize: 10000, - maxAsyncRequests: Infinity, - maxInitialRequests: Infinity, - }, - noEmitOnErrors: false, - checkWasmTypes: false, - minimize: false, - }, - plugins: [ - new webpack.NamedModulesPlugin(), - new webpack.NamedChunksPlugin(), - new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }), - ] }
8. 利用资源缓存
# Server header Cache-Control: max-age=31536000 filename: 'bundle.[chunkhash].js',
// 解决 runtime 运行时 和依赖块,防止源文件更改导致 第三方依赖的hash也会发生改变 optimization: { runtimeChunk: true, }
部分 js 文件 可 内嵌到 html 文件里
懒加载
以上所述就是小编给大家介绍的《web加载优化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 介绍同步加载、异步加载、延迟加载[原创]
- .net加载失败的程序集重新加载
- 虚拟机类加载机制:类加载时机
- 探秘类加载器和类加载机制
- hibernate中加载策略+批加载+懒加载异常【原创】
- [译] React 16.6 懒加载(与预加载)组件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
实战Java高并发程序设计
葛一鸣、郭超 / 电子工业出版社 / 2015-10-1 / CNY 69.00
在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。第二,进一步详细介绍JDK中对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论有关“锁”的优化和提高......一起来看看 《实战Java高并发程序设计》 这本书的介绍吧!