命名规范-前端项目开发

642 阅读7分钟

命名规范

从 目录、图片、HTML/CSS文件、ClassName 的命名等层面约定规范团队的命名习惯,增强代码的可读性,降低团队阅读成本。

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用

正例:henan / luoyang / rmb 等国际通用的名称,可视同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

杜绝完全不规范的缩写,避免望文不知义:

反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

一)目录/文件命名规范

1.1 项目命名

全部采用小写方式, 以中划线分隔。

正例:mall-management-system

反例:mall_management-system / mallManagementSystem

1.2 目录命名

全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数

正例: scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc

反例: script / style / demo_scripts / demoStyles / imgs / docs

【特殊】VUE 的项目中的 components 中的组件目录,使用 kebab-case 命名

正例: head-search / page-loading / authorized / notice-icon

反例: HeadSearch / PageLoading

【特殊】VUE 的项目中的除 components 组件目录外的所有目录也使用 kebab-case 命名

正例: page-one / shopping-car / user-management

反例: ShoppingCar / UserManagement

常用目录名推荐:

  • 项目文件夹:project-name
  • 公用文件夹:public
  • 源代码文件夹:data-src
  • 打包编译文件夹:dist
  • 文档文件夹:docs
  • 打包编译脚本文件夹:scripts
  • 示例文件夹:examples、demos
  • 组件文件夹:components
  • 工具代码:utils、tools、helpers
  • 插件文件夹:plugins
  • 库文件夹:lib
  • 页面文件夹:views、pages
  • 路由文件夹:router
  • 配置文件夹:config
  • 资源抽取文件夹:vendors
  • 资源文件夹:assets
  • 静态资源文件夹:static
  • 样式文件夹:css、styles
  • 脚本文件夹:js
  • 图片文件夹:img、images
  • 字体文件夹:fonts
  • 命令脚本:bin
  • 测试文件夹:__tests__、tests
  • 压力测试文件夹:benchmarks

1.3 文件名命名

大多数 Web 服务器(Apache、Unix)在处理文件时都区分大小写。例如,flower.jpg 不是 Flower.jpg。

但是,如果从不区分大小写的服务器切换到区分大小写的服务器,可能会出现问题。所以,建议在所有服务器中使用小写文件名,尽管它们支持区分大小写。

  •  代码文件命名:包括但不限于html、js、css文件,使用小驼峰命名,如:fileName

正例: renderDom.js / signup.css / index.html 

反例: RenderDom.js / UserManagement.html

  •  组件文件命名:如react,vue组件,使用大驼峰命名,如:ComponentName

正例: RenderDom.jsx / RenderDom.vue 

反例: renderDom.jsx /renderdom.vue 

  •  资源文件命名:包括但不限于图片、字体、音频、视频文件,使用下划线连接命名,如asset_name

正例: flower.png ,pa18_activty_background.png

反例: Flower.png,  pa18-activty-background.png

二)代码命名规范

2.1.变量命名

JavaScript的变量名是区分大小写的。小写和大写字母是不同的。例如,你可以定义三个独特的变量来存储一只狗的名字,示例如下:

let DogName = 'Scooby-Doo';
let dogName = 'Droopy';
let DOGNAME = 'Odie';
console.log(DogName); // "Scooby-Doo"
console.log(dogName); // "Droopy"
console.log(DOGNAME); // "Odie"

然而,最值得推荐的声明JavaScript变量的方式是驼峰命名。可以对JavaScript中所有类型的变量使用驼峰命名,以确保不会出现多个同名的变量。

// bad
let dogname = 'Droopy'; 
// bad
let dog_name = 'Droopy'; 
// bad
let DOGNAME = ‘Droopy’; 
// bad
let DOG_NAME = 'Droopy'; 
// good
let dogName = 'Droopy';

变量语义化,变量的名字应该描述存储的值。例如,如果需要一个变量来存储狗的名字,应该使用 dogName 而不是只使用 Name。

// bad
let d = 'Scooby-Doo';
// bad
let name = 'Scooby-Doo';
// good
let dogName = 'Scooby-Doo';

2.2布尔值命名

当涉及到布尔变量时,应该使用 is 或 has 作为前缀。例如,一个布尔变量来检查狗是否有主人,应该使用 hasOwner 作为变量名。

// bad
let bark = false;
// good
let isBark = false;
// bad
let ideal = true;
// good
let areIdeal = true;
// bad
let owner = true;
// good
let hasOwner = true;

2.3 函数命名

JavaScript 函数名称也区分大小写。因此,与变量类似,推荐使用驼峰命名。

除此之外,还应该使用描述性名词和动词作为前缀。例如,声明一个函数来查询名字,函数名应该是 getName。

// bad
function name(dogName, ownerName) { 
  return '${dogName} ${ownerName}';
}

// good
function getName(dogName, ownerName) { 
  return '${dogName} ${ownerName}';
}

2.4 方法命名

JavaScript 函数和方法的结构非常相似,命名约定规则也是相同的。推荐使用驼峰命名,并使用动词作为前缀。

class DogCartoon {
  constructor(dogName, ownerName) { 
    this.dogName = dogName; 
    this.ownerName = ownerName; 
  }

  getName() { 
    return '${this.dogName} ${this.ownerName}'; 
  }
}

