整理一份react native開發規範

版本更新背景:react-native發佈最新版本:最新版本爲0.49.3。

此版本最新改動是統一了入口文件,此版本不管Ios還是Android入口文件都是index.js,其中,頁面元素入口爲:App.js文件。

(一) 命名規約

1. 【強制】 代碼中命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束;

_name / $Object / name_ / name$ / Object$2. 

【強制】 代碼中命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式;

 說明:正確的英文拼寫和語法可以讓閱讀者易於理解,避免歧義。

注意,即使純拼音命名方式也要避免採用;

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

3. 【強制】類名使用 UpperCamelCase 風格,必須遵從駝峯形式,第一個字母必須大寫;

LoginPageMsgPage

4. 【強制】方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase風格,必須遵從駝峯形式,第一個字母必須小寫;

localValue / getHttpMessage() / inputUserId

5. 【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長;

MAX_STOCK_COUNT

6. 【強制】使用抽象單詞命名類名或者變量時,需加以修飾;

userMsg 等價於 userMessaage,userPic 等價於 userPicture

7. 【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式;

應用工具類包名爲com.fcs.open.util類名爲UrlUtils

8. 【強制】文件夾命名統一小寫; 

組件,或者類名,首字母全部大寫,遵守駝峯命名法;

img 存放圖片app APP一些componentartcomponent 一些Art組件

(二) 常量定義

1. 【強制】不允許出現任何魔法值(即未經定義的常量)直接出現在代碼中;

2. 【推薦】不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。

如:緩存相關的常量放在類:CacheConsts下;

系統配置相關的常量放在類:ConfigConsts下;

說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護;

(三) 格式規約

1. 【強制】大括號的使用約定。如果是大括號內爲空,則簡潔地寫成{}即可,不需要換行;

如果是非空代碼塊則:1) 左大括號前不換行;2) 左大括號後換行;3) 右大括號前換行;4) 右大括號後還有else等代碼則不換行‘;’表示終止右大括號後必須換行。if(){//todo}else{//todo}

2. 【強制】 左括號和後一個字符之間不出現空格;

同樣,右括號和前一個字符之間也不出現空格;

3. 【強制】if/for/while/switch/do 等保留字與左右括號之間都必須加空格;

4. 【強制】任何運算符左右必須加一個空格;

說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號、三目運行符等;

5. 【強制】縮進採用 4 個空格,禁止使用 tab 字符;

6. 【強制】單行字符數限制不超過120個,超出需要換行,換行時遵循如下原則:1) 第二行相對第一行縮進4個空格,從第三行開始,不再繼續縮進,參考示例;2) 運算符與下文一起換行;3) 方法調用的點符號與下文一起換行;4) 在多個參數超長,逗號後進行換行;

const path = Path().moveTo(0, -radius/2).arc(0, radius, 1).arc(0, -radius, 1).close();

7. 【強制】方法參數在定義和傳入時,多個參數逗號後邊必須加空格;

onMsgByCallAndMsg=(msg, title, type)=>{this.setState({callMsgAndMsg:msg})}

8. 【推薦】方法體內的執行語句組、變量的定義語句組、不同的業務邏輯之間或者不同的語義之間插入一個空行。相同業務邏輯和語義之間不需要插入空行。說明:沒有必要插入多行空格進行隔開。

9. 【推薦】使用webStorm時,導入附件的hoop-settings-1.0.jar文件,可統一格式化。

(四) package.json

1. 【強制】在使用npm或者yarn獲取資源時,必須在命令末尾添加--save;

說明:使用此命令會把使用的第三方相關信息寫入到package.json,這樣,其他成員在下載或者更新代碼後使用npm i(或npm install),就可以下載最新的npm,若不加 —save ,執行npm i的時候不會下載,其他成員運行項目後在運行可能會報錯,此時需要分析查看報錯信息進行重新的npm install XX;

2. 【推薦】使用git或者svn進行代碼版本管理時,儘量不上傳node_module文件(進行忽略);

說明:使用package.json進行包管理,下載或更新代碼後,只需要執行npm i;當有修改npm包,建議進行版本管理,上傳到私有的github倉庫。使用私有地址時,使用如下命令:npm install "私有倉庫地址" --save

3. 【強制】使用第三方或拉取新倉庫時,第一步使用npm i或者npm install;

說明:1-:檢查版本是否存在衝突2-:更新node_modules

4. 【推薦】在使用npm或者yarn獲取資源時,推薦不在命令後添加 -g;

說明,此命令可以讓此資源包在根目錄進行獲取(全局安裝),不利於資源管理;

5. 【強制】每個項目必須配置一個README.md文件,內容包括測試,正式環境等相關配置文件以及注意事項;

如:項目:1-:下載本項目後,請先執行npm i2-:注意有三個倉庫爲私有地址3-:測試賬號爲:hello 密碼:123456訪問:1-:../../common/Util/Url 爲網絡配置相關2-:在打包時,需修改原生安卓目錄下:app/common/util/config下的地址,詳情請查看此文件

6. 【推薦】安裝npm包是,推薦~來標記版本號;

說明:~和^的作用和區別:~會匹配最近的小版本依賴包,比如~1.2.3會匹配所有1.2.x版本,但是不包括1.3.0^會匹配最新的大版本依賴包,比如^1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0。那麼該如何選擇呢?當然你可以指定特定的版本號,直接寫1.2.3,前面什麼前綴都沒有,這樣固然沒問題,但是如果依賴包發佈新版本修復了一些小bug,那麼需要手動修改package.json文件;~和^則可以解決這個問題。但是需要注意^版本更新可能比較大,會造成項目代碼錯誤,舊版本可能和新版本存在部分代碼不兼容。所以推薦使用~來標記版本號,這樣可以保證項目不會出現大的問題,也能保證包中的小bug可以得到修復

(五) 控制語句

1. 【強制】在一個 switch 塊內,每個case要麼通過 break/return 等來終止,要麼註釋說明程序將繼續執行到哪一個 case 爲止;在一個 switch 塊內,都必須包含一個default 語句並且 放在最後,即使它什麼代碼也沒有。

2. 【強制】在 if/else/for/while/do 語句中必須使用大括號,即使只有一行代碼,避免使用下面的形式:if (condition) statements;

3. 【推薦】推薦儘量少用 else, if-else 的方式可以改寫成:if(condition){//todoreturn obj;}// 接着寫 else 的業務邏輯代碼;說明:如果非得使用if()...else if()...else...方式表達邏輯,【強制】請勿超過3層,超過請使用狀態設計模式。

4.【推薦】使用三目運算,替換if else結構,精簡代碼//badlet account=5;if(account>10){console.log("true");}else {console.log("false");}//goodlet msg=account>10?"true":"false";

5.【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將複雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提高可讀性。

說明:很多 if 語句內的邏輯相當複雜,閱讀者需要分析條件表達式的最終結果,才能明確什麼樣的條件執行什麼樣的語句,那麼,如果閱讀者分析邏輯表達式錯誤呢?//僞代碼如下boolean existed = (file.open(fileName, "w") != null)&& (...) || (...);if (existed) {...}

(六) 註釋規約

1. 【強制】類、類屬性、類方法的註釋必須使用 Javadoc 規範,使用/**內容*/格式,不得使用 //xxx 方式;

說明:在 IDE 編輯窗口中,Javadoc 方式會提示相關注釋,生成 Javadoc 可以正確輸出相應註釋;在 IDE 中,工程調用方法時,不進入方法即可懸浮提示方法、參數、返回值的意義,提高閱讀效率。

2. 【強制】所有的類都必須添加創建者信息,以及類的說明;

3. 【強制】方法內部單行註釋,在被註釋語句上方另起一行,使用//註釋;方法內部多行註釋使用/* */註釋,注意與代碼對齊。

4. 【強制】所有的常量類型字段必須要有註釋,說明每個值的用途;

5. 【參考】註釋掉的代碼儘量要配合說明,而不是簡單的註釋掉。

說明:代碼被註釋掉有兩種可能性:1)後續會恢復此段代碼邏輯。2)永久不用。前者如果沒有備註信息,難以知曉註釋動機。後者建議直接刪掉(代碼倉庫保存了歷史代碼)。

6. 【參考】對於註釋的要求:第一、能夠準確反應設計思想和代碼邏輯;第二、能夠描述業務含義,使別的程序員能夠迅速瞭解到代碼背後的信息。完全沒有註釋的大段代碼對於閱讀者形同 天書,註釋是給自己看的,即使隔很長時間,也能清晰理解當時的思路;註釋也是給繼任者看的,使其能夠快速接替自己的工作。

7. 【參考】好的命名、代碼結構是自解釋的,註釋力求精簡準確、表達到位。避免出現註釋的一個極端:過多過濫的註釋,代碼的邏輯一旦修改,修改註釋是相當大的負擔。

8. 【參考】特殊註釋標記,請註明標記人與標記時間。注意及時處理這些標記,通過標記掃描,經常清理此類標記。1) 待辦事宜(TODO):( 標記人,標記時間,[預計處理時間]) 表示需要實現,但目前還未實現的功能。2) 錯誤,不能工作:(標記人,標記時間,[預計處理時間])在註釋中用 FIXME標記某代碼是錯誤的,而且不能工作,需要及時糾正的情況。

(七) 日誌管理

1. 【推薦】 代碼中過多使用console.log()會消耗性能,推薦去除不必要的日誌輸入代碼;

2. 【強制】 在入口文件添加以下代碼;

說明:可以在發佈時屏蔽掉所有的console.*調用。React Native中有一個全局變量DEV用於指示當前運行環境是否是開發環境。我們可以據此在正式環境中替換掉系統原先的console實現。if (!__DEV__) {global.console = {info: () => {},log: () => {},warn: () => {},error: () => {},};}這樣在打包發佈時,所有的控制檯語句就會被自動替換爲空函數,而在調試時它們仍然會被正常調用。

(八) 目錄結構規範

以下目錄結構示例中只展示js與靜態資源,不包含原生代碼:

├── index.ios.js

├── index.android.js

└── js

├── component 可複用的組件(非完整頁面)

├── page 完整頁面

├── config 配置項(常量、接口地址、路由、多語言化等預置數據)

├── util 工具類(非UI組件)

├── style 全局樣式

└── image 圖片在component和page目錄中,可能還有一些內聚度較高的模塊再建目錄page/component

├── HomeView.component.js

├── HomeView.style.js

└── MovieView

├── MovieList.component.js

├── MovieList.style.js

├── MovieCell.component.js

├── MovieCell.style.js

├── MovieView.component.js

└── MovieView.style.js

二、頁面編寫規範

(一) state,props

1. 【強制】 代碼中初始化state因在constructor(props)函數中,而且儘量對每個變量進行註釋;

有以下三種方式:

constructor(props){super(props)};

this.state={msg:'第一種初始化state方式'}};

constructor(props){super(props);Object.assign(this.state,{msg:'第二種初始化state方式'})};

state={msg:'第三種初始化state方式'};

推薦使用第三種代碼編寫方式。

2. 【強制】 代碼中使用setState時,因注意異步可能導致的問題,儘量使用回調函數;this.setState({//todo},()=>{//執行setState後執行此函數})

1. 【強制】 代碼中使用props時,需進行propTypes檢測和defaultProps默認值初始化;

static propTypes = {color: PropTypes.string,dotRadius: PropTypes.number,size: PropTypes.number};static defaultProps = {color: '#1e90ff',dotRadius: 10,size: 40};

注意:最新版本PropTypes不是使用以下方式引用import {PropTypes } from 'react';而是使用以下方式使用,先執行npm安裝命令:npm install --save prop-typesimport PropTypes from 'prop-types';

4.【強制】 代碼中用於頁面展示處理UI的組件,命名以Page結尾,自定義組件命名中必須包含Component;例子:LoginPage 登錄頁BtuuonComponent 按鈕組件

5.【強制】代碼中創建數組或對象使用以下方式;const user={name:'time',sex:'男',age:25,};const itemArray=['0','1','2',3,{name:'25',age:'男'}];

6.【強制】代碼中函數綁定this,強制使用箭頭函數;注:除組件原有方法,其他自定義函數命名時,需使用箭頭函數;//系統組件生命週期方法constructor(props){super(props);};//自定義方法goMainPage=()=>{};

7.【推薦】代碼中一些網絡數據初始化,配置信息,推薦在此生命週期進行初始化;componentWillMount

8.【強制】代碼中使用定時器或者DeviceEventEmitter,必須在組件卸載進行銷燬或者清除;

componentDidMount() {//注意addListener的key和emit的key保持一致this.msgListener = DeviceEventEmitter.addListener('Msg',(listenerMsg) => {this.setState({listenerMsg:listenerMsg,})});}

goMainPage=()=>{this.timer = setTimeout(() => { console.log('把一個定時器的引用掛在this上'); },500);};

componentWillUnmount() {//此生命週期內,去掉監聽和定時器this.msgListener&&this.msgListener.remove();// 如果存在this.timer,則使用clearTimeout清空。// 如果你使用多個timer,那麼用多個變量,或者用個數組來保存引用,然後逐個clearthis.timer && clearTimeout(this.timer);}

9.【強制】使用本地圖片資源時,需設置寬高並進行適當適配;

imgHeight=screenHeight, imgWidth= screenWidth

10.【強制】在React-Native版本小於0.46.0使用本地圖片資源時,當不指定特殊尺寸圖片時,需引入不同尺寸XX.png,[email protected],[email protected]圖片,並在代碼引用中,使用如下方式:

說明:當使用XX.png時,程序運行過程中會根據不同屏幕尺寸獲取不同資源;當使用如下方式:時,程序運行過程中不會根據不同屏幕尺寸獲取不同資源。

注意:此方式適用於React-Native0.46.0版本之前。

9.【強制】在React-Native版本大於0.46.0使用本地資源,圖片命名不能出現‘@’符號:說明:不同大小圖片需要原生不同的尺寸文件夾,系統自動進行不同適配。

10.【推薦】 當使用多個state或者props值時,推薦使用以下方式;const {size, dotRadius, color} = this.props;const { maxNumber,minNumber,}=this.state;

說明:使用此方式,代碼結構清晰簡潔,便於維護;

(二) 樣式

1. 【強制】 當組件使用樣式屬性達到三個或者三個以上時,必須使用StyleSheet來創建樣式屬性並進行引用;

const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',marginTop:10,},});

2. 【推薦】 當使用單一屬性,或者全局樣式屬性時,推薦使用公共樣式類;//StyleCommon.jsmodule.exports={topColor:{backgroundColor: '#3A3D42',},mainView:{backgroundColor: '#12141B',},}

(三) var,let,const

1. 【強制】對所有變量,對象的引用,使用const,不要使用var;

2. 【推薦】如果一定需要引用可變動的變量,對象,建議使用let代替var;

(四) 代碼間隔

1. 【強制】使用ES6編寫代碼,定義方法時,每個方法結尾使用‘;’進行分隔;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章