我爲何選擇了AdonisJs

原文地址:https://adonis-china.org/posts/2前端

前言

用Laravel也有些時日了,各類代碼生成工具,各類Eloquent關聯操做,各類微信、支付插件,再配合Larvel-admin擴展寫後臺簡直爽到飛起。但總以爲PHP+Javascript還不夠優雅,因此最近折騰了一下AdonisJs - 一個NodeJs版的Laravel。node

其實好久以前也嘗試過MEAN和Sails,但因爲Laravel的思想根深蒂固,老是對她們提不起興趣。並且NodeJs的市場本就魚龍混雜,每一個框架都有本身的思想,因此一直在尋找Laravel的Node實現,因而就和AdonisJs結下了不解之緣。ios

JavaScript相比PHP的優點

相比PHP,在全棧開發方面NodeJs有自然優點web

  1. 都是用npm安裝擴展,與前端編程語言統一(廢話)數據庫

  2. 有些庫先後端均可以用(如:axios、underscore)npm

  3. 環境更簡單:一臺新機器下個NodeJs,設置個淘寶鏡像就OK了,其餘不少命令行工具均可以用npm裝編程

  4. 「天下大勢,合久必分,分久必合」,因此發現趨勢很重要axios

    1. PC和移動端瀏覽器從最初的百花齊放到如今webkit一家獨大windows

    2. 移動APP在不少場景已經被混合模式APP統一,如今幾乎很難見到一款徹底原生不帶H5的APP了後端

    3. NW.js的沒落和Electron的興起再次讓js在桌面端站穩腳跟

    4. 連桌面端Linux都幾乎被Ubuntu統一了

  5. JavaScript能作服務端、WEB端、桌面端和APP客戶端,但世界上最好的PHP卻力不從心。

AdonisJs的優點

  1. 和Laravel徹底一致的思路,從邏輯上和代碼上均可以從Laravel平滑遷移。這對之後的擴展、插件等周邊完善很是重要!

  2. 相比MEAN、Express、Koa等框架來講,AdonisJs是一整套解決方案,不會有東拼西湊的感受。並且流程清晰,思路規範,更適合小規模企業級開發。

  3. 相比meteor、sailsJs等其餘真正的「全棧」框架來說,AdonisJs相似VueJs同樣是漸進式的。自由度高,入門更簡單,在現有的狀況下遷移成本更低。

  4. 代碼生成、ORM、路由、JWT、WebSocket都很方便。

起步

安裝

npm i -g adonis-cli
adonis new blog --skip-install
cd blog
cnpm install
npm run serve:dev

就這樣,你的第一個adonisjs項目就啓動起來了,瀏覽器訪問一下看看

RMVC (路由-模型-視圖-控制器)

額,這是我本身發明的一個詞。我以爲MVC模式里路由也很重要,因此就本身加了個R。

路由

app/Http/routes.js 裏面的路由跟Laravel幾乎同樣。支持直接寫邏輯和指向一個Controller的方法
須要注意的是不支持參數的注入;若是是渲染視圖,須要加個yield

const Route = use('Route')

Route.get('users/:id', function * (request, response) {
  const id = request.param('id')
  response.send(`耶, 我獲得了一個動態ID: ${id}`)
})

Route.group('version1', function () {
  Route.get('users', function * (request, response) {
    // ...
  })
}).prefix('api/v1')

Route
  .get('users/:id', 'UserController.show')
  .as('profile')

Route.get('about', function * (request, response) {
  yield response.sendView('about')
})

控制器

能夠用相似Laravel的artisan的一個命令 ace,windows上須要用node ace

./ace make:controller Home
# 或
./ace make:controller User --resource

UserController:

const User = use('App/Model/User')

class UsersController {

  * index (request, response) {
    const users = yield User.all()
    yield response.sendView('users', { users: users.toJSON() })
  }
}

仍是和Laravel很像,須要注意的是AdonisJs裏面有個use方法用來模擬PHP的use,用於導入各類包和模型等等。Controller的方法要用生成器方法,幾乎全部的數據庫查詢都要用yield,像上面說的,渲染視圖也要用yield

視圖

命令生成視圖:

./ace make:view welcome

# create: resources/views/welcome.njk

模板語法用的相似twig的nunjuncks,和Laravel的blade也很像

{% if user.age %}
  You are {{ user.age }} years old.
{% endif %}

語法高亮

你須要在你的編輯器/IDE裏面安裝nunjucks模板的語法高亮插件. 若是你的編輯器沒有nunjucks模板語法高亮插件, 你可使用twig模板高亮插件代替.

模型

建立模型

./ace make:model User

# 或者直接生成遷移文件,-m也行
./ace make:model User --migration

生成的樣子:

app/Model/User.js
'use strict'

const Lucid = use('Lucid')

class User extends Lucid {
}

關鍵在於關聯:

class Book extends Lucid {

  chapters () {
    return this.hasMany('App/Model/Chapter')
  }

}

學過Laravel的能夠無腦嘗試了。不過目前只支持到多對多的belongsToMany,還不支持Laravel Eloquent的 多態關聯

好啦

趕忙去試試吧,有任何問題均可以直接回復。

相關文章
相關標籤/搜索