Vue项目的痛点
前言
用Vue做项目,难免会有痛点,移动端还是PC端,我也总结了下关于问题:
- 进入详情页的传参问题。
- 服务器接口跨域
- axios封装请求
- UI库的按需加载
- 如何只在当前页面中覆盖ui库中组件的样式
- 定时器问题
- rem文件的导入问题
- 打包后生成很大的.map文件的问题
- fastClick的300ms延迟解决方案
解决webpack打包后-webkit-box-orient: vertical;
- 路由懒加载(也叫延迟加载)
- 开启gzip压缩代码
传参问题
Vue 是单页面,跳转当然需要带参数了:
<router-link :to="{path: 'share',params: { id: 1 } , query: {id: 2}}">分享</router-link>
可以看到传了一个参数id=1,并且就算刷新页面id也还会存在。此时在c页面可以通过id来获取对应的详情数据,
传参数也 有 2种:params,query
获取id的方式是 有2种: this.$route.query.id 和 this.$route.params.id;
但是需要注意的是: params传参时,
如果没有在路由中定义参数,也是可以传过去的,同时也能接收到,
但是一旦刷新页面,这个参数就不存在了。这对于需要依赖参数进行某些操作的行为是行不通的,因为你总不可能要求用户不能刷新页面吧。
各有所需,看你喜欢吧,个人推荐query,haha
服务器接口跨域的问题
报错是说没有访问权限(跨域问题)。本地开发项目请求服务器接口的时候,因为客户端的同源策略,
需要在config 文件夹下改index.js 文件的
axios的封装
Vue 当中当然会用到请求咯,axios 当然我会结合那个啥 拦截器一起做封装,
比如加 可以携带Token,post请求头、签名对请求加密等等,
在我的Vue 分类中详情的。https://www.cnblogs.com/yf-html/p/9264865.html
UI库的按需加载
安装babel-plugin-import插件使其按需加载: npm i babel-plugin-import -D,
并在.babelrc文件中中添加插件配置:
libraryDirectory { "plugins": [
// 这里是原来的代码部分
// ………… // 这里是要我们配置的代码
["import",
{
"libraryName": "vant",
"libraryDirectory": "es",
"style": true
}
]
]
}
每个UI库都是使用差不多的,也需要引用这个插件库,然后配置
如何只在当前页面中覆盖ui库中组件的样式(css的scoped私有作用域和深度选择器)
我们写页面当然都会用到这个<style lang="less" scoped></style>标签中的,加scoped是为了使得样式只在当前页面有效
编译前:
<style scoped>
.example {
color: red;
}
</style>
编译后:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
p { color: red }
设置了作用域时 (即与特性选择器组合使用时) 会慢很多倍。.example { color: red }
,性能影响就会消除。如果你希望 scoped
样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用
<style scoped>
.parent >>> .child { /* ... */ }
</style>
那我们如何优雅地写出
van-tabs /deep/ .van-ellipsis { color: blue};
深度选择器/deep/
是因为我用的sass语言
而对于less或者sass等预编译,是不支持>>>
操作符的,可以使用/deep/
来替换>>>
操作符,例如:.parent /deep/ .child { /* ... */ }
定时器问题
当然需要清除定时器咯,不然很会熬性能的
最后在beforeDestroy()生命周期内清除定时器:
beforeDestroy() {
clearInterval(this.timer);
this.timer = null;
}
- 它需要在这个组件实例中保存这个
timer
,如果可以的话最好只有生命周期钩子可以访问到它。这并不算严重的问题,但是它可以被视为杂物。 - 我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化的清理我们建立的所有东西。
方案2:
const timer = setInterval(() =>{
// 某些定时器操作
}, 500);
// 通过$once来监听定时器,在beforeDestroy钩子可以被清除。
this.$once('hook:beforeDestroy', () => {
clearInterval(timer);
})
类似于其他需要在当前页面使用,离开需要销毁的组件(例如一些第三方库的picker组件等等),都可以使用此方式来解决离开后以后在背后运行的问题。
觉得第2种方法是真的强 ,不是吹的
rem文件
移动端适配都是rem,然后我集合这个
@function pxTorem($px) {
@return $px /75px*1rem
}
在写页面的时候套用这个方法,完美解决了适配各个手机端
;(function(c,d){var e=document.documentElement||document.body,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;e.style.fontSize=(f>=750)?"100px":100*(f/750)+"px"};b();c.addEventListener(a,b,false)})(window);
打包后生成很大的.map文件的问题
们在生成环境是不需要.map文件的,所以可以在打包时不生成这些文件:
在config/index.js文件中,设置productionSourceMap: false
,就可以不生成.map文件
基本可以减小 一半的大小,很稳
fastClick的300ms延迟解决方案
开发移动端项目,点击事件会有300ms延迟的问题。
在main.js中引入fastClick
和初始化:
npm install fastclick --save
import FastClick from 'fastclick'; // 引入插件
FastClick.attach(document.body); // 使用 fastclick
查看打包后各文件的体积,帮你快速定位大文件
如果你是vue-cli初始化的项目,会默认安装webpack-bundle-analyzer
插件,该插件可以帮助我们查看项目的体积结构对比和项目中用到的所有依赖
npm run build --report // 直接运行,然后在浏览器打开http://127.0.0.1:8888/即可查看
温馨提示: 需要关闭那个 npm run dev
开启的本地关掉
解决webpack打包后-webkit-box-orient: vertical ;
在展示页面效果的时候,尤其是移动端上的界面,我们经常会有需求,最多展示两行,其余用“...”代替。
打包后 不起作用了
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
/* autoprefixer: off */
-webkit-box-orient: vertical;
/* autoprefixer: on */
加入 上面的红色注释 ,就行啦
路由懒加载(也叫延迟加载)
非赖加载
import Index from '@/page/index/index';
export default new Router({
routes: [
{
path: '/',
name: 'Index',
component: Index
}
]
})
路由懒加载写法
export default new Router({
routes: [
{
path: '/',
name: 'Index',
component: resolve => require(['@/view/index/index'], resolve)
}
]
})
开启gzip压缩代码
spa这种单页应用,首屏由于一次性加载所有资源,所有首屏加载速度很慢。解决这个问题非常有效的手段之一就是前后端开启gizp(其他还有缓存、路由懒加载等等)。
gizp其实就是帮我们减少文件体积,能压缩到30%左右,即100k的文件gizp后大约只有30k。
vue-cli初始化的项目中,是默认有此配置的,只需要开启即可。但是需要先安装插件:
npm i compression-webpack-plugin
然后在config/index.js中开启即可:
build: {
// 其他代码
…………
productionGzip: true, // false不开启gizp,true开启
// 其他代码
}
现在打包的时候,除了会生成之前的文件,还是生成.gz结束的gzip过后的文件。
具体实现就是如果客户端支持gzip,那么后台后返回gzip后的文件,如果不支持就返回正常没有gzip的文件。
**注意:这里前端进行的打包时的gzip,但是还需要后台服务器的配置。配置是比较简单的,配置几行代码就可以了
还有当然可以把打包的项目用cdn 服务器来管理 ,缓解加载时间和缓存问题。
关于NPM V webpack 对的知识
npm install gulp-sass --save-dev
npm install gulp-autoprefixer --save-dev (为css文件添加浏览器前缀 例如:-webkit-)
npm install gulp-clean-css --save-dev (gulp-clean-css (压缩css文件))
npm install browser-sync --save-dev (browser-sync (监控文件有改动页面随之变动))
npm install gulp-concat --save-dev (文件合并)
npm install gulp-minify --save-dev (文件压缩)
npm install gulp-zip --save-dev (压缩打包文件)
npm install gulp-plumber --save-dev (阻止gulp 插件发生错误导致进程退出并输出错误日志)
npm install gulp-imagemin --save-dev (图片压缩)
npm install gulp-clean --save-dev (清空文件夹)
npm install gulp-rename --save-dev (文件重命名)
npm install gulp-asset-rev --save-dev (版本号 处理css图片路径哈希值的)
npm install gulp-rev-collector --save-dev (gulp-rev的插件,HTML模板更改引用路径)
npm install --save-dev run-sequence
npm install gulp-rev --save-dev (更改版本名)
npm install del --save-dev(删除文件)
Vue项目的痛点的更多相关文章
- 收下这款 Vue 项目模版,它将让你的开发效率在 2021 年提高 50%
这是什么 vue-automation 是一款开箱即用的 Vue 项目模版,它基于 Vue CLI 4 众所周知,虽然 Vue CLI 提供了脚手架的功能,但由于官方的脚手架过于简单,运用在实际项目开 ...
- vue-cli快速构建Vue项目
vue-cli是什么? vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. vue-cli怎么使用? 安装vue-cli之前,需要先装好vue 和 webpack npm i ...
- requirejs + vue 项目搭建2
上篇是年后的项目搭建的,时间比较仓促,感觉有点low 1.gulp-vue 文件对公用js的有依赖,以后别的同事拿去搭其他项目,估计会被喷 2.不支持vue-loader一样写模版语言和es6语法 最 ...
- vue项目目录介绍
Vue项目目录 初始化项目 vue init webpack []projectname] cd [projectname] npm install vue run dev 目录树 +---build ...
- Vue 项目实战系列 (一)
最近一直在学习Vue,基本的文档看完后就需要进行具体的项目进行练手了,本系列文章主要是将我学习过程记录下来,和大家一起学习交流. 我在git上找到了一个淘票票的Vue项目,项目地址: https:// ...
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...
- vue项目构建与实战
关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 由于vue相对来说比较平缓的学习过程和新颖的技术思路,使其受到了广大前后端开发者的青睐,同时其通俗易 ...
- Vue项目搭建完整剖析全过程
Vue项目搭建完整剖析全过程 项目源码地址:https://github.com/ballyalex 有帮助的话就加个星星呗~! 项目技术栈:vue+webpack+bower+sass+axios ...
- 利用webpack构建vue项目
快速搭建vue项目 一,确认自己有无搭建好node以及npm环境,这些是前提,具体安装方法可参考https://nodejs.org/en/. 二,开始构建项目. 第1步:新建一个文件夹,随意命名. ...
随机推荐
- Appium+python--元素定位uiautomatorviewer
一.启动uiautomatorviewer.bat 1. 打开uiautomatorviewer软件,如下图所示,本机路径:E:\downloads\android-sdk_r23.0.2-windo ...
- PHP结合Ueditor并修改图片上传路径 微信小程序 拼接域名显示图片
前言 在使用UEditor编辑器时,一般我们都是需要修改默认的图片上传路径的,下面是我整理好的修改位置和方法供大家参考. 操作 Ueditor PHP版本本身自带了一套上传程序,我们可以在此基础中,找 ...
- LoadRunner 技巧之 添加事务
事务(Transaction)用于模拟用户的一个相对完整的.有意义的业务操作过程,例如登录.查询.交易.转账,这些都可以作为事务,而一般不会把每次HTTP请求作为一个事务. 拿笔者所测试的邮箱系统为例 ...
- delphi application 和 form 主窗体 都是窗口
application 也是一个窗体, 和一般窗体不一样. 主窗体 是一个窗体. 然后这两个窗体,分别计算pid 获得结果竟然一样. 另外句柄是动态,全部都不一样.每一次都不一样.
- JS实战篇
实现选项卡的选择: 效果图如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
错误: 解决: cat /etc/sysctl.conf net.ipv4.ip_forward=1net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_recycle ...
- centos7 安装mongodb4.0笔记
1,添加yum源 vim /etc/yum.repos.d/mongodb-4.0.repo 2,把下面内容加入,并:wq [mongodb-org-4.0] name=MongoDB Reposit ...
- Unity2D RPG游戏开发日志
一.游戏构建设计 场景设计:地面的每一层用unity的TiledMap来设计,首先第一层为地面层,也就是地形的大部分区域的图块:第二层为覆盖层,如图中蓝色线圈起来的柱子的上半部分,由于玩家可以在柱子背 ...
- Matlab学习笔记0—课程导入
0,Matlab语言的介绍 1.什么叫计算? 在汉语中,“计算”一词的含义: 谋划 ,考虑 , 算计.随着电子计算机的产生与应用,人们对“计算”的理解发生了很大的变化. (1) ...
- 【VS开发】【图像处理】ISP图像传感器处理器基础
1 前言 做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的 ...