# 代碼規范
[TOC=2,3]
## 文件路徑必須小寫
很多時候是在?`Windows`?或者?`Mac OSX`?系統下開發項目,但一般都部署?`Linux`?系統下。
在?`Windows`?和?`Mac`?系統下,文件路徑是不區分大小寫的,而?`Linux`?下是區分大小寫的。這樣很容易出現文件大小寫的問題導致開發環境下是好的,但上線后卻報錯了。
為了避免這種情況的發生,文件路徑盡量都使用小寫字符。并且在服務啟動時,ThinkJS 會檢測項目下文件路徑,如果有大寫字母則會告警,如:
~~~
[2015-10-13 10:36:59] [WARNING] filepath `admin/controller/apiBase.js` has uppercases.
~~~
## 縮進使用 2 個空格
在 Node.js 環境下開發,有時候邏輯比較復雜,有各種條件判斷,或者有一些異步操作,這些都會增加代碼的縮進。
為了不至于讓縮進占用了太多的列寬,建議使用 2 個空格作為縮進。
## 使用 ES6 語法開發
ES6 中有大量的語法糖可以簡化我們的代碼,讓代碼更加簡潔高效。 Node.js 最新版本已經較好的支持了 ES6 的語法,即使有些語法不支持,也可以通過 Babel 編譯來支持。 所以是時候使用 ES6 語法來開發項目了。
## 不要使用 constrcutor 方法
使用 ES6 里的 class 來創建類的時候,可以使用?`constrcutor`?方法達到類實例化的時候自動調用。如:
~~~
export default class think.base {
constructor(){
...
}
}
~~~
但如果不使用 ES6 里的 class,就沒有 constrcutor 方法了。
為了統一處理,ThinkJS 提供了?`init`?方法來代替?`constrcutor`?方法,該方法不管是在 class 下還是動態創建類的情況下都可以做到類實例化的時候自動被調用。
~~~
export default class think.base {
/**
* 初始化方法,類實例化時自動被調用
* @return {} []
*/
init(){
...
}
}
~~~
`注:`?ThinkJS 里所有的類都會繼承?`think.base`?基類。
## 使用 Babel 編譯
雖然現在的 Node.js 版本已經支持了很多 ES6 的特性,但這些特性現在還只是實現了,V8 里還沒有對這些特性進行優化。如:`*/yield`?等功能。
所以建議使用 Babel 來編譯,一方面可以使用 ES6 和 ES7 幾乎所有的特性,另一方面編譯后的性能也比默認支持的要高。
## 使用 async/await 替代 */yield
`*/yield`?是 ES6 里提出一種解決異步執行的方法,它只是一個過渡的方案,ES7 里便提出了?`async/await`?來代替它。
相對?`async/await`,`*/yield`?有以下的缺陷:
1、`*/yield`?調用后返回一個迭代器,需要借助第三方模塊來執行。如:`co`
2、`*/yield`?無法和 Arrow Function 一起使用。
3、`*/yield`?調用另一個?`*/yield`?時,需要使用?`yield *`,帶來不便。
4、目前 V8 對?`*/yield`?還沒有做優化,最好也通過 Babel 來編譯。
所以完全可以使用 ES7 里的?`async/await`?來代替?`*/yield`,然后使用 Babel 編譯來運行。
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware