最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 常见的8个前端防御性编程方案

    正文概述 掘金(Peter谭老师)   2021-03-31   491

    关于前端防御性编程

    • 我们大多数情况可能遇到过,后端的由于同时请求人数过多,或者数据量过大,又或者是因为异常导致服务异常,接口请求失败,然后前端出现白屏或者报错
    • 还有一种情况,是前端自身写的代码存在一些缺陷,整个系统不够健壮,从而会出现白屏,或者业务系统异常,用户误操作等
    • 那么,就出现了前端防御性编程

    常见的问题和防范

    1.最常见的问题:
    uncaught TypeError: Cannot read property 'c' of undefined
    

    出现这个问题最根本原因是:

    当我们初始化一个对象obj为{}时候,obj.a这个时候是undefined.我们打印obj.a可以得到undefined,但是我们打印obj.a.c的时候,就会出现上面的错误。js对象中的未初始化属性值是undefined,从undefined读取属性就会导致这个错误(同理,null也一样)

    如何避免?

    js和ts目前都出现了一个可选链概念,例如:

    const obj = {};
    console.log(obj?.b?.c?.d)
    
    2.前端接口层面的错误机制捕获

    前端的接口调用,一般都比较频繁,我们这时候可以考虑使用单例模式,将所有的axios请求都用一个函数封装一层。统一可以在这个函数中catch捕获接口调用时候的未知错误,伪代码如下:

    function ajax(url,data,method='get'){
      const promise = axios[method](url,data)
      return  promise.then(res=>{
      }).catch(error){
      //统一处理错误
    }
    }
    
    

    那么只要发生接口调用的未知错误都会在这里被处理了

    3.错误边界(Error Boundaries,前端出现未知错误时,展示预先设定的UI界面)

    以React为例

    部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界。

    使用示例:

    class ErrorBoundary extends React.Component {
      constructor(props) {
        super(props);
        this.state = { hasError: false };
      }
    
      static getDerivedStateFromError(error) {
        // 更新 state 使下一次渲染能够显示降级后的 UI
        return { hasError: true };
      }
    
      componentDidCatch(error, errorInfo) {
        // 你同样可以将错误日志上报给服务器
        logErrorToMyService(error, errorInfo);
      }
    
      render() {
        if (this.state.hasError) {
          // 你可以自定义降级后的 UI 并渲染
          return <h1>Something went wrong.</h1>;
        }
    
        return this.props.children; 
      }
    }
    
    • 错误边界无法捕获以下场景中产生的错误:

      • 事件处理(了解更多)
      • 异步代码(例如 setTimeout 或 requestAnimationFrame 回调函数)
      • 服务端渲染
      • 它自身抛出来的错误(并非它的子组件)
    4.前端复杂异步场景导致的错误
    • 这个问题可能远不止这么简单,但是大道至简,遵循单向数据流的方式去改变数据,例如:
    //test.js
    export const obj = {
      a:1,
      b:2
    }
    
    //使用obj
    import {obj} from './test.js';
    obj.a=3;
    

    当你频繁使用这个obj对象时,你无法根据代码去知道它的改变顺序(即在某个时刻它的值是什么),而且这里面可能存在不少异步的代码,当我们换一种方式,就能知道它的改变顺序了,也更方便我们debug

    例如:

    //test.js
    export const obj = {
      a:1,
      b:2
    }
    export function setObj (key,value)  {
      console.log(key,value)
      obj[key] = value
    }
    
    5.前端专注“前端”
    • 对于一些敏感数据,例如登录态,鉴权相关的。前端应该是尽量做无感知的转发、携带(这样也不会出现安全问题)
    6.页面做到可降级
    • 对于一些刚上新的业务,或者有存在风险的业务模块,或者会调取不受信任的接口,例如第三方的接口,这个时候就要做一层降级处理,例如接口调用失败后,剔除对应模块的展示,让用户无感知的使用
    7.巧用loading和disabled
    • 用户操作后,要及时loading和disabled确保不让用户进行重复,防止业务侧出现bug
    8.慎用innerHTML
    • 容易出现安全漏洞,例如接口返回了一段JavaScript脚本,那么就会立即执行。此时脚本如果是恶意的,那么就会出现不可预知的后果,特别是电商行业,尤其要注意

    ❤️ 看完三件事

    • 如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

    • 点个「赞」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

    • 关注我,让我们成为长期关系

    • 关注公众号「前端巅峰」,持续为你推送精选好文,也可以加我为好友,随时聊骚。


    起源地下载网 » 常见的8个前端防御性编程方案

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元