40
a JavaScript framework for creating server-driven single page apps @sebdedeyne

a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

a JavaScript framework for creating server-driven single page apps

@sebdedeyne

Page 2: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Sebastian De Deyne

Frontend(ish) developer at Spatie

Maintainer of Inertia's React adapter

Helping out with Inertia

About me

@sebdedeyne

Page 3: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Complex business apps (form heavy)

Require authentication (no SEO concerns)

No shared public API (MVC)

Laravel + React & TypeScript

Projects I work on at Spatie

@sebdedeyne

Page 4: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Page 5: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Page 6: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Page 7: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

A modern UI needs JavaScript

Page 8: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Laravel, Symfony, Ruby on Rails

Own templating language

Blade, Twig, ERB

Sprinkled with JavaScript

Server-side MVC frameworks

@sebdedeyne

Page 9: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Let’s just build a SPA!

Page 10: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Build your UI entirely in JavaScript

Consume existing APIs

Offline support

Possibly less server load

SPAs are awesome!

@sebdedeyne

!

"

#

#

Page 11: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Client side routing

Data fetching

State management

Recreate browser behaviour

SPAs add client complexity

@sebdedeyne

Page 12: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

JavaScript view layer

No API

Bonus: less AJAX endpoints

Keep routing & data fetching on the server

Wishlist

@sebdedeyne

Page 13: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

a JavaScript framework for creating server-driven single page apps

@sebdedeyne

Page 14: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

1. No server side templating

Page 15: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@extends('layouts.app')

@section('main')

<h1>Users!"h1>

<users-list

:users="{{ json_encode($users) }}"

>!"users-list>

@endsection

Page 16: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

class UsersController

{

public function index()

{

return view('users.index', [

'users' !$ User!%all(),

]);

}

}

Page 17: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

class UsersController

{

public function index()

{

return inertia('Users/Index', [

'users' !$ User!%all(),

]);

}

}

Page 18: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build
Page 19: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

<template>

!!!& !!' !!(

!"template>

<script>

export default {

props: ['users']

}

!"script>

Page 20: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

2. No full page refreshes

Page 21: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Page 22: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Page 23: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

First visit

HTML

Subsequent visits

JSON

Page 24: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Inertia.js

Client side adapter

Server side adapter

Core + collection of adapters

@sebdedeyne

Page 25: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Laravel

Symfony (community)

Server framework adapters

@sebdedeyne

Page 26: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Vue.js

React

Svelte

Client framework adapters

@sebdedeyne

Page 27: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

Time for some code!

$Laravel + Vue.js

Page 28: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Add abilities to models or resources

Entity specific vs. general use

Authorization

@sebdedeyne

Page 29: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

class Post extends Model

{

public function getPermissionsAttribute()

{

return [

'update' !$ Auth!%user()!)can('edit', $this),

'destroy' !$ Auth!%user()!)can('destroy', $this),

];

}

}

Page 30: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

<InertiaLink

v-if="post.abilities.destroy"

:href="`/posts/${post.id}`"

method="delete"

>

Move to trash

!"InertiaLink>

Page 31: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

class User extends Model

{

public function getPermissionsAttribute()

{

return [

'post' !$ [

'viewAny' !$ Auth!%user()

!)can('viewAny', Post!%class),

'create' !$ Auth!%user()

!)can('create', Post!%class),

],

];

}

}

Page 32: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

<InertiaLink

v-if="$page.auth.user.permissions.post.create"

href="/posts/create"

>

Add new post

!"InertiaLink>

Page 33: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Use something like tightenco/ziggy

Add routes to models or resources

Routes

@sebdedeyne

Page 34: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

class Post extends Model

{

public function getLinksAttribute()

{

return [

'update' !$ action(

[PostsController!%class, 'update'], $this

),

'destroy' !$ action(

[PostsController!%class, 'destroy'], $this

),

];

}

}

Page 35: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

<InertiaLink

v-if="post.permissions.destroy"

:href="post.links.destroy"

method="delete"

>

Move to trash

!"InertiaLink>

Page 36: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

@sebdedeyne

github.com/spatie/laravel-resource-endpoints

Page 37: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Map controller actions to JavaScript components

Turbolinks-like navigationPreserve page state & scroll

Partial data reloads

Remember state

Asset versioning

Features

@sebdedeyne

Page 38: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

No context switching during development

Less AJAX endpoints

Snappy, no full page refreshes

Doesn't break browser behaviour

What makes Inertia great?

@sebdedeyne

DX

UX

Page 39: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

Is Inertia safe for production?

@sebdedeyne

YES! %%

Page 40: a JavaScript framework for creating server-driven …...Blade, Twig, ERB Sprinkled with JavaScript Server-side MVC frameworks @sebdedeyne @sebdedeyne Let’s just build a SPA! Build

github.com/inertiajs (website & full docs coming soon!)

Inertia.js on Twitter: @inertiajs

Jonathan Reinink: @reinink

sebastiandedeyne.com

@sebdedeyne

Resources