javascript項(xiàng)目開發(fā)規(guī)范實(shí)例

title

首次發(fā)表在個(gè)人博客

總結(jié)一下個(gè)人在開發(fā)及review同事代碼的過程中遇到的因?yàn)橐恍╉?xiàng)目規(guī)范帶來的問題及認(rèn)為比較好的解決方法;
由于個(gè)人經(jīng)驗(yàn)和認(rèn)知水平有限,下面僅代表我的個(gè)人觀念,歡迎各位大佬多給我提建議;

以本人最近寫的一個(gè)項(xiàng)目(技術(shù)棧為Meteor + React + MongoDB)為例

readme的使用

因?yàn)橐粋€(gè)項(xiàng)目往往需要很多人一起協(xié)助開發(fā),還有可能會(huì)不斷有新手接手項(xiàng)目,所以readme里面一定要僅可能多的信息

  • 項(xiàng)目啟動(dòng)命令
  • 代碼規(guī)范
  • Commit Message 編寫規(guī)范
  • 命名: class命名,變量命名,函數(shù)命名,組件命名等
  • 組件
  • 目錄結(jié)構(gòu)
  • 常遇到的問題及解決方案

也可以加一些項(xiàng)目中遇到的設(shè)計(jì)到的文檔鏈接

代碼規(guī)范

Commit Message 編寫規(guī)范

編寫Commit Message需要遵循一定的范式,內(nèi)容應(yīng)該清晰明了,指明本次提交的目的,便于日后追蹤問題。

feat: 新功能
fix: 修補(bǔ)bug
docs: 文檔
style: 格式(不影響代碼運(yùn)行的變動(dòng))
refactor: 重構(gòu)
test: 添加測(cè)試
chore: 構(gòu)建過程或輔助工具的變動(dòng)

命名

命名的語(yǔ)義化真的特別特別重要,哪怕不知道要命名的這個(gè)詞的英文是什么,也要去查一下;千萬(wàn)不要以a,b,c等沒有任何語(yǔ)義的詞去命名;之前我也總是注意不到這一點(diǎn),但是最近在看同事的代碼還有重構(gòu)自己之前寫的部分代碼,命名壓根看不明白這個(gè)變量的意思,總之,看這樣的代碼怎一個(gè)痛苦了得

常見class命名關(guān)鍵詞:
布局類:header, footer, container, main, content, aside, page, section
包裹類:wrap, inner
區(qū)塊類:region, block, box
結(jié)構(gòu)類:hd, bd, ft, top, bottom, left, right, middle, col, row, grid, span
列表類:list, item, field
主次類:primary, secondary, sub, minor
大小類:s, m, l, xl, large, small
狀態(tài)類:active, current, checked, hover, fail, success, warn, error, on, off
導(dǎo)航類:nav, prev, next, breadcrumb, forward, back, indicator, paging, first, last
交互類:tips, alert, modal, pop, panel, tabs, accordion, slide, scroll, overlay,
星級(jí)類:rate, star
分割類:group, seperate, divider
等分類:full, half, third, quarter
表格類:table, tr, td, cell, row
圖片類:img, thumbnail, original, album, gallery
語(yǔ)言類:cn, en
論壇類:forum, bbs, topic, post
方向類:up, down, left, right
其他語(yǔ)義類:btn, close, ok, cancel, switch; link, title, info, intro, more, icon; form, label, search, contact, phone, date, email, user; view, loading...

變量命名: 名字要能準(zhǔn)確的描述出該變量所代表的事物
比如表示userid就叫userId,而不要只叫user

函數(shù)命名建議:可使用常見動(dòng)詞約定

 動(dòng)詞       含義      
 get       獲取某個(gè)值            
 set       設(shè)置某個(gè)值             
 is        判斷是否為某個(gè)值    
 has       判斷是否有某個(gè)值  

以下規(guī)則是此項(xiàng)目中使用的,主要看團(tuán)隊(duì)代碼習(xí)慣:

  1. 組件名和組件所在文件名使用大駝峰式
  2. css類名使用小寫單詞并用橫線(-)分割
  3. dom節(jié)點(diǎn)以$開頭

組件

  1. 每個(gè)組件占一個(gè)文件
  2. 組件不包含狀態(tài)則應(yīng)寫為 stateless 組件
  3. 非 stateless 組件使用 pure-render-decorator 優(yōu)化

目錄結(jié)構(gòu)

├── client  
│   ├── main.html                       客戶端頁(yè)面模板
│   └── main.js                         客戶端入口  
├── imports  
│   ├── client  
│   │   ├── App.jsx                     頂層組件  
│   │   ├── components                  公共組件  
│   │   ├── routers                     前端路由  
│   │   ├── styles                      樣式  
│   │   └── views                       視圖  
│   │       ├── header                  公共頭  
│   │       ├── login                   登錄注冊(cè)  
│   ├── schema                          模型  
│   └── util                            工具函數(shù)  
├── packages                            自定義 meteor 包  
├── public                              客戶端資源  
└── server   
    ├── main.js                         服務(wù)端入口  
    └── user                            用戶接口  

