javascript項目開發(fā)規(guī)范實例

title

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

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

以本人最近寫的一個項目(技術棧為Meteor + React + MongoDB)為例

readme的使用

因為一個項目往往需要很多人一起協(xié)助開發(fā),還有可能會不斷有新手接手項目,所以readme里面一定要僅可能多的信息

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

也可以加一些項目中遇到的設計到的文檔鏈接

代碼規(guī)范

Commit Message 編寫規(guī)范

編寫Commit Message需要遵循一定的范式,內容應該清晰明了,指明本次提交的目的夜赵,便于日后追蹤問題。

feat: 新功能
fix: 修補bug
docs: 文檔
style: 格式(不影響代碼運行的變動)
refactor: 重構
test: 添加測試
chore: 構建過程或輔助工具的變動

命名

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

常見class命名關鍵詞:
布局類:header, footer, container, main, content, aside, page, section
包裹類:wrap, inner
區(qū)塊類:region, block, box
結構類: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
導航類:nav, prev, next, breadcrumb, forward, back, indicator, paging, first, last
交互類:tips, alert, modal, pop, panel, tabs, accordion, slide, scroll, overlay,
星級類:rate, star
分割類:group, seperate, divider
等分類:full, half, third, quarter
表格類:table, tr, td, cell, row
圖片類:img, thumbnail, original, album, gallery
語言類:cn, en
論壇類:forum, bbs, topic, post
方向類:up, down, left, right
其他語義類:btn, close, ok, cancel, switch; link, title, info, intro, more, icon; form, label, search, contact, phone, date, email, user; view, loading...

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

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

 動詞       含義      
 get       獲取某個值            
 set       設置某個值             
 is        判斷是否為某個值    
 has       判斷是否有某個值  

以下規(guī)則是此項目中使用的,主要看團隊代碼習慣:

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

組件

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

目錄結構

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

issues的使用

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

下面補充的是項目中針對Meteor后端開發(fā)的一些規(guī)范

數(shù)據(jù)庫

Collection 定義

所有 Collection 定義放在 imports/schema 目錄, 每個 Collection 務必定義 Schema 來約束字段

Schema 定義

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

過濾 Collection 字段

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

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

該查詢會返回 _id, username, profile 字段, 其中 _id 是默認返回的

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

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

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;

因為這次項目需要自己設計數(shù)據(jù)庫,還有自己定義后端方法,之前沒有任何經驗,做到現(xiàn)在也總結出一點心得:

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

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

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

參考

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

About

github
blog

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末倡缠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茎活,更是在濱河造成了極大的恐慌昙沦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载荔,死亡現(xiàn)場離奇詭異盾饮,居然都是意外死亡,警方通過查閱死者的電腦和手機懒熙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門丘损,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人工扎,你說我怎么就攤上這事徘钥。” “怎么了肢娘?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵呈础,是天一觀的道長。 經常有香客問我橱健,道長而钞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任拘荡,我火速辦了婚禮臼节,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己网缝,他們只是感情好巨税,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著途凫,像睡著了一般垢夹。 火紅的嫁衣襯著肌膚如雪溢吻。 梳的紋絲不亂的頭發(fā)上维费,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音促王,去河邊找鬼犀盟。 笑死,一個胖子當著我的面吹牛蝇狼,可吹牛的內容都是我干的阅畴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼迅耘,長吁一口氣:“原來是場噩夢啊……” “哼贱枣!你這毒婦竟也來了?” 一聲冷哼從身側響起颤专,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤纽哥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栖秕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春塌,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年簇捍,在試婚紗的時候發(fā)現(xiàn)自己被綠了只壳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡暑塑,死狀恐怖吼句,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情事格,我是刑警寧澤命辖,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站分蓖,受9級特大地震影響尔艇,放射性物質發(fā)生泄漏。R本人自食惡果不足惜么鹤,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一终娃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒸甜,春花似錦棠耕、人聲如沸余佛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉巡。三九已至,卻和暖如春蕊退,著一層夾襖步出監(jiān)牢的瞬間郊楣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工瓤荔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留净蚤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓输硝,卻偏偏與公主長得像今瀑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子点把,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理橘荠,服務發(fā)現(xiàn),斷路器郎逃,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,332評論 25 707
  • 1. Java基礎部分 基礎部分的順序:基本語法哥童,類相關的語法,內部類的語法衣厘,繼承相關的語法如蚜,異常的語法,線程的語...
    子非魚_t_閱讀 31,667評論 18 399
  • 每次看T臺走秀影暴,都被專業(yè)模特的氣質错邦、優(yōu)雅所吸引,分分鐘想成為他們中的一員型宙。 但是撬呢,要想成為專業(yè)的模特必須接受專業(yè)的...
    彩虹姐教你玩時髦閱讀 1,057評論 0 0
  • 今天畫的,妆兑,魂拦,,但回想起上個禮拜畫的搁嗓,芯勘,,腺逛,荷愕,,,安疗,抛杨,。荐类。怖现。。呵呵 玉罐。屈嗤。。厌小。恢共。战秋。 天吶擼璧亚。。脂信。癣蟋。。狰闪。疯搅。。 放張美圖...
    慕容千雪閱讀 129評論 0 0