Часть моей утренней субботней рутины — изучение новой технологии, которая кажется мне интересной. Это ограничено одним часом, чтобы я не отвлекался и оставался сосредоточенным.
Обычно все начинается с простого «Hello, World», чтобы настроить мое окружение, и продолжается знакомством с некоторыми основами экологической системы.
Если это новая среда выполнения или язык программирования, я постараюсь настроить что-то более реалистичное, чем пример hello-world
— чаще всего для этого подойдет REST API.
Здравствуйте, Deno!
Deno — это простая, современная и безопасная среда выполнения для JavaScript, TypeScript и WebAssembly, использующая V8 и созданная на Rust.
с официального сайта
Она была создана Райаном Далом, который также является автором Node.js
, и хотя она не должна быть заменой, она пытается исправить некоторые недостатки Node.js
.
Давайте начнем! Для пользователей mac все, что вам нужно сделать, это:
❯ brew install deno
❯ echo "console.log('Hello, Deno!')" > hello.ts
❯ deno run hello.ts
Check file:///Users/shikloshi/projects/deno/hello.ts
Hello, Deno!
Это рабочее приложение Deno
.
Что насчет NPM и node_modules
?
Deno
был впервые представлен для того, чтобы исправить многие вещи, происходящие в экосистеме Node.js
, которые не нравились Райану Далу.
Управление пакетами и npm
всегда были спорными темами в сообществе Node.js
, но, так или иначе, мы многому научились благодаря этому подходу.
В Deno
пока нет настоящего менеджера пакетов, и нет каталога node_modules
, в котором хранятся все зависимости вашего проекта.
Если вы хотите использовать Deno
сторонние библиотеки, вы можете сделать это через Remote Imports.
⚠️ Это очень обширная и интересная тема, которую я, вероятно, потрачу время на глубокое понимание в будущем.
Мы скоро начнем использовать destjs
, поэтому давайте импортируем его в наш файл main.ts
и создадим наше приложение:
import { createApp } from "https://deno.land/x/destjs@v0.1.2/mod.ts" // This is a remote import - NEAT
createApp({port: 8000});
Пока что — createApp
— просто инициализируем наше приложение с нашими контроллерами и выставляем конечные точки через oak
http-сервер.
Запустив его, мы сможем получить доступ к нашему приложению через localhost:8000
.
⚠️ Если вы не знакомы с
NestJS
— я бы сказал, что библиотека ожидает, что файлы будут расположены в определенном дереве каталогов (тип соглашения над конфигурацией). Например: любой экспортируемый класс из каталога controllers, с вычисляемыми декораторами, регистрируется как конечная точка сервера.
Давайте создадим наш первый контроллер приложения. Проще говоря, контроллер — это место, где определяются наши конечные точки HTTP и где мы вызываем любую бизнес-логику, связанную с этой конечной точкой.
Мы назовем наш первый контроллер controller/plant.controller.ts
и пока что он будет выглядеть следующим образом:
import { Controller, Get } from "https://deno.land/x/destjs@v0.2.0/mod.ts" // 3
import { HttpContext } from "https://deno.land/x/destjs@v0.2.0/types.ts";
@Controller("/plants") // (1)
export default class PlantsController {
@Get("/") // (2)
getOne(context: HttpContext) {
console.log(context.state)
return { plant: "Monstera", beautiful: true }
}
}
Когда мы вызываем конечную точку этого контроллера http://localhost:8000/plants
с HTTP GET запросом, мы получаем в ответ красивую Monstera. Позже мы будем использовать базу данных для хранения наших растений и выполнять над ней некоторые операции.
Давайте увеличим масштаб некоторых вещей:
- (1) Декоратор
@Controller('/plants')
— пока что нам нужно знать о нем то, что он создает семейство конечных точек HTTP, доступных в нашем приложении. Здесь мы видим конечную точку/plants
. - (2) Декоратор
@Get('/')
для получения растения с помощью HTTP GET запроса к/plants
. - (3) Удаленный импорт для нашей библиотеки.
Это стандартный NestJS
способ свести к минимуму многие кодовые шаблоны, которые мы использовали в Express.js
.
Устранение проблем с библиотекой
Вот здесь он должен был запуститься, но произошла ошибка:
❯ deno run --allow-net --allow-read ./main.ts
error: Uncaught (in promise) NotFound: No such file or directory (os error 2), readdir 'middlewares'
for await (const item of Deno.readDir(name)) {
^
at async Object.[Symbol.asyncIterator] (deno:runtime/js/30_fs.js:125:16)
at async readFolder (https://deno.land/x/destjs@v0.2.0/bootstrap/middlewares.ts:8:20)
at async initializeMiddlewares (https://deno.land/x/destjs@v0.2.0/bootstrap/middlewares.ts:27:3)
at async createApp (https://deno.land/x/destjs@v0.2.0/mod.ts:19:3)
В настоящее время destjs
завершает работу, если не находит директорию middlewares
в корневой директории нашего проекта. Я не уверен, что это поведение является замыслом или ошибкой — но пока мы создадим его, даже если не собираемся писать никаких промежуточных модулей.
❯ tree -L 2
.
├── controllers
│ └── plants.controller.ts
├── main.ts
└── middlewares
2 directories, 2 files
После создания этой структуры каталогов наша команда может успешно выполняться:
❯ deno run --allow-net --allow-read ./main.ts
Middlewares initialized! 0ms
Check file:///Users/shikloshi/projects/deno/hello-deno/controllers/plants.controller.ts
Controllers initialized! 2106ms
DestJS application ready at port 8000
Протестируйте его с помощью curl
Используя http-клиент curl
, мы можем отправить http-запрос и убедиться, что мы действительно получаем ожидаемый http-ответ:
❯ curl localhost:8000/plants
{"plant":"Monstera","beautiful":true}
Флаги разрешения
Deno
, в отличие от Node.js
, по умолчанию не получает разрешений на использование сети и файловой системы хоста.
- При запуске сервера ему придется использовать сетевые возможности хоста и получать явные разрешения с помощью
--allow-net
. Я рекомендую вам подробно изучить флаги разрешений при знакомстве сDeno
.
Что дальше?
В следующих нескольких главах этого поста мы постараемся:
- Добавьте уровень персистентности, используя
PostgreSQL
. - Уровень аутентификации с использованием
middlewares
. - Мы также изучим
openAPI
. - Усовершенствуем наш API для выполнения некоторых действительно интересных вещей, таких как сохранение растений в БД и проверка времени последнего полива.
Дальнейшее чтение
Если вам понравилась эта статья и вы хотите углубить свое понимание некоторых базовых концепций. Вот несколько ссылок:
- Oak server — промежуточное ПО для встроенного HTTP-сервера Deno. ‘destjs’ использует его под капотом.
- NestJS — удивительный фреймворк поверх
Express.js
, который «портируется», так сказать, вDeno
. Он имеет отличные концепции и помогает нам писать бизнес-логику поверх хорошо продуманной конструкции. - Райан Дал впервые представит
Deno
— Рекомендуем!
Следите за новостями.