issues的使用

項(xiàng)目中總會(huì)遇到很多奇奇怪怪的問題,當(dāng)時(shí)印象深刻,過了一段時(shí)間,就忘了具體的問題及解決辦法,雖然每次可以通過查commit為fix的記錄,但是這樣查找起來很麻煩,我們項(xiàng)目是用gitlab來托管,可以合理的理由issues,每次遇到很棘手的問題的時(shí)候,可以提一個(gè)issues,等后期把這個(gè)問題解決了再把這個(gè)issues給關(guān)閉,并寫上問題原因及解決辦法分析

下面補(bǔ)充的是項(xiàng)目中針對(duì)Meteor后端開發(fā)的一些規(guī)范

數(shù)據(jù)庫(kù)

Collection 定義

所有 Collection 定義放在 imports/schema 目錄, 每個(gè) Collection 務(wù)必定義 Schema 來約束字段

Schema 定義

Schema 定義使用 SimpleSchema, 數(shù)據(jù)插入數(shù)據(jù)庫(kù)前必須通過 schema 校驗(yàn), 調(diào)用校驗(yàn)語(yǔ)句為 表名.schema.validate(要插入的數(shù)據(jù));

過濾 Collection 字段

默認(rèn)情況下, 數(shù)據(jù)查詢語(yǔ)句會(huì)返回所有字段, 比如 Memete.users.find({}) 會(huì)將用戶的密碼和 token 一并返回, 這樣是不安全不正確的, find / findOne 的第二個(gè)參數(shù)是查詢選項(xiàng), fields 字段可以控制返回字段, 例如:

Meteor.users.find(
    { },
    {
        fields: {
            username: 1,
            profile: 1,
        },
    },
);

該查詢會(huì)返回 _id, username, profile 字段, 其中 _id 是默認(rèn)返回的

自己定義populate方法(取出關(guān)聯(lián)數(shù)據(jù))

在做邀請(qǐng)新的好友入群的時(shí)候,添加新的好友,利用reywood:publish-composite并不會(huì)自動(dòng)更新數(shù)據(jù),所以以后直接自己在客戶端定義方法
這樣做的好處是解決了取關(guān)聯(lián)數(shù)據(jù)不會(huì)自動(dòng)更新的bug,但是有點(diǎn)麻煩的是每次需要關(guān)聯(lián)數(shù)據(jù)的時(shí)候必須在客戶端調(diào)用一次方法,正在考慮有沒有更好的解決方法

import { Meteor } from 'meteor/meteor';

const PopulateUtil = {
    group(group) {
        if (group) {
            group.members = Meteor.users.find({ _id: { $in: group.members } }).fetch();
            group.admin = Meteor.users.findOne({ _id: group.admin });
        }
    },
    groups(groups) {
        groups.forEach(group => PopulateUtil.group(group));
    },
};

export default PopulateUtil;

因?yàn)檫@次項(xiàng)目需要自己設(shè)計(jì)數(shù)據(jù)庫(kù),還有自己定義后端方法,之前沒有任何經(jīng)驗(yàn),做到現(xiàn)在也總結(jié)出一點(diǎn)心得:

  • 數(shù)據(jù)庫(kù)設(shè)計(jì)一定要根據(jù)具體的業(yè)務(wù)邏輯(開始設(shè)計(jì)之前一定要和產(chǎn)品溝通清楚產(chǎn)品邏輯)
  • 能在后端取到的數(shù)據(jù),在接口定義的時(shí)候不要讓前端去傳

最后感覺后端的邏輯真的很復(fù)雜,需要各種判斷,各種情況都得想到

推薦看一下這本代碼大全(第二版),等看完這本書再好好的完善一下這篇文章

參考

class如何命名更規(guī)范
代碼大全(第二版)
Commit Message 編寫指南

About

github
blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,623評(píng)論 18 399
  • 每次看T臺(tái)走秀,都被專業(yè)模特的氣質(zhì)、優(yōu)雅所吸引,分分鐘想成為他們中的一員。 但是,要想成為專業(yè)的模特必須接受專業(yè)的...
    彩虹姐教你玩時(shí)髦閱讀 1,182評(píng)論 0 0
  • 今天畫的,,,,但回想起上個(gè)禮拜畫的,,,,,,,,,。。。。呵呵 。。。。。。 天吶擼。。。。。。。。 放張美圖...
    慕容千雪閱讀 161評(píng)論 0 0

友情鏈接更多精彩內(nèi)容