• 技术文章 >开发工具 >VSCode

    VSCode中怎么进行前端重构?方法浅析

    青灯夜游青灯夜游2022-03-23 20:12:18转载1889

    如何使用VSCode进行前端重构?下面本篇文章给大家介绍一下在VSCode中进行前端重构的方法,希望对大家有所帮助!

    日常开发中,我们经常会碰到需要重构的时候,VS Code中的 “重构” 菜单给我们提供了丰富了的操作。可以帮我们更高效地完成重构工作。【推荐学习:《vscode入门教程》】

    但是这个菜单每次提供的操作都不一样,如果临时去使用的话,会带来一定的困扰。所以常有同学不敢碰这个重构功能。

    在这里,总结一下常用的一些操作,给大家做做参考。

    首先,来一个常见的重命名,热热身!

    重命名

    为什么要重命名:命名不清晰,无法让人理解。

    操作步骤:

    1.png

    热身完毕,下面我们进入正题!

    重构操作

    2.png

    魔法数字

    为什么要修改魔法数字?因为除进制数之外,数字的实际意义无法被人看懂。

    目标:定义一个常量值,写清楚改数字的实际意义。

    操作:

    例子:今年双十一持续13天,计算除双十一促销结束的时间。

    function promotionEndDate() {
      return new Date(new Date('2022-11-11').getTime() + 13 * 60 * 60 * 24 * 1000);
    }
    
    /**
     * 修改后:
     * 将开始时间 START_DATE,持续的天数 LASTING_DAYS 抽取出来做成变量
     * 如果只有一处使用,则在使用到的函数内定义;
     * 如果多处都有用,可以考虑放在函数外,模块内。
     */
    function promotionEndDate() {
        const START_DATE = '2022-11-11';
        const LASTING_DAYS = 13;
        return new Date(new Date(START_DATE).getTime() + LASTING_DAYS * 60 * 60 * 24 * 1000);
    }

    复杂的逻辑条件

    为什么要修改复杂逻辑?复杂的逻辑,往往条件判断繁多,阅读难度比较高。

    操作:

    例子:返回指定的某个月有多少天

    function monthDay(year, month) {
        var day31 = [1, 3, 5, 7, 8, 10, 12];
        var day30 = [4, 6, 9, 11];
        if (day31.indexOf(month) > -1) {
            return 31;
        } else if (day30.indexOf(month) > -1) {
            return 30;
        } else {
            if ((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) {
                return 29;
            } else {
                return 28;
            }
        }
    }
    
    /**
     * 修改后
     * 是否闰年在日期处理函数中会经常使用,所以将其提取到当前模块的最外层了
     */
    function monthDay(year, month) {
        ...
        if (day31.indexOf(month) > -1) {
            return 31;
        } else if (day30.indexOf(month) > -1) {
            return 30;
        } else {
            if (isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
        }
    }
    
    function isLeapYear(year) {
        return (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0);
    }

    写了注释的代码片段

    更推荐代码即注释的理念。我们写注释之前要想明白为什么需要注释?

    目标:将代码片段抽取出来做成函数,函数以此代码块的具体功能做命名。

    操作:

    例子:ajax 请求

    function ajax(options) {
      options = options || {};
      options.type = (options.type || 'GET').toUpperCase();
      options.dataType = options.dataType || 'json';
      const READY_STATE = 4;
      const NET_STATUS = {
        OK: 200,
        RIDERCT: 300
      };
      const params = this.formatAjaxParams(options.data);
      let xhr;
    
      // 创建 - 非IE6 - 第一步
      if (window.XMLHttpRequest) {
        xhr = new window.XMLHttpRequest();
      } else { // IE6及其以下版本浏览器
        xhr = new window.ActiveXObject('Microsoft.XMLHTTP');
      }
    
      // 连接 和 发送 - 第二步
      if (options.type === 'GET') {
        ...
      } else if (options.type === 'POST') {
        ...
      }
      
      // 接收 - 第三步
      xhr.onreadystatechange = function () {
        if (xhr.readyState === READY_STATE) {
          ...
        }
      };
    }
    
    // 修改后
    function ajax(options) {
      ...
      let xhr;
    
      create();
      connectAndSend();
      recieve();
    
      function create() {...}
      function connectAndSend() {...}
      function recieve() {...}
    }

    过长的函数

    功能拆分做成外部函数,再在内部调用。

    操作:

    例子:上个例子中,可以将 ajax 的接收模块独立成模块的function

    function ajax(options) {
      ...
    
      create();
      recieve();
      connectAndSend(options, xhr, params);
    }
    function connectAndSend(options, xhr, params) {
      if (options.type === 'GET') {
        ...
      } else if (options.type === 'POST') {
        ...
      }
    }

    重复的代码/过长的文件

    操作:

    例子:日期处理函数:

    3.png

    移动到新文件后:

    4.png

    index.js 中,还能跳转到定义的代码,但是实际上并没有引入。

    5.png

    重命名,修复 import/export;

    6.png

    import/export

    default 和命名、命名空间和命名的转换。

    // named
    export function nextMonthDay(year, month) {}
    
    // default
    export default function nextMonthDay(year, month) {}
    
    // namepace 
    import * as refactor from './refactor';
    
    // named
    import { nextMonthDay } from './refactor';

    对象方法

    生成get、set处理器

    const person = {
      age: 32
    };
    
    // 生成get、set处理器
    const person = {
      _age: 32,
      get age() {
        return this._age;
      },
      set age(value) {
        this._age = value;
      },
    };

    模板字符串

    字符串拼接,快速转换成模板字符串:

    class Person{
      constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
      }
      getFullName() {
        return this.firstName + ' ' + this.lastName;
      }
    }
    
    // 模板字符串
    class Person{
      constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
      }
      getFullName() {
        return `${this.firstName} ${this.lastName}`;
      }
    }

    生成get、set处理器,与对象方法的结果类似。

    提取到 class xxx 的 Method, 与上面写注释的代码、重复代码提取的类似。

    在此不再复述。

    提供 ES 2015 类转换,支持原型方法转换。

    const Person = function() {
      this.age = 32;
    };
    Person.prototype.getAge = function() {
      return this.age;
    }
    Person.prototype.setAge = function(value) {
      return this.age = value;
    }
    
    // ES 2015 类
    class Person {
      constructor() {
        this.age = 32;
      }
      getAge() {
        return this.age;
      }
      setAge(value) {
        return this.age = value;
      }
    }

    总结

    重构代码的方法还有很多,这里暂时列了一些。希望对大家有所帮助。

    剩下的内容,大家可以在重构代码时,多点点这个重构菜单,看看是否有惊喜。

    更多关于VSCode的相关知识,请访问:vscode教程!!

    以上就是VSCode中怎么进行前端重构?方法浅析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:VSCode 前端重构
    上一篇:vscode中怎么导入python库?三种方法分享 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 怎么配置VSCode,苏爽的调试Vue、React 代码!• 【吐血总结】VSCode的调试和使用小技巧,让你开发工作效率倍增• 2022年最全VSCode实用插件分享【整理推荐】• VSCode插件分享:一个实时预览Vue/React组件的插件• 为什么要用工作区?VSCode工作区使用指南分享• vscode中怎么导入python库?三种方法分享
    1/1

    PHP中文网