转转前端开发规范的落地实践

车同轨,书同文,行同伦 - 《礼记·中庸》

转转在早期团队较小的时候,没有太多规范,遇到问题用自己最擅长的方式去解决就行。随着公司发展,团队越来越大,因为没有统一规范而造成的问题也越来越多,例如

  • 组件库重复开发,不同小组组件库各有长短,但整体质量有所欠缺

  • 不同业务之间,项目无法直接复用,需要大量的开发改造

  • 新人上手成本高,每个项目都要深度了解其代码与配置,而不是了解完业务就行

  • 一些自动化提效的工具,因为业务项目没有规范,而无法开展

  • 等等。。。

基于这些问题,我们在去年上半年,制定了一个转转前端开发规范,经过这大半年的实践,达到了预期的效果。接下来我会具体介绍下转转的前端开发规范,希望能给大家带去一些帮助。之前我们也分享过转转的中后台规范建设,感兴趣的可以 戳这

规范包含哪些内容

我们通过一张规范架构图来直观的了解一下如上图,我们把规范分为五大类

  • 开发规范

  • 监控规范

  • 协作规范

  • 流程规范

  • 开源规范

其中每个大类下,又包含若干个小分类。本文中,我会详细的介绍下一些重点的规范以及其内容,对于非重点的,待后续我们把文档开源到 Github 上,大家可以自行查阅。

开发规范

本地存储规范

主要包括 localStorage 的使用规范,避免使用存储时会遇到的问题

基础库的使用

使用 localforage 来实现本地存储,该库会优先使用 IndexedDB 以扩大本地存储空间,并采用优雅降级方案,处理了异常情况。

存储溢出问题

localStorage 有存储限制,所以在存储空间用完的情况下,进行 setItem 操作就会报 QuotaExceededError 的错。

事实上,在某些浏览器(如 iOS 11Safari 浏览器)的无痕模式下,localStorage 也是无法读写的,进行 setItem 操作会报一样的 QuotaExceededError 错。

为尽可能避免上述情况,或者在出现时优雅处理,请遵循以下规范:

  • 设置过期时间。按如下方式对存储的数据进行封装,并在合适的时机清理过期数据。

const data = {
  data: Object,
  expiredTime: Date.now() + 7 * 24 * 60 * 60 * 1000
}
  • try...catch 包裹 setItem 操作

try {
  localStorage.setItem('my_data', JSON.stringify(data))
} catch (e) {
  // 错误处理
}

常见的错误处理方法有:清理过期数据并重试一次;转存至 sessionStorage、自定义的全局对象 myStorageVuex 等,但记得在读取时也依次读取。

存储的 key 覆盖问题

key 的命名需要符合如下规范 业务线名_项目名_自定义名称 如:

const PREFIX = 'platform_book_'

try {
  localStorage.setItem(PREFIX + 'my_data', JSON.stringify(data))
} catch (e) {
  // 错误处理
}

注释规范

合理的注释,可以提高代码的可读性和可维护性。

注释的原则
  • 如无必要,勿增注释,应当追求「代码自注释」

// bad
// 如果已经准备好数据,就渲染表格
if (data.success && data.result.length > 0) {
  renderTable(data);
}

// good
const isTableDataReady = data.success && data.result.length > 0;
if (isTableDataReady) {
  renderTable(data);
}
  • 如有必要,尽量详尽,需要注释的地方应该尽量详尽地去写

注释的规范

遵循统一的风格规范,如一定的空格、空行,以保证注释自身的可读性

  • 单行注释使用 //

注释行的上方需要有一个空行;注释内容和注释符之间需要有一个空格

function getType() {
  console.log('fetching type...');

  // set the default type to 'no type'
  const type = this.type || 'no type';
  return type;
}
  • 多行注释使用 /** ... */

/**
 * make() returns a new element
 * based on the passed-in tag name
 */
function make(tag) {
  // ...

  return element;
}
  • 使用特殊标记注释:如 TODO、FIXME、HACK 等

// TODO: 这里还需要做什么

// FIXME: 这里的实现有问题,以后需要优化

// HACK: 这里的处理是为了兼容低端安卓机的 bug
  • 文档类注释,如函数、类、文件、事件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值