前端项目代码规范

118 阅读2分钟

项目基础文件目录结构

├── README.md
├── config-overrides.js
├── package-lock.json
├── package.json
├── public
│   └── index.html                  # cra打包模版文件
├── react-app-env.d.ts
├── src
│   ├── assets                      # 静态资源
│   ├── components                  # 通用业务组件
│   ├── context.tsx                 # 全局配置
│   ├── declaration.d.ts
│   ├── index.tsx                   # 入口文件
│   ├── layout.tsx                  # 布局
│   ├── locale                      # 国际化语言包
│   ├── mock                        # 公共组件模拟数据
│   ├── pages                       # 页面模版
│   ├── react-app-env.d.ts
│   ├── routes.ts                   # 路由配置
│   ├── settings.json               # 配置文件
│   ├── store                       # redux状态管理
│   ├── style                       # 全局样式
│   └── utils                       # 工具库
├── tsconfig-base.json
├── tsconfig.json
└── yarn.lock

高质量代码编写原则

  • 增加代码可读性———注释清晰、命名语义化

  • 提高代码重用性———公共组件和私有组件的放置位置与维护
    设计公用组件时,将其放置在/src/components/*目录下,需要考虑让接口保持弹性,并且高度模块化,多处重复使用不允许轻易被修改,有专人维护必要时需要提供 REAME.md 使用说明或规范的 API 文档和演示 DEMO。 设计某私有页面/模块内部组件,将其放置在/src/page/*目录下,由该模块负责人维护,在内部注释功能。

  • 磨刀不误砍柴工———前期的构思很重要
    构思主要内容:规范的制定、公共组件的设计和复杂功能的技术方案等。

  • 团队沟通交流
    技术分享和codeReview

命名规范

前提:一切命名以通俗易懂为基准原则

文件命名规范

  • 以小写字母开头,采用驼峰式命名
  • 命名应当具有语义,并且避免与基础组件冲突

变量命名规范

驼峰式,通俗易懂即可

事件/方法命名规范

  • 动作事件

    [handle|click|change|drag][事件名][作用dom]。例如:

    点击搜索按钮: handleSearchButton

    点击过滤按钮: clickFilterRadio

    更改某某选项: changeUserSelect

  • 数据处理/工具封装方法

    通俗易懂即可

注释规范

对于一些业务上的复杂处理方法,尽可能的将其功能、参数、返回值一一说明。举例:

/**
 *  对某资源鉴权
 *  params: resource + actions
 *  userPermission: 用户所拥有的权限
 *  return:返回内容
 **/
const auth = (params: Auth, userPermission: UserPermission) => {
  const { resource, actions = [] } = params;
  // 当前 resource 是一个正则
  if (resource instanceof RegExp) {
    const permKeys = Object.keys(userPermission);
    // 获取用户与之匹配的资源
    const matchPermissions = permKeys.filter((item) => item.match(resource));
    // 对匹配的所有资源的权限进行判断。
    return matchPermissions.every((key) => {
      const perm = userPermission[key];
      return judge(actions, perm);
    });
  }
  // resource 是一个简单的字符串。
  const perm = userPermission[resource];
  return judge(actions, perm);
};