有 Rails,然后是 Laravel,现在是 Adonis js

2025-06-08

有 Rails,然后是 Laravel,现在是 Adonis js

关注我!:关注@EricTheCoder_


Adonis = Node 的 MVC 框架

我是一名 Rails 和 Laravel 开发者。我非常喜欢这两个框架。它们功能强大、稳定、快速且易于使用。一旦你习惯了使用一个优秀的 MVC 框架进行开发,就很难再回头了。

今年早些时候,我接到一个任务,要开发一个 JavaScript 前端应用。为了配合这个应用,我心想,为什么不也用 JavaScript 做一个后端呢?我的目标是把我的整个技术栈都用 JavaScript 实现。

理论上看起来很容易,但实际上比预想的要复杂得多。我找不到一个在我看来能和 Laravel 和 Rails 媲美的 JavaScript 框架。Laravel 的开发效率很高,功能强大、速度快,而且使用起来非常方便,令人愉悦。

我确实尝试了 3 种不同的框架,但没有一个符合我的要求,所以我决定在这个项目中使用 Laravel 后端。

最近,我偶然发现了一个已经存在了一段时间的框架,但由于某种原因,它突然消失了。这个框架就是 Adonis.js。

Adonis 是什么?简而言之,它是 Node.js 版的 Laravel。它是一个与其他 Node.js 框架截然不同的框架。与 Laravel 一样,Adonis 的使命是提升开发者的幸福感,并提供从头到尾完成项目所需的所有工具。

我还没有在生产中做过真正的项目,但我仍然有机会做一些有趣的小项目,我不得不说,我很惊喜地发现 Adonis 是多么自然和易于使用。

作为一个像 Laravel 一样的 MVC 框架,学习曲线要​​短得多。

以下是一些 Laravel 代码与 Adonis.js 代码的比较示例。看看它们的相似之处:

Laravel 路线

Route::get('/', [PostController::class, 'index']);
Enter fullscreen mode Exit fullscreen mode

阿多尼斯路线

Route.get('/', 'PostsController.index')
Enter fullscreen mode Exit fullscreen mode

Laravel 迁移

public function up() {
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('title');
        $table->text('content');
    });
}
Enter fullscreen mode Exit fullscreen mode

阿多尼斯迁徙

protected tableName = 'posts'
public async up () {
    this.schema.createTable(this.tableName, (table) => {
      table.increments('id')
      table.timestamps(true)
      table.string('title')
      table.text('content')
    })
  }
Enter fullscreen mode Exit fullscreen mode

Laravel 控制器:

class BlogController extends Controller
{   
    public function index()
    {
        $posts = Post::all();
        return view('posts.index', ['posts', $posts]);
    }
Enter fullscreen mode Exit fullscreen mode

Adonis 控制器

export default class PostsController {
  public async index (ctx: HttpContextContract) {
    const posts = await Post.all()
    return ctx.view.render('posts/index', {posts})
  }
Enter fullscreen mode Exit fullscreen mode

Laravel 视图(blade)

@extends('layouts.app')

@section('content')
<h1>Welcome to my Blog</h1>
    @foreach($posts as $post)
      <h3>{{post->id}}. <a href="{{ route('PostsController.show', $post)}}">{{ post->title }}</a></h3> <br>
      {{ post->content }} <br><br><hr>
    @endforeach
@endsection
Enter fullscreen mode Exit fullscreen mode

阿多尼斯景观(边缘)

@layout('app')

@section('page')
    <h1>Welcome to my Blog</h1>
    @each(post in posts)
      <h3>{{post.id}}. <a href="{{ route('PostsController.show', {id: post.id})}}">{{ post.title }}</a></h3> <br>
      {{ post.content }} <br><br><hr>
    @endeach
@endsection 
Enter fullscreen mode Exit fullscreen mode

正如您所见,学习曲线相当低。

但并非所有内容都相同。例如,在 Adonis 中,模型在模型文件中显式声明。在 Laravel 中,模型仅在迁移文件中定义。

Adonis模型文件:

export default class Post extends BaseModel {
  @column({ isPrimary: true })
  public id: number

  @column.dateTime({ autoCreate: true })
  public createdAt: DateTime

  @column.dateTime({ autoCreate: true, autoUpdate: true })
  public updatedAt: DateTime

  @column()
  public title: string

  @column()
  public content: string

}
Enter fullscreen mode Exit fullscreen mode

结论

今天就到这里。敬请期待,我近期会发布更多关于 Adonis.js 的文章。

您可以在 Twitter 上关注我:关注 @justericchapman

鏂囩珷鏉ユ簮锛�https://dev.to/ericchapman/there-was-rails-then-laravel-and-now-adonis-js-2900
PREV
TypeScript 入门
NEXT
React(正在进行中)备忘单