敲黑板:文档中命令行未备注则默认是linux系统
环境搭建
安装NodeJs
建议 Node.js 版本在 8.0.0 以上
参考:Node安装
安装GIT
参考:git安装
项目根目录下配置.gitignore
1 | .DS_Store |
配置NPM
npm最容易产生的就是网络问题,我们可以在每次npm下载的时候指定registry,比如
1 | npm install --registry=https://registry.npm.taobao.org |
推荐IDE
Visual Studio(开源免费)
统一编辑器格式
1 | # http://editorconfig.org |
项目根目录下新增文件
.editorconfig
开发规范
基本规范
- 所有文件的编码格式统一为
UTF-8
- 换行格式为
LF
tag
转为space
,默认间隔4个空格
GIT
命名
- 分支功能命名使用snake case命名法,即下划线命名
- 分支类型包括:feature、bugfix、refactor三种类型,即新功能开发、bug修复和代码重构
- 分支版本命名规则:比如:ops_v_1_1_0_feature_oeprator
- Tag包括3位版本,前缀使用v。比如v1.2.31。核心基础库或者大版本发布使用第一位,新功能开发使用第2位版本号,bug修复使用第3位版本号
日志
每次提交,Commit message 都包括三个部分:header,body 和 footer。
其中,header 是必需的,body 和 footer可以省略。不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。
Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。
1 | <type>(<scope>): <subject> |
type代表某次提交的类型,比如是修复一个bug还是增加一个新的feature。所有的type类型如下
- feat: 新增feature
- fix: 修复bug
- docs: 仅仅修改了文档,比如README, CHANGELOG, CONTRIBUTE等等
- style: 仅仅修改了空格、格式缩进、都好等等,不改变代码逻辑
- refactor: 代码重构,没有加新功能或者修复bug
- perf: 优化相关,比如提升性能、体验
- test: 测试用例,包括单元测试、集成测试等
- chore: 改变构建流程、或者增加依赖库、工具等
- revert: 回滚到上一个版本
1 | # 标题行:50个字符以内,描述主要变更内容 |
参考Commitizen来添加提交消息格式。
生成 Change log
如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成。生成的文档包括以下三个部分:
- New features
- Bug fixes
- Breaking changes
每个部分都会罗列相关的 commit ,并且有指向这些 commit 的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。
conventional-changelog 就是生成 Change log 的工具,运行下面的命令即可。
1 | $ npm install -g conventional-changelog-cli |
JAVASCRIPT
遵循eslint规范
项目根目录新增
.eslintrc.js
1 | module.exports = { |
项目根目录新增
.eslintignore
1 | dist |
CSS
尽量使用类选择器,放弃ID选择器
ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。
分类的命名方法:使用单个字母+”-“为前缀
布局(grid)(.g-);模块(module)(.m-);元件(unit)(.u-);功能(function)(.f-);皮肤(skin)(.s-);状态(.z-)。
注:在你样式中的选择器总是要以上面前五类开头,然后在里面使用后代选择器。
如果这五类不能满足你的需求,你可以另外定义一个或多个大类,但必须符合单个字母+”-“为前缀的命名规则,即 .x- 的格式。
后代选择器命名
- 约定不以单个字母+”-“为前缀且长度大于等于2的类选择器为后代选择器,如:.item为m-list模块里的每一个项,.text为m-list模块里的文本部分:.m-list .item{} .m-list .text{}。
- 一个语义化的标签也可以是后代选择器,比如:.m-list li{}。
- 不允许单个字母的类选择器出现,原因详见下面的“模块和元件的后代选择器的扩展类”。
1 | /* 这里的.itm和.cnt只在.m-list中有效 */ |
命名应简约而不失语义
1 | /* 反对:表现化的或没有语义的命名 */ |
相同语义的不同类命名
方法:直接加数字或字母区分即可(如:.m-list2、.m-list3、.m-list-news、.m-list-banner等,都是列表模块,但是是完全不一样的模块)。
其他举例:.f-fw0、.f-fw1、.s-fc0、.s-fc1、.m-logo2、.m-logo3、u-btn、u-btn2等等。
模块和元件的扩展类的命名方法
当A、B、C、…它们类型相同且外形相似区别不大,那么就以它们中出现率最高的做成基类,其他做成基类的扩展。
方法:+“-”+数字或字母(如:.m-list的扩展类为.m-list-1、.m-list-2等)。
补充:基类自身可以独立使用(如:class=”m-list”即可),扩展类必须基于基类使用(如:class=”m-list m-list-2”)。
最佳实践
1 | /* 这是某个模块 */ |
统一语义理解和命名
布局(.g-)
语义 | 命名 |
---|---|
文档 | doc |
头部 | head |
主体 | body |
尾部 | foot |
主栏 | main |
主栏子容器 | mainc |
侧栏 | side |
侧栏主容器 | sidec |
盒容器 | wrap/box |
模块(.m-)、元件(.u-)
语义 | 命名 |
---|---|
导航 | nav |
子导航 | subnav |
面包屑 | crumb |
菜单 | menu |
选项卡 | tag |
标题区 | headline |
内容区 | content |
列表 | list |
表格 | table |
表单 | form |
热点 | hot |
排行 | top |
登录 | login |
标志 | logo |
广告 | advertise |
搜索 | search |
幻灯 | slide |
提示 | tips |
帮助 | help |
新闻 | news |
下载 | download |
注册 | regist |
投票 | vote |
版权 | copyright |
结果 | result |
按钮 | button |
输入 | input |