热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《Web前端开发最佳实践》——2.2前端代码重构

本节书摘来自华章计算机《Web前端开发最佳实践》一书中的第2章,第2.2节,作者:党建更多章节内容可以访问云栖社区“华章计算机”公众号查看。2.2前端代码重构代码

本节书摘来自华章计算机《Web前端开发最佳实践》一书中的第2章,第2.2节,作者:党 建 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 前端代码重构

代码重构是业内经常讨论的一个热门话题。重构指的是在不改变代码外部行为的情况下进行源代码修改,重构之前需要考虑的是重构后如何才能保证外部行为不改变。对于后端代码来说,可以通过大量的自动化测试来确保重构后的代码逻辑,可对于普遍缺乏自动化测试的前端代码来说,重构之前一定要考虑再三才能下手。
我曾经有一次不算太成功的前端重构经历,所幸的是没有导致太大的问题,但教训是惨痛的。此次重构的项目本身没有足够的自动化测试,尤其是针对前端的自动化测试,其实在重构之前也预想到了重构的风险。先来介绍重构之前项目存在的问题:项目的前端代码没有统一的规范,不同人员开发的模块对应的代码风格完全不同,即使有相同的逻辑也是由完全不同的代码实现的;而且,不同模块的代码写到了相同的代码文件中,使得文件的代码量很大;项目的功能较多,前端代码量大,代码的文件也多,又由于需求变更频繁,因此代码中的无用代码量较大;网站首页加载时间过长,平均加载时间超过5秒;部分动态模块的加载会导致页面“假死”。总体来说,项目代码存在的问题就是维护性差和性能差,如果要持续地添加新功能,就有必要重构现有的代码。
鉴于项目代码的实际情况,并且考虑到缺乏足够的自动化测试,因此,我权衡再权衡,最终决定先尝试对前端的部分代码进行重构。重构的过程主要分为如下几个步骤。
1)删除无用代码,精简代码。无用的代码主要集中在CSS和Javascript文件中,包括已经不起作用的CSS样式和废弃的Javascript函数。这个重构过程是比较麻烦的,因为修改的过程需要小心翼翼,不停地查看函数和变量在上下文的调用关系,以免错删代码。总体来说,这个阶段的重构还是利大于弊,虽然后续发现了一些由于误删而导致的Bug,但是删除了废弃的代码,提高了后续的可维护性。
2)前端代码规范化。页面的HTML标签中还有大量的内联CSS样式,有些页面的head部分也有CSS样式,需要把这些CSS放到独立的文件中;调整代码的层次缩进格式,不同层级按照4个空格来缩进;更改标准已不推荐的标签,如

等,改为由CSS样式控制;统一命名规则,这里主要涉及HTML中的id和class名称;另外,在Javascript中集中定义局部变量,并把部分全局变量转变为局部变量,缩小变量的作用域。
3)整理基础类库。网站初期为了加快开发的进度而引入了多个框架,其中包括Ext JS、jQuery以及多个jQuery插件。Ext JS和jQuery中重复的功能较多,项目中很多相同的实现使用的是不同类库中的功能,如DOM选择、AJAX请求等。部分jQuery的UI插件的功能也和Ext JS中的功能重复。鉴于项目的状况,只能保守选择同时保留Ext JS和jQuery。重构的内容是统一UI插件的使用、统一基础方法的使用。
4)前端代码模块化。按照模块归类CSS代码,放到模块对应的单独CSS文件中;按照模块分离Javascript代码,按照模块定义不同的命名空间;将Javascript代码中的公共方法归类到独立的共通文件中,同时引入面向对象的思想来重构Javascript代码,进一步明确公有接口和私有接口。
5)提高页面加载性能。将部分不影响首页展示的Javascript文件延迟到页面加载后加载;删除页面中初始隐藏的区域,改为通过Javascript按需动态生成;页面中的部分图片延迟加载;调整CSS和Javascript文件的引用顺序,即CSS在前Javascript在后;给静态文件设置缓存;使用CSS Sprite,合并首页背景图;合并和压缩发布后的CSS和Javascript代码文件。
从上面的重构内容可以看到,这次重构的目的是明确的,即提高前端代码的可维护性和性能。从中也暴露了重构过程中的一些问题:最主要的问题还是低估了重构的风险,导致后续发现了不少新Bug;没有足够的自动化测试,而冒然去修改代码,很难保证最终修改代码的正确性;其次是对于性能优化,事先没有量化,没有做任何性能方面的监控,没有抓住性能主要的瓶颈,所以性能部分的重构就显得比较盲目。
有了这次的重构实践经历,再加上学习业内的一些经验,我归纳了如下的前端重构最佳实践。

  • 重构前一定要预估风险,如果没有足够的自动化测试,最好是先完善自动化测试代码。
  • 重构的目的和范围要明确,切忌盲目修改。前端代码的重构目的主要是提高代码的可维护性、可读性和性能。
  • 最好是先易后难,循序渐进。首先修改诸如命名、格式等不涉及具体逻辑的内容,然后考虑模块化和性能提升等与具体逻辑相关的内容。
  • 重构过程中要持续测试,在多个浏览器中测试,确保重构的部分功能正确。切忌在大量重构后再进行测试,因为大量重构后基本很难记得重构的逻辑,也就有可能遗漏部分测试用例。
  • 如果是性能提升,要事先检测网站的整体性能并量化,找出性能瓶颈。重构过程中要持续监控性能,并对比性能提升的效果。



推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 程序员妻子吐槽:丈夫北漂8年终薪3万,存款情况令人意外
    一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
author-avatar
手机用户2502877953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有