查看原文
其他

干货:前端开发常见规范

前端小贾 前端学苑 2021-07-15

关注“前端学苑” ,坚持每天进步一点点


「一个人更快,一群人走得更远」

一个好的程序员肯定是要能书写可维护的代码,而不是一次性的代码,这就需要规范你的代码了。为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档。

一个人走的更快,一群人可以走得更远,前提是统一的策略,还要不断地反省和优化。

为了提升团队凝聚力,统一团队代码风格,优化团队协作效率,提出了前端开发规范。

简短的概括:

1、工作流规范

2、技术栈规范

3、浏览器兼容规范

4、项目组织规范

5、编码规范


正文从这里开始~~~


工作流规范

大部分团队都使用git作为版本库,管理好代码也是一种学问。尤其是涉及多人并发协作、需要管理多个软件版本的情况下,定义良好的版本库管理规范,可以让大型项目更有组织性,也可以提高成员协作效率。

1、Git-Flow算是最早出现的工作流,它包含了项目完整的生命周期,更严谨。

2、代码提交格式类型。(注:采用 githook 方式)

(feat|fix|docs|style|refactor)

功能|修复|文档 | 样式|重构

例如:feat: jsx 用户管理开发

3、工作经验总结:

整体分支情况:master (主分支) — develop  — a jsx-work\b zs-work (自己项目分支)            

1、主干master必须是可部署状态,避免下一个特性分支是不可运行的状态

2、每一个合并回主干的特性分支也必须是可部署状态。

3、多人合作是无法避免冲突,遇到冲突的时候,切换到特性分支,解决完冲突后再次请求合并到主干。

4、每一个特性分支经过测试后都可以合并到主干,合并到主干后都可以被删除掉,这样确保项目的分支尽可能简洁,不需要顾虑这个特性分支以后还有没有用。

建议:每次进行修改后,都在提交记录中准确记录本次修改的内容。


技术栈规范

现在所在的公司之前前端技术栈就非常混乱,Vue、React和AngularJS三大框架都有。

所以说团队的开发效率是基于稳定且熟练的技术栈的。稳定的技术栈规范有利于团队协作和沟通; 另外如果团队精通这个技术栈,当出现问题或者需要深入调优, 会相对轻松。


我们选择的技术应该是向前发展的、面向未来的, 这是选型的基本原则。所以我们一般不会去选择那些'过气'的技术,比如AngularJS(1.x)、Backbone. 因为现在有更好的选择,不必过于保守。比如大厂的支撑、目前社区的活跃度、开发活跃度等等。


团队的开发效率是基于稳定且熟练的技术栈的

vue2.6以上  构建用户界面的渐进式框架

axios 前端异步执行http请求的ajax框架

eslint  代码格式静态检查的工具

babel JavaScript编译器

element-ui 组件库

sass预编译


浏览器兼容规范

前端团队应该根据针对应用所面对的用户情况、应用类型、开发成本、浏览器市场统计数据等因素,来制定自己的浏览器兼容规范。

有了浏览器兼容规范,前端开发和兼容性测试就有理有据,避免争议; 同时它也是前端团队的一种对外声明,除非特殊要求,不符合浏览器兼容规范的浏览器,前端开发人员可以选择忽略。

确定兼容策略

确定哪种兼容策略,应该取决于用户比重,如果大部分用户使用的是现代浏览器,就应该使用优雅降级,反之选择渐进增强。


项目组织规范

项目组织规范定义了如何组织一个前端项目, 例如项目的命名、项目的文件结构、版本号规范等等。尤其对于开源项目,规范化的项目组织就更重要了。


例如:vue 项目开发

通用的项目组织规范

docs/: 项目的细化文档, 可选.

node_moules文件

node_moules:存放的是npm加载的项目依赖模块

src文件

src:放置组件和入口文件。

assets:主要存放一些静态图片资源的目录。(css 等也可放在这里)

