Friday, June 17, 2022
HomeWordPress DevelopmentJamstack in Motion - DEV Group

Jamstack in Motion – DEV Group


Herramientas:

Requisitos:

Objetivo:
Veras en acción con este rápido tutorial practico las mejores herramientas para desarrollar sitios de ultima generación. Escalables, resilientes y de fácil desacople. Desde 0 a producción.

Repositorio. Por si te llegas a perder en el camino 👀

Daré por sentado que ya saben que pueden seguir este tutorial con npm, yarn o pnpm; que ya cuentas con Node.js instalado y que haz trabajado con este runtime anteriormente.

⚠️ Esto no significa que no puedas comentar tus dudas. La comunidad es muy grande y mas de uno te vamos a poder ayudar si te atoras con algo o quieres profundizar un poco más. ⚠️



Que es Jamstack?

Jamstack es una arquitectura diseñada para que la net sea más rápida, más segura y más fácil de escalar. Se basa en muchas de las herramientas y flujos de trabajo que los desarrolladores adoran y que aportan la máxima productividad.

Los principios básicos de pre-renderización y desacoplamiento permiten que los sitios y las aplicaciones se entreguen con mayor confianza y resistencia que nunca.



Let’s do it

Iniciaremos creando todo lo necesario para nuestro proyecto.
Dejare enlaces a la documentación por si quieren profundizar un poco mas pero este tutorial puede ser seguido 100% desde aquí.



Subsequent.js

El framework de react para produccion. Subsequent.js le brinda la mejor experiencia de desarrollador con todas las funciones que necesita para la producción: renderizado híbrido estático y de servidor, compatibilidad con TypeScript, agrupación inteligente, búsqueda previa de ruta y más. No se necesita configuración.
Doc

$ yarn create next-app jamstack-2022 --typescript
Enter fullscreen mode

Exit fullscreen mode



Tailwind

Cree rápidamente sitios net modernos sin tener que abandonar su HTML. Un marco CSS de primera utilidad repleto de clases como flex, pt-4, text-center y giratorio-90 que se pueden componer para crear cualquier diseño, directamente en su marcado.
Doc

$ yarn add -D tailwindcss postcss autoprefixer
$ yarn tailwindcss init -p
Enter fullscreen mode

Exit fullscreen mode

// tailwind.config.js

/** @kind {import('tailwindcss').Config} */
module.exports = {
  content material: [
    "./pages/**/*.{js,ts,jsx,tsx}",
    "./components/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    prolong: {},
  },
  plugins: [],
}
Enter fullscreen mode

Exit fullscreen mode

/* types/globals.css */

@tailwind base;
@tailwind elements;
@tailwind utilities;
Enter fullscreen mode

Exit fullscreen mode

Puedes borrar types/House.module.css



Prisma

Cree e itere aplicaciones de JavaScript y TypeScript basadas en datos en menos tiempo.
Doc
VSCode extention

$ yarn add -D prisma
$ yarn prisma init
$ yarn add @prisma/consumer
Enter fullscreen mode

Exit fullscreen mode

Haremos un pequeño ajuste en la DB que usaremos. Puedes usar la que quieras. Para fines prácticos usaremos SQLite. Si te interesa un tutorial con Mongo Atlas, Planet Scale (MySQL), Cockroach (Postgres) ó con Docker. Házmelo saber en los comentarios.

// prisma/schema.prisma

generator consumer {
  supplier = "prisma-client-js"
}

datasource db {
  supplier = "sqlite"
  url      = env("DATABASE_URL")
}
Enter fullscreen mode

Exit fullscreen mode

; .env

DATABASE_URL="file:./dev.db"
Enter fullscreen mode

Exit fullscreen mode

Usaremos las mejores practicas de Prisma + Subsequent.js en tiempo de desarrollo.

// lib/prisma.ts

// globals.d.ts
import { PrismaClient } from '@prisma/consumer'

declare module world {
    let prisma: PrismaClient;
}

let prisma: PrismaClient;

