Привет, Хабр.

Как и все разработчики на php, я тоже иногда сталкивался с NodeJs .
На днях просмотривая фреймворки Node столкнулся на AdonisJs . И после нескольких минут прочтения кода я почувствовал себя как в матрице .
Прошла черная кошка, за ней другая, такая же.

А теперь немного про AdonisJs.

Когда дело доходит до разработки веб-приложений, есть десятки фреймворков на выбор. Менее известный, но очень любимый фреймворк — AdonisJs, известный своим красивым кодом и простотой для бэкэнда.

AdonisJs — это Node.js MVC для согласованного, стабильного и выразительного кода. Адонис заботится о многих трудоемких деталях разработки, предлагая стабильную экосистему для серверных веб-приложений.

Разработчики, использующие Laravel, отмечают, что AdonisJs предлагает тот же шаблон, дизайн, структуру кодирования и интерфейс на основе команд. AdonisJs легко изучить. В этой статье я хочу познакомить вас с фреймворком и показать, с чего начать.

Что такое AdonisJs?

AdonisJs — это фреймворк Node.js, основанный на Laravel. Он реализует аналогичные концепции внедрения зависимостей и поставщиков, красивый код и интуитивно понятный дизайн. AdonisJs был разработан, чтобы доставлять разработчикам радость и легкость в их работе, поэтому он пренебрегает последовательным и выразительным API для разработки полнофункциональных веб-приложений.

Эта среда MVC в стиле Laravel фокусируется на основных аспектах создания стабильного и масштабируемого веб-приложения, таких как:

  • Приятный опыт разработчика

  • Согласованный API

  • Скорость и производительность

  • Поддержка рассылки, аутентификации, проверки данных, Redis и т.д.

AdonisJs Плюсы и минусы

Давайте посмотрим на наиболее заметные плюсы и минусы AdonisJs.

  • Структура папок: AdonisJs предлагает удобную структуру папок, которая упрощает организацию.

  • Валидатор: AdonisJs предоставляет специальный провайдер валидации, который упрощает валидацию пользовательского ввода.

  • Lucid ORM: AdonisJs имеет первоклассную поддержку для таких баз данных, как MariaDB и MySQL.

  • ICO и поставщик услуг: AdonisJs предлагает простой способ управления зависимостями через IOC. Поставщики услуг могут управлять зависимостями жизненного цикла.

  • Безопасность: AdonisJs поставляется с инструментами для защиты веб-сайтов от распространенных веб-атак, таких как защита от межсайтовой подделки.

  • Тестирование: AdonisJS упрощает ручное тестирование, позволяя разработчикам писать функциональные модульные тесты для тестирования своих веб-приложений.

Минусы

  • Сообщество: поскольку AdonisJs несколько новый и менее популярный, сообщество пользователей и поддержки невелико. Это означает, что у вас меньше шансов найти поддержку, если вы застрянете.

  • Документация: документация для AdonisJs в настоящее время незавершена, что означает, что некоторые части неполны.

  • Плагины: для AdonisJs доступно меньше плагинов из-за его популярности и возраста.

  • Без «боевых испытаний»: поскольку на AdonisJs создается меньше крупномасштабных веб-сайтов, он не тестировался в боевых условиях по сравнению с другими фреймворками.

Структура папок AdonisJs

AdonisJs имеет структуру MVC, которая упрощает организацию файлов. Эта структура позволяет нам сохранять организованность и масштабировать файлы позже.

Напоминание: архитектура Model View Controller (MVC) состоит из трех частей:

  1. Модель: самый низкий уровень шаблона для хранения данных.

  2. Просмотр: это позволяет пользователю просматривать данные.

  3. Контроллер: программный код, управляющий моделью и представлением.

Давайте посмотрим на структуру папок AdonisJs и определим некоторые ключевые термины.

Приложение (app)

Папка приложения содержит логику приложения, в том числе:

  • Контроллеры: они контролируют поток логики. Контроллеры можно связывать вместе с маршрутами.

  • Промежуточное ПО: Промежуточное ПО содержит методы, которые должны выполняться до или после HTTP-запроса.

  • Модели: они определяют модели и отношения базы данных.

Внутри папки приложения можно создать больше папок, таких как Validators, Exceptions, Helpers и многое другое.

config

Здесь хранится конфигурация нашего приложения. Мы также можем создать здесь наш файл конфигурации.

database

Мы используем эту папку для хранения миграций, семян и фабрик.

public

