다트 개구리

요구 사항:
  • 다트 >=2.17.0 <3.0.0

  • Dart Frog 🐸 es un framework web construido sobre Shelf inspirado por Next.JS , Remix y Express .

    Otro Angel 또는 Aqueduct ?



    Solo algunos que planeábamos hacer backend con Dart teníamos la esperanza con estos dos frameworks que al día de hoy lamentablemente ya nos acompañan.
    Sin embargo podemos ver que este nuevo proyecto de llevar Dart al backend(otra vez) esta en buenas manos. Very Good Ventures esta detrás de esto por lo que podemos esperar grandes cosas, aunque tampoco dejemos de lado nuestro apoyo como comunidad, actualmente no se aceptan PR por que el 로드맵 esta ya bien definido, pero issues son bienvenidos.
    Asi que hablando de 로드맵...

    문제가 없습니까?



    ✅ 핫 리로드 ⚡️
    ✅ 다트 개발자 도구 ⚙️
    ✅ 파일 시스템 라우팅 🚏
    ✅ 색인 경로 🗂
    ✅ 중첩 경로 🪆
    ✅ 동적 경로 🌓
    ✅ 미들웨어 🍔
    ✅ 의존성 주입 💉
    ✅ 프로덕션 빌드 👷‍♂️
    ✅ 도커 🐳
    ✅ 정적 파일 지원 📁

    레이더를 사용하려면 어떻게 해야 합니까?



    🚧 Dart API 클라이언트 생성
    🚧 오픈 API 문서 생성
    🚧 DartFrog 테스트 라이브러리(단위 및 e2e 테스트용 유틸리티)
    🚧 새로운 경로와 미들웨어를 생성하는 CLI 새 명령
    🚧 모니터링을 위한 상태 확인 엔드포인트
    🚧 표준 로그 형식을 준수하도록 구성할 수 있는 로거( https://cloud.google.com/run/docs/logging )
    🚧 웹소켓 지원
    🚧 DartFrog에 대한 VSCode/IntelliJ 지원
    🚧 새 프로젝트 만들기
    🚧 새로운 경로
    🚧 새로운 미들웨어
    🚧 디버거 연결
    🚧 지원되는 클라우드 플랫폼(예: Cloud Run)에 대한 배포를 지원하는 CLI 배포 명령

    다트 앤 백엔드



    Sin duda un proyecto prometedor en el que pongo la confianza para regresar a Dart 백엔드. En su momento hice un pequeño blog sobre donde desplegamos en Railway un servidor con Dart. Traer un ejemplo actualizado con Dart Frog, un poco mas complejo para que valga la pena.

    Pero mientras tanto que tal si hacemos un pequeñísimo ejemplo de Todo app? Que nada mas registre y liste, solo para no irnos sin programar algo. 🧑‍💻

    엠페세모스



    Te dejo el repositorio por si solo quieres ver el resultado final.



    Definamos un modelo básico de Todo.

    // models/todo.dart
    
    import 'package:uuid/uuid.dart';
    
    enum Status { open, inProgress, close }
    
    class Todo {
      Todo(String? id, this.title, this.description, this.status)
          : id = id ?? const Uuid().v4();
    
      factory Todo.fromJson(Map<String, dynamic> json) {
        return Todo(
          json['id'] as String,
          json['title'] as String,
          json['description'] as String,
          Status.values
              .firstWhere((status) => json['status'] as String == status.name),
        );
      }
    
      String id;
      String title;
      String description;
      Status status;
    
      Map<String, dynamic> toJson() {
        return {
          'id': id,
          'title': title,
          'description': description,
          'status': status.name
        };
      }
    }
    
    


    Por el momento las rutas se crean al mas puro estilo de Nextjs... 🙅‍♂️

    FutureOr<Response> onRequest(RequestContext context) async {
      switch (context.request.method) {
        case HttpMethod.get:
          return Response(body: 'Get');
        case HttpMethod.post:
          return Response(body: 'Post');
        case HttpMethod.delete:
        case HttpMethod.head:
        case HttpMethod.options:
        case HttpMethod.patch:
        case HttpMethod.put:
          return Response(statusCode: HttpStatus.methodNotAllowed);
      }
    }
    
    


    Y a mi no me encanta ese método así que hagamos una pequeña clase que nos ayude un poco con el 상용구.

    // utils/route_builder.dart
    
    import 'dart:async';
    import 'dart:io';
    
    import 'package:dart_frog/dart_frog.dart';
    
    class RouteBuilder {
      final Map<HttpMethod, Handler> _handlers = {};
    
      FutureOr<Response> hanlder(RequestContext context) {
        if (_handlers.containsKey(context.request.method)) {
          return _handlers[context.request.method]!(context);
        }
        return Response(statusCode: HttpStatus.methodNotAllowed);
      }
    
      void get(Handler handler) => _handlers[HttpMethod.get] = handler;
    
      void post(Handler handler) => _handlers[HttpMethod.post] = handler;
    
      void delete(Handler handler) => _handlers[HttpMethod.delete] = handler;
    
      void head(Handler handler) => _handlers[HttpMethod.head] = handler;
    
      void options(Handler handler) => _handlers[HttpMethod.options] = handler;
    
      void patch(Handler handler) => _handlers[HttpMethod.patch] = handler;
    
      void put(Handler handler) => _handlers[HttpMethod.put] = handler;
    }
    
    


    Y con todo listo solo creemos nuestra nueva ruta para todos.

    // routes/todos.dart
    
    import 'dart:async';
    
    import 'package:dart_frog/dart_frog.dart';
    import 'package:uuid/uuid.dart';
    
    import '../models/todo.dart';
    import '../utils/route_builder.dart';
    
    final _todos = [];
    
    final _routeBuilder = RouteBuilder()
      ..get((context) {
        return Response.json(body: _todos);
      })
      ..post((context) async {
        final jsonTodo = await context.request.json();
        jsonTodo['status'] = 'open';
        jsonTodo['id'] = const Uuid().v4();
    
        final newTodo = Todo.fromJson(jsonTodo);
        _todos.add(newTodo);
    
        return Response.json(body: newTodo.toJson());
      });
    
    FutureOr<Response> onRequest(RequestContext context) async =>
        _routeBuilder.hanlder(context);
    
    


    Echemos a volar nuestro proyecto.

    $ dart_frog dev
    




    Y ya lo tenemos 🎉







    인테그라모스 반응? Hacemos de Dart Frog FullStack?
    Happy Hacking 🧑‍💻🎉에 대한 댓글 보기

    좋은 웹페이지 즐겨찾기