if (course of.env.NODE_ENV === 'manufacturing') {
    prisma = new PrismaClient()
} else {
    if (!world.prisma) {
        world.prisma = new PrismaClient({ log: ['info', 'query'] })
    }
    prisma = world.prisma
}

export default prisma;
Enter fullscreen mode

Exit fullscreen mode



Subsequent Auth

Autenticación para Subsequent.js. Código abierto. Full Stack. Seguro por defecto. Eres dueño de tus datos.
Doc

$ yarn add next-auth @next-auth/prisma-adapter
Enter fullscreen mode

Exit fullscreen mode

// prisma/schema.prisma

generator consumer {
  supplier = "prisma-client-js"
}

datasource db {
  supplier = "sqlite"
  url      = env("DATABASE_URL")
}

mannequin Account {
  id                String  @id @default(cuid())
  userId            String
  kind              String
  supplier          String
  providerAccountId String
  refresh_token     String?
  access_token      String?
  expires_at        Int?
  token_type        String?
  scope             String?
  id_token          String?
  session_state     String?

  consumer Consumer @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@distinctive([provider, providerAccountId])
}

mannequin Session {
  id           String   @id @default(cuid())
  sessionToken String   @distinctive
  userId       String
  expires      DateTime
  consumer         Consumer     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

mannequin Consumer {
  id            String    @id @default(cuid())
  identify          String?
  e-mail         String?   @distinctive
  emailVerified DateTime?
  picture         String?
  accounts      Account[]
  periods      Session[]
}

mannequin VerificationToken {
  identifier String
  token      String   @distinctive
  expires    DateTime

  @@distinctive([identifier, token])
}
Enter fullscreen mode

Exit fullscreen mode

// pages/_app.tsx

import '../types/globals.css'
import kind { AppProps } from 'subsequent/app'

import { SessionProvider } from "next-auth/react"
export default perform App({
  Element,
  pageProps: { session, ...pageProps },
}: AppProps) {
  return (
    <SessionProvider session={session}>
      <Element {...pageProps} />
    </SessionProvider>
  )
}
Enter fullscreen mode

Exit fullscreen mode

// pages/api/auth/[...nextauth].ts

import NextAuth from "next-auth"
import GoogleProvider from "next-auth/suppliers/google"
import { PrismaAdapter } from "@next-auth/prisma-adapter"
import prisma from './../../../lib/prisma'

export default NextAuth({
  adapter: PrismaAdapter(prisma),
  suppliers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID as string,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,
    }),
  ],
})
Enter fullscreen mode

Exit fullscreen mode

Comenta si quieres ver como ligar otros servicios o consulta directamente la doc de Subsequent-Auth.

Para crear las credenciales para google como proveedor lo puedes hacer desde la consola de GCP.
Algo asi deberia de verse:
Image description

; .env

DATABASE_URL="file:./dev.db"
GOOGLE_CLIENT_ID=<Lo que te tire GCP console>
GOOGLE_CLIENT_SECRET=<Lo que te tire GCP console>
Enter fullscreen mode

Exit fullscreen mode

// pages/index.tsx

import { useSession, signIn, signOut } from "next-auth/react"

export default perform Element() {
  const { information: session } = useSession()

  if (session) {
    return <>
      <p>Signed in as <span className='font-bold'>{session!.consumer!.e-mail}</span></p>
      <button onClick={() => signOut()} className='bg-blue-500 py-1 px-3 text-white rounded'>Signal out</button>
    </>
  }

  return <>
    <p>Not signed in</p>
    <button onClick={() => signIn()} className='bg-blue-500 py-1 px-3 text-white rounded'>Sign up</button>
  </>
}
Enter fullscreen mode

Exit fullscreen mode



A echarlo a volar 🚀🚀

Generamos la base de datos

$ yarn prisma db push
Enter fullscreen mode

Exit fullscreen mode

Iniciamos el proyecto

$ yarn begin
Enter fullscreen mode

Exit fullscreen mode

Y listo, tienes tu proyecto con las mejores y mas nuevas tecnologías. Pero que dices? lo llevamos un poco mas allá?

Mucha suerte en tus proyectos y Joyful Hacking 🎉🧑‍💻

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments