项目是公司主打业务产品之一的可视化子项目,与其他子项目几乎没有耦合,所以可以单独拎出来重构。
具体业务不作描述。技术主要用的是vue2系列和JavaScript,还有一个自研的可视化工具库。第一个重构原因就是没有引入静态类型,导致查看一个对象结构需要翻来覆去在多个文件中查找。第二是因为之前新增代码模式一般为:“来一个需求加一段代码”,长期积累导致代码结构混乱,可读性差。第三是各个状态模块耦合度高,加大了代码维护难度。
一、在JavaScript中使用TypeScript。“什么?在JS中使用TS? 闻所未闻。 ” 在看到TS官网手册最后一条"Type Checking JavaScript File"之前,我也这样想。其实,TS和VSCode(一款IDE)结合,也可以实现静态类型检测,只不过使用注释形式,一样支持tsconfig.json和自定义Typing。
type TypeApple = { name: string, count: number }
/** @type {TypeApple} */
const apple = { name: 'foo', count: 100 }
二、细化模块分类。一般情况下,模块都会有耦合。但如果耦合度过高,往往是因为模块没有细分到位。如果细化模块?举例,假如有一个模块叫Operation,里面既包含操作相关逻辑,也有操作面板逻辑。随着业务发展,操作面板逻辑越来越多。我们完全可以将操作面板逻辑单独抽成一个模块OperationPanel。
三、解耦可视化库和Vue/Vuex。写业务的时候,很容易因为方便,在Vue组件或Vuex模块中代码越写越长,越来越难维护。这个项目也不列外。所以重构的时候,单独将可视化库喜爱那个管逻辑抽成模块,并使用类Vuex写法(state, getters, mutations, actions)进行管理。
class Counter {
// # state
/** @type {number} */
count = 0
// # getters
get countText() { return `Count is: ${ this.count }` }
// # mutations
/** @param {number} count*/
SET_COUNT = count => { this.count = count }
// # actions
/** @param {number} count*/
logCount = ( count ) => {
this.SET_COUNT( count )
console.log( this.countText )
}
}
四、最后一条,编写可维护性高的代码。这里说两个方法。
第一个是“使用Map”。处理“一个有多类型的数据”需要使用判断,常见有3种方法:If, Switch, Map。If的使用简单粗暴,容易理解。
if ( animalType === 'dog' ) {
console.log( 'Wang!' )
} else if ( animalType === 'cat' ) {
console.log( 'Miao!' )
} else if ( animalType === 'bird' ) {
console.log( 'Jiu!' )
}
Switch可以看做是If的简化。
switch ( animalType ) {
case 'dog':
console.log( 'Wang!' )
break
case 'cat':
console.log( 'Miao!' )
break
case 'bird':
console.log( 'Jiu!' )
break
}
而Map针对性最强,并且最简洁、最易于维护。
const logMap = {
dog: () => console.log( 'Wang!' ),
cat: () => console.log( 'Miao!' ),
bird: () => console.log( 'Jiu!' ),
}
logMap[ animalType ]()
具体使用也哪一种因场景而异,但多数场景下,使用Map可读性更强。
第二个是“使用getters和mutations”。比如定义一个模块的`:operationGetters.js`, 里面提供各种用来获取与操作有关的常量和方法。
export const OPERATION_TYPE_A = 0
export const OPERATION_TYPE_B = 1
export const OPERATION_TITLE_MAP = {
[ OPERATION_TYPE_A ]: 'Title A',
[ OPERATION_TYPE_B ]: 'Title B',
}
export const getOperationTitleByType = type => OPERATION_TITLE_MAP[ type ]
定义mutations则是定义一个提供相关各种变更数据方法的文件。在维护代码的时候,查找变更方法名即可直接找到更改数据的出处。
export const SET_OPERATION_TITLE = ( operation, title ) => { operation.title = title }
代码量减少了快一半,性能显著提升,最重要的是代码可读性、可维护性大大增强,从而淡定从容应对之后的新需求。
原文来自:https://terry-su.github.io/cn/summary-of-refactoring-project/
在了解什么是重构和回流之前,我们应该先看看浏览器是怎么渲染的?浏览器的渲染过程;什么是重构和回流;什么操作会引起重绘、回流;浏览器对回流的优化;如何减少回流、重绘
在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为;你有用过哪些前端性能优化的方法?减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适
我从基础架构部门,转调到业务部门。技术负责人想让我搞定业务系统的稳定性问题。当时的业务系统确实存在不少问题,不过我初来乍到,对整体系统不熟悉,就想在熟悉一段时间后再动手。
代码不可能在第一次就写得完美,这是一个持续修改的过程,那么应该怎么来进行呢?好代码的检验标准就是人们是否能轻而易举地修改它。
单一职责的定义可以理解为:一个对象或者方法,只做一件事。遵守单一职责的实例太多了,下面简单列举一下。说是这样说,但是大家看着可能会有点懵,看不出来遵守单一原则有什么好处,下面看一个实例。
React是当前前端应用最广泛的框架。三大SPA框架 Angular、React、Vue比较。Angular出现最早,但其在原理上并没有React创新的性能优化,且自身相对来说显得笨重。Vue出现最晚,其核心原理学习了React
1. 整理一套vscode中格式化配置,在页面保存时自动格式化,团队成员格式统一(搭配eslint)。2. 整理项目中的命名(不要嫌长,但也不能过于冗长,尽量能让人一眼看明白)
JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的程序很容易。然而,要编写一段干净的JavaScript 代码是很困难的。
我在一家创业公司的小团队里搞软件开发。彼时我们有一位真实的企业客户,且软件的第一版也已发布。开发按进度完工,在发布时我欣喜若狂
过去,我一直想着抽时间写一个小的前端工具,以对代码进行自动化的重构。但是呢,经过我再三的考虑,我暂时取消了这个打算 —— 主要是没时间
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!