Привет, Хабр.
Как и все разработчики на 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)
состоит из трех частей:
Модель: самый низкий уровень шаблона для хранения данных.
Просмотр: это позволяет пользователю просматривать данные.
Контроллер: программный код, управляющий моделью и представлением.
Давайте посмотрим на структуру папок 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.
На этом наверное закончим. Спасибо что прочитали до конца.