Сюда мы помещаем наши статические файлы, такие как изображения, файлы CSS и JavaScript. Они будут вызываться напрямую через HTTP.

resources

Сюда мы помещаем шаблоны представлений и файлы шаблонов Edge.

start

Эти файлы используются для загрузки приложения. Здесь мы также можем создавать такие файлы, как Events, Redis и Hooks.

.env

Файл .env находится в корневой папке. Он будет содержать все переменные, связанные с нашей рабочей средой. У разработки и производства обычно разные настройки.

ace

Файл ace используется для выполнения команд, специфичных для проекта.

package.json

Это стандартный файл Node.js.

server.js

Этот файл загружает HTTP-сервер.

Создать базовое приложение

Теперь, когда мы знакомы с AdonisJs, давайте узнаем, как на самом деле создать наше первое приложение. Начать довольно просто.

Для этого мы должны загрузить AdonisJs с официального сайта или использовать пакетный менеджер от NodeJs npm или другое на ваш вкус.

Я придпочитаю установить с помощю npm - npm init adonis-ts-app@latest hello-world

Эта команда создает новое приложение AdonisJs с именем hello-world

Затем мы войдем каталог hello-world, чтобы запустить сервер (NodeJs).

cd blog
node ace serve --watch

После мы получим примерно такой результат.

[ info ]  building project...
[ info ]  starting http server...
[ encore ] Running webpack-dev-server ...
[ info ]  watching file system for changes
{"level":30,"time":1644301994185,"pid":916,"hostname":"DESKTOP-D07T268","name":"hello-world","msg":"started serve
r on localhost.loc:3333"}
╭─────────────────────────────────────────────────────────╮
│                                                         │
│    Server address: http://localhost.loc:3333            │
│    Watching filesystem for changes: YES                 │
│    Encore server address: http://localhost:61073        │
│                                                         │
╰─────────────────────────────────────────────────────────╯
UPDATE: public\assets\manifest.json
UPDATE: public\assets\entrypoints.json
[ encore ]  DONE  Compiled successfully in 1452ms10:33:17 AM
[ encore ] webpack compiled successfully

Создание маршрутов

Для создания маршрутов мы войдем в папку start и откроем файл routes.ts

Этот файл определяет шаблоны URL-адресов, к которым пользователи могут обращаться в качестве точек входа в веб-приложение. Когда пользователь запрашивает URL-адрес, Адонис находит шаблон URL-адреса внутри start/routes.ts, поэтому, если шаблон совпадает, Адонис обрабатывает логику внутри этого маршрута.

Мы можем связывать маршруты с контроллерами в качестве логических обработчиков и присоединять маршруты к промежуточному программному обеспечению и валидаторам.

AdonisJs предлагает маршрут по умолчанию, который отображает welcome.edge представление. Чтобы начать с нуля, мы должны сначала удалить это. Ниже мы реализуем код, который регистрирует 2 разных маршрута для домашней страницы и страницы контактов.

import Route from '@ioc:Adonis/Core/Route'

Route.get('/', 'HomeController.home');
Route.get('contacts', 'ContactController.index')

Обратите внимание что маршруты создаются с помощю модуля Route, который заложен ядро Adonis.

Теперь когда мы создали маршруты. Нам надо создать контроллеры для этих маршрутов.

Для этого давайте используем стандартную команду AdonisJs

node ace make:controller home

После запуска этой команды он создаст стандартный контроллер в папке app/controllers/Http с названием HomeController.ts
Далее довайте создадим метод home что бы он обработал наш главный маршрут.

export default class HomeController {
  home({ view }){
    return view.render(`home`)
  }
}

Теперь когда у нас есть маршрут и обработчик, самое время создать предстовление (view), для данного маршрута. И опять давайте воспользуемся командой ace .

node ace make:view home

После запуска команды она создаст для нас представление с названием home.edge в папке resources/views .
Далее давайте создадим простую главную страницу. Открываем наш home.edge файл и пишем.

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    <div class="header clearfix">
        <nav>
            <ul class="nav nav-pills pull-xs-right">
                <li class="nav-item"><a href="/" class="nav-link">Home</a></li>
                <li class="nav-item"><a href="/contact" class="nav-link">Contact</a></li>
            </ul>
        </nav>
    </div>
    <section>
        <h1 class="text-muted"> Home Page </h1>
    </section>

</div>
</body>
</html>

Здесь пока что все стандартно. Я специально не затронул фишки шаблонизатора edge что бы статья не длилась долго. Скажу что оно как и вся структура AdonisJs интуитивно понятно. А те кто работал с Laravel blade будут чувствовать себя как дома.

Ну и после этого давайте откроем нашу главную страницу. (http://localhost.loc:3333/).

Как видно буквально за несколько минут мы уже создали рабочее приложение, которое можно разширить как вам угодно.

Я не буду делать то же самые действия для нашей второй страницы (contact) . Это оставлю вам. Для него надо делать аналогичные простые действия как и для главной страницы.

И в конце давайте приведем несколько примеров аналогичности нашей любимой Laravel и AdonisJs.

Команды

Laravel make

make
  make:command         Create a new Artisan command
  make:controller      Create a new controller class
  make:exception       Create a new custom exception class
  make:migration       Create a new migration file
  make:model           Create a new Eloquent model class
  make:provider        Create a new service provider class
  make:seeder          Create a new seeder class

AdonisJs make

make
  make:command         Make a new ace command
  make:controller      Make a new HTTP or Websocket channel controller
  make:exception       Make a new exception
  make:migration       Create a new migration file
  make:model           Make a new lucid model
  make:provider        Make a new provider
  make:seed            Create a database seeder

Laravel Routing

Route::get('/', function () {
    return 'Hello World';
});
 
Route::get('/user', 'UserController@index');

Adonis Routing

Route.get('/', () => 'Hello World')
 
Route.get('user', 'UserController.index')

Laravel Migrations

public function up()
{
  Schema::create('airlines', function (Blueprint $table) {
    $table->increments();
    $table->string('airline');
    $table->timestamps();
  });
 
  Schema::table('users', function (Blueprint $table) {
    $table->string('email');
  });
}
public function down()
{
  Schema::table('users', function (Blueprint $table) {
  $table->dropColumn('email');
  });

  Schema::drop('airlines');
}

Adonis Migrations

up () {
  this.create('airlines', (table) => {
    table.increments()
    table.string('airline')
    table.timestamps()
  });
 
  this.alter('users', (table) => {
    table.string('email')
  })
}
down () {
  this.alter('users', (table) => {
    table.dropColumn('email')
  })
 
  this.drop('airlines')
}

Все кто хочет изучить NodeJs и фреймворки, советую не пройти мимо этого прекрасного фреймворка AdonisJs.

На этом наверное закончим. Спасибо что прочитали до конца.

Комментарии (9)


  1. jMas
    08.02.2022 12:16
    +1

    Адинис заинтересовал меня тоже, достаточно лёгок в понимании, базовые моменты представлены в доке. Пока это выглядит как достойная замена Laravel из мира JS. Спасибо что пишете о нем для русскоговорящего сообщества.


    1. rgalstyan Автор
      08.02.2022 13:18
      +1

      Есть мысли общий док на русском переписать.


  1. im_gasay
    08.02.2022 14:24
    +1

    Спасибо за статью и информацию. Очень заинтересован, буду пробовать! Как раз есть не начатый проект.


    1. rgalstyan Автор
      08.02.2022 14:25

      Да у меня тоже. Я тоже уже начинаю проект с нулья на Adonis.


  1. antsam
    08.02.2022 16:32
    +1

    Как у них с поддержкой Typescript?


    1. rgalstyan Автор
      08.02.2022 16:47
      +1

      В 5-ой версии все супер. Ниже не знаю)))


    1. rgalstyan Автор
      08.02.2022 19:29

      AdonisJS — это бэкенд-фреймворк для Node.js. Фреймворк написан на TypeScript, и приложение, которое вы создадите с помощью AdonisJS, также будет на TypeScript.


  1. Simych
    08.02.2022 16:38
    +1

    Работал и с 4 и с 5 версией адониса, есть свои удобства, но если пытаться писать на нем с использованием best practices (clean architecture, разбиение кода по фичам, отсоединение business logic от фреймворка), то работать с ним становится не удобно. В этом плане, мне гораздо больше понравился nestJs.


    1. rgalstyan Автор
      08.02.2022 20:10

      Вы можете выбрать одну из следующих структур проекта.

      • webСтруктура проекта идеальна для создания классических серверных приложений. Мы настраиваем поддержку сессий, а также устанавливаем механизм шаблонов AdonisJS.

      • apiСтруктура проекта идеально подходит для создания сервера API.

      • slimструктура проекта создает минимально возможное приложение AdonisJS и не устанавливает никаких дополнительных пакетов, кроме ядра фреймворка.