低代码平台
普通的后端管理系统 有必要构建低代码平台吗,如果要修改怎么修改呢
性能问题排查
首屏渲染指标
如何使用chrome devtools分析性能
- 查看network资源加载 size有两种大小 网络传输大小和资源实际大小
- dom content load时间
- 用performance record网页加载的性能,查看报告中,main(主线程)的任务调用;timings 关键事件:DCL、FP、FCP、FMP、LCP。
白屏结束时间= FP事件触发时间 、首屏结束时间= FCP事件触发时间。TTI:用于标记应用已进行视觉渲染并能可靠响应用户输入的时间点。Long Task:阻塞主线程达 50 毫秒或以上的任务,可以通过PerformanceObserver获取,performance中右上角标红的任务。
dom节点数一直在增长,怎么优化dom节点数过多的问题?
- 减少dom结构里没用的节点,避免div无用的嵌套
- 考虑多使用css伪元素:before:after
- 在react中,代码片段用<></>包起来,而不要用div,在vue中用template
- 可以加定时器任务做页面DOM清理,setInterval定时对动态添加的元素进行扫描和删除
- 不要有detached DOM
浏览器关键渲染路径
javascript>Style>Layout>Paint>Composite
影响回流操作:(performance中layout)
- 添加/删除元素
- 操作styles
- display:none
- offsetleft、scrolltop、clientwidth
- 移动元素位置
- 修改浏览器大小、字体大小
回流是不可避免的,还需要避免布局抖动
- 浏览器为了帮助提升布局性能,会尽量地把修改布局的操作推迟。但如果有读取布局参数的操作,就会为了获取最新的结果,就会立即重新计算布局,如果之后立即写布局,并且连续不断地循环这种forcedReflow强制回流的操作,就会发生布局抖动。
- 规避措施:避免回流、通过transform:translate位移,opacity。react、vue中通过虚拟dom提升性能。
- 读写分离。读布局,修改布局进行分离。
减少重绘
示例:点击卡片、进行无限旋转。
tips:通过rendering 勾选paint flashing,可以在页面中标识出发生重绘的元素。
通过transform:translate位移,opacity减少重绘。
willchange 属性可以创建新的图层。可以把dom提取到一个单独的图层里,不影响其他元素的渲染。
react时间调度实现
16版本Fiber原理
如何用requestAnimationframe实现requestIdleCallback
环形链表插入任务
性能瓶颈:javascript
js 下载,编译&解析,加载 需要提高js部分的时间,这样用户可交互的时间将提前
- code splitting 代码拆分,按需加载
- tree shaking 代码减重
- 避免长任务
- 避免超过1kb的行间脚本,合理规划首屏资源大小
- 使用raf和ric进行时间调度
- 可见不可交互vs最小可交互资源集
V8编译原理
parse => 抽象语法树=> 优化编译 => 反优化(不合适的优化进行回退)
优化机制
- 脚本流(大于30k的js认为可以边下载边提前解析)
- 字节码缓存
- 懒解析
函数优化
懒解析vs饥饿解析
通过用括号包裹函数,即可开启饥饿解析,告诉解析器立即解析,而不是等到要使用的时候再解析。optimize.js可以帮助我们把uglyfy.js意外地移除括号的再添加回来。
对象优化
HTML优化
- 减少iframe使用(开销相比较普通dom要大很多),可以做延迟加载,等其他dom加载完成后再加载iframe
- 压缩空白符
- 减少层级嵌套
- 避免使用table布局
- 删除注释
- css&js尽量外链
- 删除元素默认属性
css优化
- 降低css对渲染的阻塞
- 利用gpu进行动画渲染
- 使用contain属性
- 使用font-display属性(字体下载完成之前浏览器选择字体的策略)
- 字体加载优化:使用unicode-range进行大字体文件的分片
- 使用ajax+base64异步加载字体
图片优化
- jpg/jpeg 压缩比很高,色彩保存较好,纹理和边缘比较模糊 (imagemin工具网站)
- png 对jpg的缺点进行了弥补,体积会比jpg偏大,做一些icon、logo(imagemin-pngquant)
- webp 压缩比例更高,色彩保存也较好
webpack构建优化
convertion over configuration 约定大于配置
webpack4两种mode,prod模式下webpack做了哪些工作?
- terser-webpack-plugin treeshaking js代码,减少js文件体积
- 在生产模式下,有一个作用域提升的配置,作用是:进行依赖关系的合并,代码体积减少,减少依赖查找时间,提高执行效率
- @babel/polyfill 配置useBuildtIns:true,达到treeshaking的效果
- @babel/plugin-transform-runtime的作用:辅助函数的复用
- @babel/preset-env插件的targetbrowsers配置: >0.25%
提问:
- webpack有没有做过一些优化工作?
- 对项目的依赖进行优化,避免打包时对不变的库重复构建,打包时生成dllPlugin,动态链接库。可以在dev环境,提升构建速度,提升开发效率。
- 代码拆分,公共代码抽离?
- 压缩资源,使用Gzip压缩。传输阶段动态压缩和对资源文件进行文件的压缩是不同的概念。
- 启动持久化缓存,nginx配置html资源永不缓存,其余资源设置很长的缓存,利用webpack 文件hash路径进行资源的更新;contenthash和chunkhash,推荐使用前者。
- 打包监测,使用--report进行打包体积监测;
- productionSourceMap去除生产环境sourceMap;
- 增加缓存命中:chuckhash、contenthash;
- 打包速度优化:resolve.alias,resolve.extensions;
- 配置rule的查找范围,利用多线程提升构建速度。
- 删除async chunck的prefetch链接并使用webpack的内联注释/* webpackPrefetch: true */手动选择要提前获取的代码区块,webpack 的运行时会在父级区块被加载之后注入 prefetch 链接。
react/vue按需加载的实现方法
react 用@loadable/component组件做路由动态加载组件。vue直接用import动态加载,或者使用异步组件。
http
keepalive配置
查看某个网址的http配置curl-v http…
keepalive_timout 65
keepalive_requests 100
在用户过多的时候,建立过多的Keepalive的通道会让服务器不堪重负
Http缓存方案
Nginx配置html文件永不缓存怎么配置
304是表示可以从浏览器缓存拿取资源
ETag+If-none-match唯一标识是否匹配判断文件是否发生变更
SeviceWorker/pwa
Mozilla网站查看http协议参数
提问:是否有通过http缓存策略节省http网络资源和提升网页访问速度?
http2
怎么查看http使用的版本
只有https才能开启http2
多路复用,真正并发
Http2主动推送(固定资源推送)和websocket 的区别
二进制传输,相比较文本传输,更安全和更高得压缩比
服务端渲染
调整资源加载顺序
内存泄漏
组件封装
怎么封装一个
vue框架
v-for为什么要绑定key,绑定key是带来效率的提升还是什么?
安全方面
cookie
一级域名:aaa.com 二级域名:bbb.aaa.com 三级域名:ccc.bbb.aaa.com
cookie设置规则:
在当前域名下,只能设置当前域以及父域的cookie,不能设置子域下的cookie。
cookie访问规则
cookie挂载在某个域下,只有在此域名下或者此域名的子域下才能获取cookie。
cookie有哪些属性设置
domain
path
samesite lax属性防csrf
secriuty
cookie的samasite属性在chorme 80版本之后表现为什么
Lax
CSRF攻击
xss攻击 ddos攻击
webpack
浏览器不同的内核css写法不同,怎么处理浏览器兼容性问题?
postcss-loader的autoprefixer插件,自动添加前缀。
怎么拆包
css
BFC布局
Flex布局性能提升,创建一个父容器,和十万个Div 盒子,盒子在父容器中横向排列,排列不下就换行,分别用float和flex实现,并统计渲染时长。
flex怎么调整间距
HTML meta标签作用
如何禁止视口缩放?如何禁止通过手势返回上一页?
选择器优先级
伪类,伪元素 svg有哪些加载的方式
微前端
可视化平台(BI工具)
- 和后端的数据格式是怎么约定的?
- 如何适配多数据源?
- 如何方便的扩展一种图表格式?require.context
- 如何渲染10万+的大数据量图表?
- 如果一张报表里面包含100+的图表,图表可以拖拽,比方说要支持从第一个拖到最后一个,这张报表在用户体验上有什么问题?有什么解决方案? 1)渲染需要做懒加载;2)拖拽需要考虑报表滚动的距离。
- 如果http版本是h2版本,那限制http并发请求数还有意义吗?
- 如果有一段代码在组件mounted里面是这样写的,会有什么问题?
const el = this.$el.querySelector('.my-chart')
this.$el.addEventListener('scroll', ()=>{
if( // some 条件){
el.style.display = ‘none’
}
})
Icon font获取网址:icofont font awesome
vue源码中的实用utils
/** * Always return false. */
const NO = () => false;
isOn 判断字符串是不是 on 开头,并且 on 后首字母不是小写字母
const onRE = /^on[^a-z]/;
const isOn = (key) => onRE.test(key);
// 例子:
isOn('onChange'); // true
isOn('onchange'); // false
isOn('on3change'); // true
onRE 是正则。^符号在开头,则表示是什么开头。而在其他地方是指非。
与之相反的是:$符合在结尾,则表示是以什么结尾。
[^a-z]是指不是a到z的小写字母。