You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import http from '@/utils/request'
export default {
A (param) { return http.get('/api/', param) },
B (param) { return http.post('/api/', param) }
C (param) { return http.put('/api/', param) },
D (param) { return http._delete('/api/', {data: param}) },
}
utils/api/index.js:
import http from '@/utils/request'
import account from './account'
// 忽略...
const api = Object.assign({}, http, account, \*...其它模块*\)
export default api
const TerserPlugin = require('terser-webpack-plugin')
....
new TerserPlugin({
cache: true,
parallel: true,
sourceMap: true, // Must be set to true if using source-maps in production
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
})
本文目录
本文项目基于Vue-Cli3,想知道如何正确搭建请看我之前的文章:
1. 接口模块处理
1.1
axios
二次封装这里封装的依据是后台传的
JWT
,已封装好的请跳过。紧接着的是响应拦截器(即异常处理)
这里做的处理分别是会话已失效和登陆超时,具体的需要根据业务来作变更。
最后是导出基础请求类型封装。
其中给
get
请求加上时间戳参数,避免从缓存中拿数据。除了基础请求类型,还有很多类似下载、上传这种,需要特殊的的请求头,此时可以根据自身需求进行封装。
1.2 请求按模块合并
模块的请求:
utils/api/index.js
:1.3 global.js中的处理
在
global.js
中引入:写接口的时候就可以简化为:
2. 基础组件自动化全局注册
我们写组件的时候通常需要引入另外的组件:
写小项目这么引入还好,但等项目一臃肿起来...啧啧。
这里是借助
webpack
,使用require.context()
方法来创建自己的模块上下文,从而实现自动动态require
组件。这个方法需要3个参数:
在你放基础组件的文件夹根目录下新建
componentRegister.js
:最后我们在
main.js
中import 'components/componentRegister.js'
我们就可以随时随地使用这些基础组件,无需手动引入了。
3. 页面性能调试:Hiper
我们写单页面应用,想看页面修改后性能变更其实挺繁琐的。有时想知道是「正优化」还是「负优化」只能靠手动刷新查看
network
。而Hiper
很好解决了这一痛点(其实Hiper
是后台静默运行Chromium
来实现无感调试)。我们开发完一个项目或者给一个项目做完性能优化以后,如何来衡量这个项目的性能是否达标?
我们的常见方式是在
Dev Tool
中的performance
和network
中看数据,记录下几个关键的性能指标,然后刷新几次再看这些性能指标。有时候我们发现,由于样本太少,受当前「网络」、「CPU」、「内存」的繁忙程度的影响很重,有时优化后的项目反而比优化前更慢。
如果有一个工具,一次性地请求N次网页,然后把各个性能指标取出来求平均值,我们就能非常准确地知道这个优化是「正优化」还是「负优化」。
并且,也可以做对比,拿到「具体优化了多少」的准确数据。这个工具就是为了解决这个痛点的。
全局安装
性能指标
https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceTiming
用例配置
此外,还可以配置
Cookie
访问4. Vue高阶组件封装
我们常用的
<transition>
和<keep-alive>
就是一个高阶(抽象)组件。所有的高阶(抽象)组件是通过定义
abstract
选项来声明的。高阶(抽象)组件不渲染真实DOM
。一个常规的抽象组件是这么写的:
4.1 防抖/节流 抽象组件
关于防抖和节流是啥就不赘述了。这里贴出组件代码:
通过第三个参数
isDebounce
来控制切换防抖节流。最后在
main.js
里引用:使用方式
抽象组件是一个接替Mixin实现抽象组件公共功能的好方法,不会因为组件的使用而污染DOM(添加并不想要的div标签等)、可以包裹任意的单一子元素等等
至于用不用抽象组件,就见仁见智了。
5. 性能优化:eventBus封装
中央事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信。它是实现非父子组件通信的一种解决方案。
而
eventBus
实现也非常简单我们在使用中经常最容易忽视,又必然不能忘记的东西,那就是:清除事件总线
eventBus
。不手动清除,它是一直会存在,这样当前执行时,会反复进入到接受数据的组件内操作获取数据,原本只执行一次的获取的操作将会有多次操作。本来只会触发并只执行一次,变成了多次,这个问题就非常严重。
当不断进行操作几分钟后,页面就会卡顿,并占用大量内存。
所以一般在vue生命周期
beforeDestroy
或者destroyed
中,需要用vue实例的$off
方法清除eventBus
可当你有多个
eventBus
时,就需要重复性劳动$off
销毁这件事儿。这时候封装一个
eventBus
就是更优的解决方案。5.1 拥有生命周期的
eventBus
我们从Vue源码
Vue.init
中可以得知:每个Vue实例有自己的
_uid
作为唯一标识,因此我们让EventBus
和_uid
关联起来,并将其改造:使用:
组件中使用:
6. webpack插件:真香
6.1 取代
uglifyjs
的Terser Plugin
在二月初项目升级Vue-cli3时遇到了一个问题:
uglifyjs
不再支持webpack4.0。找了一圈,在Google
搜索里查到Terser Plugin
这个插件。我主要用到了其中这几个功能:
cache
,启用文件缓存。parallel
,使用多进程并行来提高构建速度。sourceMap
,将错误消息位置映射到模块(储存着位置信息)。drop_console
,打包时剔除所有的console
语句drop_debugger
,打包时剔除所有的debugger
语句作为一个管小组前端的懒B,很多时候写页面会遗留
console.log
,影响性能。设置个drop_console
就非常香。以下配置亲测有效。更多的配置请看Terser Plugin
6.2 双端开启 gzip
开启gzip压缩的好处是什么?
可以减小文件体积,传输速度更快。gzip是节省带宽和加快站点速度的有效方法。
6.2.1
Webpack
开启gzip
这里使用的插件为:
CompressionWebpackPlugin
具体配置:
开启gzip前
开启gzip后 gzip后的大小从277KB到只有~91.2KB!
6.2.2 扩展知识:
Nginx
的gzip
设置打开
/etc/nginx/conf.d
编写以下配置。Nginx
尝试查找并发送文件/path/to/bundle.js.gz
。如果该文件不存在,或者客户端不支持gzip
,Nginx则会发送该文件的未压缩版本。保存配置后,重新启动
Nginx
:开启gzip前
开启gzip后
6.2.3 如何验证
gzip
?通过使用
curl
测试每个资源的请求响应,并检查Content-Encoding
:显示
Content-Encoding: gzip
,即为配置成功。6.2.4 双端Gzip区别及其意义
不同之处在于:
Webpack
压缩会在构建运行期间一次压缩文件,然后将这些压缩版本保存到磁盘。nginx
在请求时压缩文件时,某些包可能内置了缓存,因此性能损失只发生一次(或不经常),但通常不同之处在于,这将在响应 HTTP请求时发生。对于实时压缩,让上游代理(例如 Nginx)处理 gzip和缓存通常更高效,因为它们是专门为此而构建的,并且不会遭受服务端程序运行时的开销(许多都是用C语言编写的) 。
使用
Webpack的
好处是,Nginx
每次请求服务端都要压缩很久才回返回信息回来,不仅服务器开销会增大很多,请求方也会等的不耐烦。我们在Webpack
打包时就直接生成高压缩等级的文件,作为静态资源放在服务器上,这时将Nginx
作为二重保障就会高效很多(请求其它目录资源时)。注:具体是在请求时实时压缩,或在构建时去生成压缩文件,就要看项目业务情况。
求一份深圳的内推
本来还想谢谢动态配置表单相关,但篇幅太长也太难写了。
好了,又水完一篇,入正题:
目前本人在(又)准备跳槽,希望各位大佬和HR小姐姐可以内推一份靠谱的深圳前端岗位!
996.ICU
就算了。huab119
[email protected]
作者掘金文章总集
公众号
The text was updated successfully, but these errors were encountered: