还是开发体验的问题,跟开发体验有关的项目配置无非就是使用 eslint、prettier、stylelint 统一代码风格。
eslint、prettier、stylelint 怎么配这里就不说了,网上文章太多了。想说的是eslint rule 'prettier/prettier': 'error'一定要开启,以及 stylelint rule 'prettier/prettier': true 也一定要开启。
虽然配置了eslint、prettier、stylelint,但是可能你队友的编辑器并没有装相应的插件,格式化用的也不是 prettier,然后他修改一行代码顺便把整个文件格式化了一遍。所以还得配置 husky + lint-staged,提交代码的时候按规范格式化回去,不符合规范的代码不允许提交。
如果公司的电脑配置还行的话,可以开发阶段就做相应的 lint, 把错误抛出来,中断编译。webpack 可以使用 eslint-loader,stylelint-webpack-plugin;vite 可以使用 vite-plugin-eslint,vite-plugin-stylelint;vue-cli 配置几个参数就可以开启,具体看文档。
什么是 ts-check?举个例子,有一个后端接口的某个字段名称变了,由 user_name 改为了 userName,如果没有配置开发阶段进行 ts-check 并把错误抛出来,那么只能全局查找调用接口的地方去修改,如果改漏了,那就喜提一个 BUG。
ts-check 可以开发阶段就做,也可以提交代码的时候做。开发阶段 webpack 安装 fork-ts-checker-webpack-plugin ,vite 也是找相应的插件(暂时没找到用的比较多的)。提交代码的时候,结合 husky 做一次全量的 check (比较耗时),react 项目执行 tsc --noEmit --skipLibCheck,vue 项目执行 vue-tsc --noEmit --skipLibCheck
ts-check 能好用的前提是你的项目是 TS 写的,接口返回值有具体的类型定义,而不是 any。
主要讲讲 model,service,presenter,view 这几层的代码规范,之前的文章也有简单提到过,这里做个归纳。
import { reactive, ref } from "vue";import { IFetchUserListResult } from "./api";export const useModel = () => { const userList = reactive<{ value: IFetchUserListResult["result"]["rows"] }>({ value: [], }); return { userList, };};export type Model = ReturnType<typeof useModel>;Object,[k: string]: string | number | boolean,Record<string, string> 之类的来偷懒。service 保证足够的“整洁”,model 和 service 是可以直接进行单元测试的,不需要去关心是 web 环境还是小程序环境。
import { Model } from './model';export default class Service { private static _indstance: Service | null = null; private model: Model; static single(model: Model) { if (!Service._indstance) { Service._indstance = new Service(model); } return Service._indstance; } constructor(model: Model) { this.model = model; }}import { message, Modal } from 'antd';import { useModel } from './model';import Service from './service';const usePresenter = () => { const model = useModel(); const service = Service.single(model); const handlePageChange = (page: number, pageSize: number) => { service.changePage(page, pageSize); }; return { model, handlePageChange, };};export default usePresenter;import axios, { AxiosRequestConfig } from "axios";import { message } from "ant-design-vue";const instance = axios.create({ timeout: 30 * 1000,});// 请求拦截instance.interceptors.request.use( (config) => { return config; }, (error) => { return Promise.reject(error); },);// 响应拦截instance.interceptors.response.use( (res) => { return Promise.resolve(res.data); }, (error) => { message.error(error.message || "网络异常"); return Promise.reject(error); },);type Request = <T = unknown>(config: AxiosRequestConfig) => Promise<T>;export const request = instance.request as Request;// #region 编辑用户export interface IEditUserResult { code: number; msg: string; result: boolean;}export interface IEditUserParams { id: number;}export interface IEditUserData { name: string; age: number; mobile: string; address?: string; tags?: string[];}/** * 编辑用户 * http://yapi.smart-xwork.cn/project/129987/interface/api/1796964 * @author 划水摸鱼糊屎工程师 * * @param {IEditUserParams} params * @param {IEditUserData} data * @returns */export function editUser(params: IEditUserParams, data: IEditUserData) { return request<IEditUserResult>(`${env.API_HOST}/api/user/edit`, { method: 'POST', data, params, });}// #endregion上面代码是工具生成的,下篇说说提升开发效率及体验的工具。