views :放置的为公共组件(主要还是各个主要页面)

components:(自定义功能组件)这里存放的是开发需要的的各种组件,各个组件联系在一起组成一个完整的项目。

router:存放了项目路由文件。

App.vue:是项目主(/根)组件,***也是项目所有组件和路由的出口***,之后它会被渲染到项目根目录的 index.html 中显示出来,我们可以在这里写一些适合全局的css样式。

main.js:入口文件,引入了vue模块和app.vue组件以及路由router,我们需要在全局使用的一些东西也可以定义在这里面。

store.js: 为vuex的文件

其他文件

.babelrc:ES6语法编译配置。

.eslintrc.js:eslint的配置文件,eslint是用来管理和检测js代码风格的工具,可以和编辑器搭配使用,如vscode的eslint插件,当有不符合配置文件内容的代码出现就会报错或者警告。

.gitignore:忽略的文件。

package.json:项目及工具的依赖配置文件。只是粗略的版本,具体依赖于

README.md:项目说明。


编码规范

写逻辑代码,完成业务需求时,编写详细的注释,利人利己。

将一些重复性的代码能封装的就封装,不在代码中写死某些值。

工具类:

ESLint - 目前是社区最流行的、通用的Javascript Lint工具,Lint界的Babel。支持定制插件、preset。

Prettier - 关于代码格式化的所有东西都交给它吧!

HTML 编码规范

HTML 作为描述网页结构的超文本标记语言,本文档的目标是使 HTML 代码风格保持一致,容易被理解和被维护。

脚本加载

说到js和css的位置,大家应该都知道js放在下面,css放在上面。

兼容老旧浏览器(IE9-)时:

脚本引用写在 body 结束标签之前,并带上 async 属性。这虽然在老旧浏览器中不会异步加载脚本,但它只阻塞了 body 结束标签之前的 DOM 解析,这就大大降低了其阻塞影响。

而在现代浏览器中:

脚本将在 DOM 解析器发现 body 尾部的 script 标签才进行加载,此时加载属于异步加载,不会阻塞 CSSOM(但其执行仍发生在 CSSOM 之后)。

综上所述,

所有浏览器中推荐:

<html>      <head>            <link rel="stylesheet" href="main.css">      </head>  <body>    <!-- body goes here -->    <script src="main.js"></script>  </body> </html>
只兼容现代浏览器推荐:<html>      <head>            <link rel="stylesheet" href="main.css">          <script src="main.js" async></script>    </head>  <body>    <!-- body goes here -->    </body> </html>

代码风格:

命名:

[强制] class 必须单词全字母小写,单词间以减号(-)分隔。

[强制] class 必须代表相应模块或部件的内容或功能,不得以样式信息进行命名。

示例:

<!-- good --><div class="sidebar"></div><!-- bad --> <div class="left"></div>

[建议] id、class 命名,在避免冲突并描述清楚的前提下尽可能短。

示例:

<!-- good --><div id="nav"></div><!-- bad --><div id="navigation"></div>

标签

[强制] 标签名必须使用小写字母。

示例:

<!-- good --> <p>Hello StyleGuide!</p> <!-- bad --> <P>Hello StyleGuide!</P>

[建议] 标签的使用应尽量简洁,减少不必要的标签。

示例:

<!-- good --><img class="avatar" src="image.png"><!-- bad --><span class="avatar">   <img src="image.png"></span>

下面是常见标签语义化

p - 段落

h1,h2,h3,h4,h5,h6 - 层级标题

strong,em - 强调

ins - 插入

del - 删除

abbr - 缩写

code - 代码标识

cite - 引述来源作品的标题

q - 引用

blockquote - 一段或长篇引用

ul - 无序列表

ol - 有序列表

dl,dt,dd - 定义列表


CSS 编码规范

目标是使 CSS 代码风格高度保持一致,容易被理解和被维护, 易于团队协作。

