ThinkJS 介紹

2021-09-17 10:22 更新

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 編譯來支持。

特性

使用 ES6/7 特性來開發(fā)項目

借助 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 里的 classexportlet 以及 ES7 里的 async 和 await 等特性,雖然查詢數(shù)據(jù)庫和寫入 Session 都是異步操作,但借助 async/await,代碼都是同步書寫的。最后使用 Babel 進(jìn)行編譯,就可以穩(wěn)定運行在 Node.js 的環(huán)境中了。

支持多種項目結(jié)構(gòu)和多種項目環(huán)境

項目支持單模塊模式、普通模式、分模塊模式等多種項目結(jié)構(gòu),可以滿足各種項目復(fù)雜度的開發(fā)。

默認(rèn)支持 developmenttesting 和 prodution 3 種項目環(huán)境,可以在不同的項目環(huán)境下進(jìn)行不同的配置,滿足在不同環(huán)境下的配置需求,同時還可以基于項目需要進(jìn)行擴(kuò)展。

支持豐富的數(shù)據(jù)庫

ThinkJS 支持 mysqlmongodbsqlite 等常見的數(shù)據(jù)庫,并且封裝了很多操作數(shù)據(jù)庫的接口,無需手動拼接 SQL 語句,還可以自動防止 SQL 注入等安全漏洞。同時支持事務(wù)、關(guān)聯(lián)模型等高級功能。

代碼自動更新

ThinkJS 內(nèi)置了一套代碼自動更新的機(jī)制,文件修改后立即生效,不用重啟 Node.js 服務(wù),也不用借助第三方模塊。

自動創(chuàng)建 REST 接口

使用 thinkjs 命令可以自動創(chuàng)建 REST 接口,不用寫任何的代碼即可完成 REST API 的開發(fā)。如果想在 REST 接口中過濾字段或者進(jìn)行權(quán)限校驗,也很方便處理。

支持多種 WebSocket 庫

ThinkJS 支持 socket.iosockjs 等常見的 WebSocket 庫,并且對這些庫進(jìn)行包裝,抹平各個庫之間接口調(diào)用上的差異,給開發(fā)者一致的體驗。

豐富的測試用例

ThinkJS 含有 1500+ 的測試用例,代碼覆蓋率達(dá)到 95% ,每一次修改都有對應(yīng)的測試用例來保障框架功能的穩(wěn)定。

支持命令行調(diào)用執(zhí)行定時任務(wù)

ThinkJS 里的 Action除了可以響應(yīng)用戶的請求,同時支持在命令行下訪問,借助這套機(jī)制就可以很方便的執(zhí)行定時任務(wù)。

Hook 和 Middleware

ThinkJS 使用 Hook 和 Middleware 機(jī)制,可以靈活的對訪問請求進(jìn)行攔截處理。

詳細(xì)的日志

ThinkJS 內(nèi)置了詳細(xì)的日志功能,可以很方便的查看各種日志,方便追查問題。

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

豐富的路由機(jī)制

ThinkJS 支持正則路由、規(guī)則路由、靜態(tài)路由等多種路由機(jī)制,并且可以基于模塊來設(shè)置??梢宰?URL 更加簡潔的同時又不丟失性能。

支持國際化和多主題

ThinkJS 使用很簡單的方法就可以支持國際化和多主題等功能。

與其他框架的對比

與 express/koa 對比

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 對比

sails 也是一個提供整套解決方案的 Node.js 框架,對數(shù)據(jù)庫、REST API、安全方面也很多封裝,使用起來比較方便。

但 sails 對異步回調(diào)的問題還沒有優(yōu)化,還是使用 callback 的方式,給開發(fā)帶來很大的不便,導(dǎo)致項目中無法較好的使用 ES6/7 特性。

ThinkJS 的不足

上面說了很多 ThinkJS 的優(yōu)點,當(dāng)然 ThinkJS 也有很多的不足。如:

  • 框架還比較新,缺少社區(qū)等方面的支持
  • 還沒有經(jīng)過超大型項目的檢驗

ES6/7 參考文檔

關(guān)于 ES6/7 特性可以參考下面的文檔:

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號