前端类的大型 Headless CMS 系统是近年来越来越常见的一种应用场景,其操作界面和内容管理系统 (CMS) 被分离出来,只需要提供 API 服务即可,前端可以通过 API 请求获取数据,组装页面。在这样的系统中,代码的复用和维护问题亦愈发突出。
代码复用问题
一方面,在大型 Headless CMS 系统中,多个页面往往需要用到相同的数据接口,此时就需要在不同的页面中重复书写相似的代码,导致代码冗余和工作量的增大。另一方面,在开发过程中可能会使用到一些公共的组件和功能,直接将这些组件和功能复制粘贴到每个页面中既浪费时间也不方便统一维护。
针对以上问题,我们可以采取以下几种方式:
组件复用
Vue 和 React 都提供了组件化的开发方式,对于需要在多个页面上使用的组件,我们可以将其封装成单独的组件,通过 props 传递数据,通用性也更为强大。比如,可以将多个页面都要用到的 Header 组件、Footer 组件、轮播图组件等进行封装,复用这些组件可以让我们在后期维护时更加轻松。
比如,在 Vue 中可以这样定义一个 Header 组件:
// www.javascriptcn.com code example
<template>
<div class="header">
<h1>{{title}}</h1>
<nav>
<a v-for="item in navList">{{item}}</a>
</nav>
</div>
</template>
<script>
export default {
name: 'Header',
props: {
title: {
type: String,
required: true
},
navList: {
type: Array,
default: () => []
}
}
}
</script>API 封装
对于常用的接口请求也要进行封装,统一管理。我们可以使用 axios 等网络请求工具,在封装的 api.js 文件中定义常用的接口请求方法,并在需要使用的时候进行调用。这样不仅简化了代码量,还方便了 API 维护。
比如,在 Vue 中可以这样定义一个获取文章列表的 API 请求方法:
import axios from 'axios'
export const getArticleList = (params) => {
return axios.get('/api/articles', { params })
.then(res => res.data)
}封装好获取数据的方法后,我们在需要使用这个接口的地方只需要调用这个方法就可以了:
// www.javascriptcn.com code example
import { getArticleList } from '@/api'
export default {
name: 'ArticleList',
data () {
return {
list: []
}
},
created () {
getArticleList({ page: 1, pageSize: 10 })
.then(data => {
this.list = data.list
})
}
}工具库引入
对于一些常用的工具函数,比如时间格式化、字符串截断、数据格式化等,也可以将这些工具函数封装成单独的工具库,在需要使用时通过引入库来调用。这样不仅可以避免重复书写,还可以提高代码的可读性和可维护性。
比如,在 Vue 中可以这样引入 Moment 日期处理库:
// www.javascriptcn.com code example
import moment from 'moment'
export default {
name: 'ArticleDetail',
data () {
return {
article: {}
}
},
created () {
this.getArticle()
},
methods: {
getArticle () {
// ...
this.article.createdAt = moment(this.article.createdAt).format('YYYY-MM-DD HH:mm:ss')
// ...
}
}
}代码维护问题
大型 Headless CMS 系统中,代码的维护是一个重要的问题。因为一旦失控,代码质量也将无法控制。特别是开发人员流动性大、代码规模庞大的情况下,维护成本会迅速上升。
针对以上问题,我们可以采取以下几种方式:
代码规范化
代码的规范化程度的高低非常重要。在大型 Headless CMS 系统中,我们需要在代码规范、工作流以及技术选型等方面做好规划,保证代码质量。可以采用 ESlint 等工具使代码满足规范要求,从而方便管理和维护。
比如,在 Vue 中可以这样配置 ESlint:
// www.javascriptcn.com code example
module.exports = {
extends: [
'eslint:recommended',
'plugin:vue/essential'
],
rules: {
'no-console': 'off'
},
parserOptions: {
parser: 'babel-eslint',
},
env: {
browser: true,
node: true,
},
}文档化
对每一个组件和 API 进行规范化的文档,如何使用、依赖关系、接口说明等等都应该详细说明。这样不仅方便项目其他成员理解,也可以减少以后的沟通成本,提升整个团队的效率。JSDoc 等工具可以用来为代码生成文档。
比如,在 Vue 中对于封装好的 Header 组件可以这样添加 JSDoc 注释:
// www.javascriptcn.com code example
/**
* @name Header
* @description 公共 Header 组件
*
* @props {String} title 标题
* @props {Array} navList 导航列表
*/
<template>
<!-- ... -->
</template>单元测试
编写高质量的单元测试,可以方便地测试代码,并验证其正确性,避免代码出现一些潜在的错误。同时,在后期的维护工作中,单元测试也可以快速定位问题和改进代码质量。Jest、Mocha 等工具都可以用于单元测试。
比如,在 Vue 中对于一个组件可以这样写单元测试:
// www.javascriptcn.com code example
import { mount } from '@vue/test-utils'
import Header from '@/components/Header.vue'
describe('Header.vue', () => {
it('renders props.title when passed', () => {
const title = 'Hello, World!'
const wrapper = mount(Header, {
propsData: { title }
})
expect(wrapper.text()).toMatch(title)
})
})小结
在大型 Headless CMS 系统中,代码复用和维护问题是非常重要的。对于代码的复用问题可以采用组件封装、API 封装、工具库引入等方式来提高代码的复用率;对于代码的维护问题可以采用代码规范化、文档化、单元测试等方式来降低代码后期维护的成本和风险,以确保整个项目的质量和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d7f1bea941bf7134e331bd