let cartoon= new DogCartoon('Scooby-Doo', 'Shaggy');
console.log(cartoon.getName());// "Scooby-Doo Shaggy"

2.5 常量命名

JavaScript 常量也区分大小写。但是,常量应该大写,因为它们是不变的变量。

const LEG = 4;
const TAIL = 1;
const MOVABLE = LEG + TAIL;

如果变量声明名称包含多个单词,使用下划线分隔。

const DAYS_UNTIL_TOMORROW = 1;

2.6 类命名

JavaScript类的命名规则与函数一样。必须使用描述性的标题来解释这个类的功能。

class DogCartoon { 
  constructor(dogName, ownerName) { 
    this.dogName = dogName; 
    this.ownerName = ownerName; 
  }
}

var cartoon = new DogCartoon('Scooby-Doo', 'Shaggy');

2.7 组件命名

JavaScript组件在React、Vue等前端框架中被广泛使用。建议使用Pascal命名法(大驼峰式命名法)。

// bad
function dogCartoon(roles) { 
  return ( 
    <div> 
      <span> Dog Name: { roles.dogName } </span> 
      <span> Owner Name: { roles.ownerName } </span> 
    </div> 
  );
} 

// good
function DogCartoon(roles) { 
  return ( 
    <div> 
      <span> Dog Name: { roles.dogName } </span> 
      <span> Owner Name: { roles.ownerName } </span> 
    </div> 
  );
}

由于首字母总是大写,因此组件在使用时会很容易被看到。

<div> 
  <DogCartoon 
    roles={{ dogName: 'Scooby-Doo', ownerName: 'Shaggy' }} 
  />
</div>

2.8 私有函数命名

下划线 _在 MySQL 和 PHP 等语言中广泛用于定义变量、函数和方法。但在 JavaScript 中,下划线用于表示私有变量或函数。

例如,如果您有一个私有函数名称,如 toonName,则可以通过添加下划线作为前缀 (_toonName) 将其表示为私有函数。

注:在最新发布的ES2022标准规范中,官方指定了使用井号(#)作为私有插槽(即私有属性、变量和方法等)的前缀。我们保留现存私有变量的命名习惯,但建议在未来项目中遵循官方标准,使用#作为前缀

class DogCartoon { 
  constructor(dogName, ownerName) { 
    this.dogName = dogName; 
    this.ownerName = ownerName; 
    this.name = _toonName(dogName, ownerName); 
  } 
  _toonName(dogName, ownerName) { 
    return `${dogName} ${ownerName}`; 
  } 
}

var cartoon = new DodCartoon('Scooby-Doo', 'Shaggy'); 

// good
let name = cartoon.name;
console.log(name);
// "Scooby-Doo Shaggy" 

// bad
name =cartoon._toonName(cartoon.dogName, cartoon.ownerName);
console.log(name);
// "Scooby-Doo Shaggy"

2.9 全局变量命名

对于全局 JavaScript 变量,没有特定的命名标准。建议对可变全局变量使用驼峰式大小写,对不可变全局变量使用大写,推荐规范是 全部大写,并且加上前缀"GLOBAL_",方便识别

三)JS常用名字推荐

3.1动词推荐

  • get

获取数据,比如快捷的获取内部数据。

function getFruitsCount() {
  return this.fruits.length;
}
  • set

设置数据,比如将某个变量的值由 A 变为 B。

let fruit = 'apple';

function setFruit(nextFruit) {
  fruit = nextFruit;
}

setFruit('banana');
console.log(fruit); // banana
  • reset

还原数据,比如将某个变量设置为其初始的值或状态。

let initialFruit = 'apple';
let fruit = initialFruit;
setFruit('banana');
console.log(fruit) // banana

function resetFruit() {
  fruit = initialFruit;
}

resetFruit();
console.log(fruit); // apple
  • fetch

请求数据,通常是一个比较耗时的操作(比如: 异步请求)。

function fetchPost(postCount) {
  return fetch('https://api.dev/post', {...});
}
  • remove

移除数据,逻辑上的删除, 某个数据可能只是被移动到了别的地方。

假设在搜索页面有一个筛选器, 可以通过 removeFilter 来移除筛选器中的某个值, 而不是 deleteFilter, 因为英语的表达方式更倾向于前者。

function removeFilter(filterName, filters) {
  return filters.filter(name => name !== filterName);
}

const selectedFilters = ['price', 'availability', 'size'];
removeFilter('price', selectedFilters);
  • delete

删除数据,将某个数据彻底删除, 是物理上的删除。

可以想象如果你是一个文章审核员, 看到一篇很辣鸡的文章, 当你想彻底删除这篇文章并点击删除文章按钮的时候, CMS 会执行一个deletePost的删除动作, 而不是 removePost

function deletePost(id) {
  return database.find({ id }).delete();
}
  • compose

组合数据,基于现有的数据来创建一个新的数据, 适用于字符串、对象和函数。

function composePageUrl(pageName, pageId) {
  return `${pageName.toLowerCase()}-${pageId}`;
}
  • handle

处理数据,处理某个动作, 通常用来声明一个回调函数。

function handleLinkClick() {
  console.log('Clicked a link!');
}

link.addEventListener('click', handleLinkClick);