虽然本文档是针对 CSS 设计的,但是在使用各种 CSS 的预编译器(如 less、sass、stylus 等)时,适用的部分也应尽量遵循本文档的约定。


CSS文件头部声明 @charset

为了避免 HTML 和 CSS 文件编码不同时造成中文解析乱码,造成的不必要的麻烦,CSS 文件头部统一加上文件对应的编码。

@charset "UTF-8";

注释

良好的注释使代码更具有可读性和可维护性,尤其是多人协作的项目,不要让团队其他成员来猜测一段代码的意图。

普通注释,注释文字左右各留一个空格。/* 普通注释 */
区块注释/* * 代码执行到这里后会调用setTitle()函数 * setTitle():设置title的值 */

清除浮动

[建议] 当元素需要撑起高度以包含内部的浮动元素时,通过对伪类设置 clear 或触发 BFC 的方式进行 clearfix。尽量不使用增加空标签的方式。

解释:

触发 BFC 的方式很多,常见的有:

    float 非 none

    position 非 static

    overflow 非 visible

另需注意,对已经触发 BFC 的元素不需要再进行 clearfix。


 

[建议] 尽量不使用 声明。

[建议] 当需要强制指定样式且不允许任何场景覆盖时,通过标签内联和 定义样式。

解释:

必须注意的是,仅在设计上 确实不允许任何其它场景覆盖样式 时,才使用内联的 样式。通常在第三方环境的应用中使用这种方案。


css hack

IE6能识别*,但不能识别,

IE7能识别*,也能识别;

FF不能识别*,但能识别;

例如:

color:gray;       FF等非IE浏览器字体色将为灰色

color:red\9;     IE8 IE9字体色为红色

*color:green;     IE7字体色为绿色

_color:blue;     IE6字体色为蓝色


js 编码规范

变量声明

总是使用 var 来声明变量。如不指定 var,变量将被隐式地声明为全局变量

例如:var a = b = 0; //b会被隐式的创建为全局变量

所以,请总是使用 var 来声明变量,并且使用单var模式(将所有的变量在函数最前面只使用一个var定义)。例如:

例如:

(function (){  'use strict'  var a = 0,          b = 0,           c = 0,         myObject(); }())

采用严格模式带来的好处是,当误输入错误的变量名时,它可以通过报错信息来帮助你定位错误出处。


使用严格等

总是使用 === 精确的比较操作符,避免在判断的过程中,由 JavaScript 的强制类型转换所造成的困扰。例如:

log('0' == 0); // true log('' == false); // true log('1' == true); // true log(null == undefined); // true

等同== 和严格等===的区别

==, 两边值类型不同的时候,要先进行类型转换,再比较。

===,不做类型转换,类型不同的一定不等。


三元条件判断(if 的快捷方法)

用三元操作符分配或返回语句。在比较简单的情况下使用,避免在复杂的情况下使用。

不推荐:if(x === 10) { return 'valid'; } else { return 'invalid'; }
推荐:return x === 10 ? 'valid' : 'invalid'

句尾没有分号

var isHotel = json.type == "hotel" ? true : false

变量命名各种各样

var is_hotel; var isHotel; var ishotel;

不使用eval()函数

尽量不要使用 evil 函数。注:eval 优化不足、安全性考虑

eval()函数的作用是返回任意字符串,当作js代码来处理。

var reg = eval('/' + txt + '/'); 修改为:var reg =new RegExp(txt);

本文档改自百度 EFE/FEX CSS 规范。

并参考

CSS创作指南 https://github.com/cssdream/css-creating

Code-guide https://github.com/mdo/code-guide

HTML-CSS-guide https://github.com/doyoe/html-css-guide

前端大全的前端协作规范   https://mp.weixin.qq.com/s/FxhtAFI9nS2zytdontFMSg


觉得本文对你有帮助?请分享给更多人

关注「前端学苑」加星标,提升前端技能

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存