ThinkJS 是一款使用 ES6/7 特性全新開發(fā)的 Node.js MVC 框架,使用 ES7 中async/await
,或者 ES6 中的*/yield
特性徹底解決了 Node.js 中異步嵌套的問題。同時吸收了國內(nèi)外眾多框架的設(shè)計理念和思想,讓開發(fā) Node.js 項目更加簡單、高效。
使用 ES6/7 特性來開發(fā)項目可以大大提高開發(fā)效率,是趨勢所在。并且新版的 Node.js 對 ES6 特性也有了較好的支持,即使有些特性還沒有支持,也可以借助 Babel 編譯來支持。
借助 Babel 編譯,可以在項目中大膽使用 ES6/7 所有的特性,無需擔(dān)心哪些特性當(dāng)前版本不支持。尤其是使用 async/await
或者 */yield
來解決異步回調(diào)的問題。
//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方法獲取所有的數(shù)據(jù),數(shù)據(jù)已經(jīng)在logic里做了校驗
let data = this.post();
let md5 = think.md5("think_" + data.pwd);
//用戶名和加密后的密碼去匹配數(shù)據(jù)庫中對于的條目
let result = await this.model("user").where({name: data.name, pwd: md5}).find();
//如果未匹配到任何數(shù)據(jù),表示用戶名或者密碼錯誤
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
等特性,雖然查詢數(shù)據(jù)庫和寫入 Session
都是異步操作,但借助 async/await
,代碼都是同步書寫的。最后使用 Babel
進(jìn)行編譯,就可以穩(wěn)定運行在 Node.js 的環(huán)境中了。
項目支持單模塊模式、普通模式、分模塊模式等多種項目結(jié)構(gòu),可以滿足各種項目復(fù)雜度的開發(fā)。
默認(rèn)支持 development
,testing
和 prodution
3 種項目環(huán)境,可以在不同的項目環(huán)境下進(jìn)行不同的配置,滿足在不同環(huán)境下的配置需求,同時還可以基于項目需要進(jìn)行擴(kuò)展。
ThinkJS 支持 mysql
, mongodb
, sqlite
等常見的數(shù)據(jù)庫,并且封裝了很多操作數(shù)據(jù)庫的接口,無需手動拼接 SQL 語句,還可以自動防止 SQL 注入等安全漏洞。同時支持事務(wù)、關(guān)聯(lián)模型等高級功能。
ThinkJS 內(nèi)置了一套代碼自動更新的機(jī)制,文件修改后立即生效,不用重啟 Node.js 服務(wù),也不用借助第三方模塊。
使用 thinkjs
命令可以自動創(chuàng)建 REST 接口,不用寫任何的代碼即可完成 REST API 的開發(fā)。如果想在 REST 接口中過濾字段或者進(jìn)行權(quán)限校驗,也很方便處理。
ThinkJS 支持 socket.io
,sockjs
等常見的 WebSocket 庫,并且對這些庫進(jìn)行包裝,抹平各個庫之間接口調(diào)用上的差異,給開發(fā)者一致的體驗。
ThinkJS 含有 1500+ 的測試用例,代碼覆蓋率達(dá)到 95% ,每一次修改都有對應(yīng)的測試用例來保障框架功能的穩(wěn)定。
ThinkJS 里的 Action
除了可以響應(yīng)用戶的請求,同時支持在命令行下訪問,借助這套機(jī)制就可以很方便的執(zhí)行定時任務(wù)。
ThinkJS 使用 Hook 和 Middleware 機(jī)制,可以靈活的對訪問請求進(jìn)行攔截處理。
ThinkJS 內(nèi)置了詳細(xì)的日志功能,可以很方便的查看各種日志,方便追查問題。
[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
[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 支持正則路由、規(guī)則路由、靜態(tài)路由等多種路由機(jī)制,并且可以基于模塊來設(shè)置??梢宰?URL 更加簡潔的同時又不丟失性能。
ThinkJS 使用很簡單的方法就可以支持國際化和多主題等功能。
express/koa 是 2 個比較簡單的框架,框架本身提供的功能比較簡單,項目中需要借助大量的第三方插件才能完成項目的開發(fā),所以靈活度比較高。但使用很多第三方組件一方便提高了項目的復(fù)雜度,另一個方便第三方插件質(zhì)量參差不齊,也會帶來內(nèi)存泄漏等風(fēng)險。
koa 使用 ES6 里的 */yield
解決了異步回調(diào)的問題,但 */yield
只會是個過渡解決方案,會被 ES7 里的async/await
所替代。
而 ThinkJS 提供了整套解決方案,每個功能都經(jīng)過了嚴(yán)格的性能和內(nèi)存泄漏等方面的測試,并且在項目中可以直接使用 ES6/7 所有的特性。
sails 也是一個提供整套解決方案的 Node.js 框架,對數(shù)據(jù)庫、REST API、安全方面也很多封裝,使用起來比較方便。
但 sails 對異步回調(diào)的問題還沒有優(yōu)化,還是使用 callback 的方式,給開發(fā)帶來很大的不便,導(dǎo)致項目中無法較好的使用 ES6/7 特性。
上面說了很多 ThinkJS 的優(yōu)點,當(dāng)然 ThinkJS 也有很多的不足。如:
關(guān)于 ES6/7 特性可以參考下面的文檔:
更多建議: