ThinkJS 是一款使用 ES6/7 特性全新開發的 Node.js MVC 框架,使用 ES7 中`async/await`,或者 ES6 中的`*/yield`?特性徹底解決了 Node.js 中異步嵌套的問題。同時吸收了國內外眾多框架的設計理念和思想,讓開發 Node.js 項目更加簡單、高效。
使用 ES6/7 特性來開發項目可以大大提高開發效率,是趨勢所在。并且新版的 Node.js 對 ES6 特性也有了較好的支持,即使有些特性還沒有支持,也可以借助?[Babel](http://babeljs.io/)?編譯來支持。
[TOC]
## 特性
### 使用 ES6/7 特性來開發項目
借助 Babel 編譯,可以在項目中大膽使用 ES6/7 所有的特性,無需擔心哪些特性當前版本不支持。尤其是使用?`async/await`?或者?`*/yield`?來解決異步回調的問題。
~~~
//user controller, home/controller/user.js
export default class extends think.controller.base {
//login action
async loginAction(self){
//如果是get請求,直接顯示登錄頁面
if(this.isGet()){
return this.display();
}
//這里可以通過post方法獲取所有的數據,數據已經在logic里做了校驗
let data = this.post();
let md5 = think.md5("think_" + data.pwd);
//用戶名和加密后的密碼去匹配數據庫中對于的條目
let result = await this.model("user").where({name: data.name, pwd: md5}).find();
//如果未匹配到任何數據,表示用戶名或者密碼錯誤
if(think.isEmpty(result)){
return this.fail("login fail");
}
//獲取到用戶信息后,將用戶信息寫入session
await this.session("userInfo", result);
return this.success();
}
}
~~~
上面的代碼我們使用了 ES6 里的?`class`,?`export`,?`let`?以及 ES7 里的?`async`?和?`await`?等特性,雖然查詢數據庫和寫入?`Session`?都是異步操作,但借助?`async/await`,代碼都是同步書寫的。最后使用?`Babel`?進行編譯,就可以穩定運行在 Node.js 的環境中了。
### 支持多種項目結構和多種項目環境
項目支持單模塊模式、普通模式、分模塊模式等多種項目結構,可以滿足各種項目復雜度的開發。
默認支持?`development`,`testing`?和?`prodution`?3 種項目環境,可以在不同的項目環境下進行不同的配置,滿足在不同環境下的配置需求,同時還可以基于項目需要進行擴展。
### 支持豐富的數據庫
ThinkJS 支持?`mysql`,?`mongodb`,?`sqlite`?等常見的數據庫,并且封裝了很多操作數據庫的接口,無需手動拼接 SQL 語句,還可以自動防止 SQL 注入等安全漏洞。同時支持事務、關聯模型等高級功能。
### 代碼自動更新
ThinkJS 內置了一套代碼自動更新的機制,文件修改后立即生效,不用重啟 Node.js 服務,也不用借助第三方模塊。
### 自動創建 REST 接口
使用?`thinkjs`?命令可以自動創建 REST 接口,不用寫任何的代碼即可完成 REST API 的開發。如果想在 REST 接口中過濾字段或者進行權限校驗,也很方便處理。
### 支持多種 WebSocket 庫
ThinkJS 支持?`socket.io`,`sockjs`?等常見的 WebSocket 庫,并且對這些庫進行包裝,抹平各個庫之間接口調用上的差異,給開發者一致的體驗。
### 豐富的測試用例
ThinkJS 含有 1500+ 的測試用例,代碼覆蓋率達到 95% ,每一次修改都有對應的測試用例來保障框架功能的穩定。
### 支持命令行調用執行定時任務
ThinkJS 里的?`Action`除了可以響應用戶的請求,同時支持在命令行下訪問,借助這套機制就可以很方便的執行定時任務。
### Hook 和 Middleware
ThinkJS 使用 Hook 和 Middleware 機制,可以靈活的對訪問請求進行攔截處理。
### 詳細的日志
ThinkJS 內置了詳細的日志功能,可以很方便的查看各種日志,方便追查問題。
#### HTTP 請求日志
~~~
[2015-10-12 14:10:03] [HTTP] GET /favicon.ico 200 5ms
[2015-10-12 14:10:11] [HTTP] GET /zh-CN/doc.html 200 11ms
[2015-10-12 14:10:11] [HTTP] GET /static/css/reset.css 200 3ms
~~~
#### Socket 連接日志
~~~
[2015-10-12 14:13:54] [SOCKET] Connect mysql with mysql://root:root@127.0.0.1:3306
~~~
#### 錯誤日志
~~~
[2015-10-12 14:15:32] [Error] Error: ER_ACCESS_DENIED_ERROR: Access denied for user "root3"@"localhost" (using password: YES)
[2015-10-12 14:16:12] [Error] Error: Address already in use, port:8360. http://www.thinkjs.org/doc/error.html#EADDRINUSE
~~~
### 豐富的路由機制
ThinkJS 支持正則路由、規則路由、靜態路由等多種路由機制,并且可以基于模塊來設置。可以讓 URL 更加簡潔的同時又不丟失性能。
### 支持國際化和多主題
ThinkJS 使用很簡單的方法就可以支持國際化和多主題等功能。
## 與其他框架的對比
### 與 express/koa 對比
express/koa 是 2 個比較簡單的框架,框架本身提供的功能比較簡單,項目中需要借助大量的第三方插件才能完成項目的開發,所以靈活度比較高。但使用很多第三方組件一方便提高了項目的復雜度,另一個方便第三方插件質量參差不齊,也會帶來內存泄漏等風險。
koa 使用 ES6 里的?`*/yield`?解決了異步回調的問題,但?`*/yield`?只會是個過渡解決方案,會被 ES7 里的`async/await`?所替代。
而 ThinkJS 提供了整套解決方案,每個功能都經過了嚴格的性能和內存泄漏等方面的測試,并且在項目中可以直接使用 ES6/7 所有的特性。
### 與 sails 對比
sails 也是一個提供整套解決方案的 Node.js 框架,對數據庫、REST API、安全方面也很多封裝,使用起來比較方便。
但 sails 對異步回調的問題還沒有優化,還是使用 callback 的方式,給開發帶來很大的不便,導致項目中無法較好的使用 ES6/7 特性。
### ThinkJS 的不足
上面說了很多 ThinkJS 的優點,當然 ThinkJS 也有很多的不足。如:
* 框架還比較新,缺少社區等方面的支持
* 還沒有經過超大型項目的檢驗
## ES6/7 參考文檔
關于 ES6/7 特性可以參考下面的文檔:
* [learn-es2015](http://babeljs.io/docs/learn-es2015/)
* [ECMAScript 6 入門](http://es6.ruanyifeng.com/)
* [ECMAScript 6 Features](https://github.com/lukehoban/es6features)
* [ECMAScript 6 compatibility table](http://kangax.github.io/compat-table/es6/)
* [ECMAScript 7 Features](https://github.com/hemanth/es7-features)
* [ECMAScript 7 compatibility table](http://kangax.github.io/compat-table/es7/)
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- 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