vue项目上的一些报错总结

最近项目告一段落,总结一下值得记录的问题

1. 上传到阿里云的图片,返回的地址在pc端展示正常。小程序上无法展示

原因:图片名称中含有逗号,通过oss地址打开无法预览,逗号后面的后缀被切掉了

只找到这个提问

解决:目前是在上传的时候限制过滤名称中有逗号的。\color{red}{欢迎有清楚的朋友指点迷津}

2. 第三方平台获取到了授权公众号的二维码,在web上展示:此图片来自微信公众平台 未经允许不可引用
image.png

原因:别人设置了防盗链

解决

我这里只有一张公众号二维码展示,直接在img标签上用.  (修改后一定要清空缓存才能看到效果)
方案1.添加meta标签

    给页面添加一个meta标签,在meta标签里指定referrer的值 

    MDN的标准: <meta name="referrer" content="no-referrer">

    Whatwg的标准: <meta name="referrer" content="never">
        影响:<meta>标签name="referrer"属性主要用于控制网页发送给服务器的referrer信息,可以告诉服务器端用户是从哪个页面来到当前网页的,如果来源不是白名单域名就不展示
如果用<meta> 设为never后,也会造成一定的问题,比如在后台中使用了该标签,会导致js和php的一些跳转出现问题,比如js的history.back()方法将找不到上一个页面,因为被禁止referrer了,php的$_[‘HTTP_REFERRER’] 也同样为空值
同时该属性会导致一些第三方的统计代码失效,比如cnzz,百度统计,解决方法是使用iframe包裹一层,用一个单独的html加载统计代码



方案2.添加ReferrerPolicy属性

    ReferrerPolicy (MDN:引用头将被完全省略,没有请求信息随请求一起发送。)    

  // <img src="" referrerPolicy="no-referrer" alt="">

兼容:

      <meta name="referrer" content="never">      <meta name="referrer" content="no-referrer">        referrerPolicy="no-referrer"

Chrome          yes                         yes                          yes

Firefox         yes                         yes                           yes

Edge/IE          yes                         no                            no

看以下红圈不同的标签上用不同的属性

image.jpeg

3.如下图:uniapp中聚焦键盘顶起uView的popup

     小程序键盘高度顶起弹窗,不要在键盘变化事件里,加键盘高度赋值给弹窗高度。最好用样式直接用键盘高度改变bottom
   因为在部分ios机型uni.onKeyboardHeightChange 或者@keyboardheightchange 高度会变化5次,高度一直加就顶到天了

<u-popup
      v-model="showPopup"
      mode="bottom"
      :custom-style="{ bottom: popupBottom + 'px' }"  //  用这个
      height="284"   // 不要去改变这个高度,部分机型有问题
      style="overflow: hidden"
      closeable
      border-radius="20"
    >
      <view class="popup-name">
        <input
          class="name"
          :focus="showPopup"
          :adjust-position="false"
          placeholder="请输入姓名"
          @keyboardheightchange="handlefocus"
          @confirm="handleConfirm"
          @blur="popupBottom = 0"
        />
      </view>
    </u-popup>

// 活的键盘高度顶起来
    handlefocus({ detail: { height } }) {
      // const pxTorpx = height ? height / (uni.upx2px(height) / height) : 0
      this.popupBottom = height
    },
企业微信截图_16149127638073.png

4. vue项目 在跳转路由后,上个页面的请求还在执行,如果失败,请求提示会出现在新页面,这样不好

解决: 跳转后取消上个页面的请求
在axios封装拿到那个请求的cancel方法存到store,
const CancelToken = axios.CancelToken
axios.interceptors.request.use(
config => {
  config.cancelToken = new CancelToken((cancel) => {
    store.commit('setting/pushRequest', {
      cancelRequest: cancel
    })
  })
  return config
},
error => {
  return Promise.reject(error)
}
)

路由跳转进行清空
router.beforeEach((to, form, next) => {
store.commit('setting/clearRequest') // 取消请求
})


//state
cancelRequestArr: [], // 取消请求token数组

//mutation
pushRequest(state, payload) {
    state.cancelRequestArr.push(payload.cancelRequest)
  },
  clearRequest({ cancelRequestArr }) {
    cancelRequestArr.forEach(item => {
      // 取消请求
      item()
    })
    // 实践中发现直接等于[] ,并不能有效清空数组。等于0 更高效
    // 求解释??
    cancelRequestArr.length = 0
  }

5. v-model.number 限制的是正整数,如果我要想正整数和小数都能输入呢,翻了翻找到这个比较好,记录一下。原文地址

下面限制两位小数
const number = {
 bind(el, binding, vnode) {
   // 扩展到element这种库
   const input = el.tagName === 'INPUT' ? el : el.querySelector('input')
   input.addEventListener('compositionstart', () => {
     vnode.inputLocking = true
   })
   input.addEventListener('compositionend', () => {
     vnode.inputLocking = false
     input.dispatchEvent(new Event('input'))
   })
   input.addEventListener('input', () => {
     if (vnode.inputLocking) {
       return
     }
     const oldValue = input.value
     let newValue = input.value
     newValue = newValue.replace(/[^\d.]/g, '')
     newValue = newValue.replace(/^\./g, '')
     newValue = newValue.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
     newValue = newValue.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
     if (newValue) {
       const arr = newValue.split('.')
       newValue = Number(arr[0]) + (arr[1] === undefined ? '' : '.' + arr[1]) // 去掉开头多余的0
     }
     // 判断是否需要更新,避免进入死循环
     if (newValue !== oldValue) {
       input.value = newValue
       input.dispatchEvent(new Event('input')) // 通知v-model更新
     }
   })
   // input 事件无法处理小数点后面全是零的情况 因为无法确定用户输入的0是否真的应该清除,如3.02。放在blur中去处理
   input.addEventListener('blur', () => {
     const oldValue = input.value
     let newValue = input.value
     if (newValue) {
       newValue = Number(newValue).toString()
     }
     // 判断是否需要更新,避免进入死循环
     if (newValue !== oldValue) {
       input.value = newValue
       input.dispatchEvent(new Event('input')) // 通知v-model更新
     }
   })
 }
}
export default (Vue) => {
 Vue.directive('inputFloat', number)
}

6. vue项目在chrome浏览器出现警告

image.png

解决很简单,(直接扣下面插件代码也行,就丁点代码)

npm i default-passive-events -S
在main.js 引入 import 'default-passive-events' 

为什么会有这个提示?
它是 高版本浏览器事件监听里的一个属性,默认false。部分浏览器已经将文档级节点document,windows的监听的这个属性值改为了true
addEventListener(type, listener, {
capture: false, //捕获
passive: false,
once: false //只触发一次
})
所有的现代浏览器,即使在很昂贵的js运行下,也会有一个线程式的滚动特性来允许流畅的滚动,但是,touchstart和touchmove调用preventDefault()能阻止滚动,所以这个滚动优化在有时候会被touchstart和touchmove的所限制。鼠标,触摸事件可以阻止滚动,滚动就会等待监听里面的代码执行,即使是空监听也会耗时
\color{red}{设为passive:true,表示处理事件函数中不会调用preventDefault函数,就会减少了额外的监听,从而提高了性能(不影响滚动)}
上面的插件就是给所有,自己写的,\color{red}{用的框架里的}所有mouse,touch,scroll监听事件加上true
点我看MDN上更详细的

7. vue项目引入地图有警告提示

Parser was blocked due to document.write(<script>)
A parser-blocking, cross site (i.e. different eTLD+1) script


企业微信截图_16218398274958.png
分析:通过引入的百度地图资源很明显看到代码只有数行,它又通过document.write写入了一个外部资源,该资源加上了时间戳作为参数
企业微信截图_16218400113453.png
思考:这是外部资源的常用做法,一般都是些广告和统计功能的第三方脚本,它们为什么这么做?

原因: 需要动态添加一些参数,用户设备的分辨率啊,当前页面 URL 啊,防止缓存的时间戳啊之类的,这些参数只能先用 JS 获取到,再比如国内常见的 CNZZ 的统计代码

<script>
var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cspan id='cnzz_stat_icon_30086426'%3E%3C/span%3E%3Cscript src='" + 
                        cnzz_protocol + 
                        "w.cnzz.com/c.php%3Fid%3D30086426' type='text/javascript'%3E%3C/script%3E"))
</script>

它之所以为用户提供 JS 代码,而不是 HTML 代码,是为了先用 JS 判断出该用 http 还是 https 协议

解决:从外部资源的加载看解决办法
  1. 浏览器加载外部资源,是并行下载达到预解析预加载的目的,执行和渲染还是线性的
    如: 下面三个脚本,每个单独下载时间为1s,几秒后能看到img呢。
    答案:只需要1s
    <script src="a.js"></script>
    <script src="b.js"></script>
    <script src="c.js"></script>
    <img src="a.jpg">
  2. 如果 b是被document.write加载的,a,c并行,b要等到a下载完后才会下载,总体2s
    <script src="a.js"></script>
    <script>
    document.write('<script src="http://thirdparty.com/b.js"></script>')
    </script>
    <script src="c.js"></script>

从报错上看,可以直接将document.write中加载的真实资源,写在head里,这样浏览器就可以预加载了,也不会警告了,算是进行优化了,但这并不是最佳的优化。

  1. 这样做舍弃了 资源的动态参数(时间戳,更新最新资源)
  2. 外部资源一般比较大,放在头部影响页面的加载。建议最好异步
api 改为getscript
<script src="https://api.map.baidu.com/getscript?v=2.0&key=key"></script>

异步才是王道,官网有案例
document.createElement("script") 

记录:上面仅仅是警告提示本身不影响运行,而我正视这个记录的原因是:某天反馈访问项目,地图加载报错导致了界面错误

虽然后来没有复现,应该和代码的加载顺序有关,已改为异步且不影响其他逻辑
关于chrome的优化和document.write不建议使用的更多介绍

以上就是这阶段记录的一些点
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容

  • mobileHack 这里收集了许多移动端上遇到的各种坑与相对解决方案 工具类网站 HTML5 与 CSS3 技术...
    Zoemings阅读 6,533评论 0 12
  • mobileHack 这里收集了许多移动端上遇到的各种坑与相对解决方案 工具类网站 HTML5 与 CSS3 技术...
    安石0阅读 1,893评论 0 5
  • 背景 目前新浪保险在微博内的商城是基于Vue的,但是和微博账号体系是绑定的,一定程度上限制了微博端外的拓展渠道,所...
    一蓑烟雨任平生_cui阅读 859评论 0 0
  • 因为疫情的原因导致本该去学校的日子,却留在了家中,自加入在家协作学习js也有一段时间了,整体上学习效果并不如在学校...
    强化班_刘敬辉阅读 182评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,567评论 0 11