Skip to content

Latest commit

 

History

History
1060 lines (769 loc) · 25.9 KB

File metadata and controls

1060 lines (769 loc) · 25.9 KB
class highlighter info theme
text-center
shiki
## Druxt 101 Fully Decoupled Drupal with JSON:API and Nuxt.js Learn more at [DruxtJS.org](https://druxtjs.org)
./theme

DruxtJS

Fully Decoupled Drupal
with JSON:API and Nuxt.js

druxt-101.slides.realityloop.com

Press Space for next page

Stuart Clark


layout: section

The stack

Drupal

drupal.org
+

Nuxt.js

nuxtjs.org
=

Druxt.js

druxtjs.org

layout: module

Drupal

  • Content management system
  • Open source / Self hostable
  • Fieldable data modeling and JSON:API
  • Role based user access control
  • 45000+ modules

layout: module

Nuxt.js

  • Vue.js frontend framework
  • Components auto-import
  • Server and Client side rendering
  • Static Site generation
  • 150+ modules

layout: module

DruxtJS

  • Content and configuration from Drupal
  • Routing and rendering in Nuxt.js
  • Vue.js components; Block, Entity, Views, etc
  • Filterable JSON:API client w/Vuex caching
  • 8 modules

class: text-center layout: fact

TL;DR

Druxt = DRUpal + nUXT


layout: section

Table of Contents

  1. Introduction
  2. Getting started using DruxtSite
  3. Theming with Wrappers and Slots
  4. Single Page Applications with Druxt components
  5. Entity forms and reactivity
  6. Static Site Generation
  7. #GetInvolved
  8. Q & A

druxt-101.slides.realityloop.com


background: https://source.unsplash.com/collection/94734566/1920x1080 class: text-center layout: cover

Getting Started

using DruxtSite


layout: module

Druxt Site

  • Nearly Zero config setup
  • Auto of the box, fully decoupled Drupal Site
  • Drupal Blocks, Entities, Views and more

layout: youtube-left id: PQcTyIpdHsk

Getting Started

Drupal

  1. Download Drupal
composer create-project -s dev \
drupal/recommended-project [DESTINATION]
  1. Download Druxt module
composer require drupal/druxt
  1. Quickstart
php ./web/core/scripts/drupal quick-start
  1. Install Druxt module: /admin/modules

  2. Configure permissions: /admin/people/permissions


layout: youtube-right id: aWoQRb4F3FY

Getting Started

Nuxt

  1. Download Nuxt
npx create-nuxt-app [DESTINATION]
  1. Download DruxtSite module
npm i druxt-site
  1. Configure nuxt.config.js
modules: ['druxt-site'],
druxt: {
  baseUrl: 'https://example.com',
  site: { theme: 'bartik' },
}
  1. npm run dev

class: text-center layout: cover

Live demo

Getting Started with DruxtSite

https://gitpod.io#github.com/druxt/quickstart-druxt-site


layout: section

How the Druxt does it work?

flowchart LR
  Nuxt --> DruxtSchema
  Nuxt --> DruxtSite
  DruxtSchema --> DruxtEntity
  subgraph Layout
    DruxtSite --> DruxtBlocks
    DruxtBlocks --> DruxtBreadcrumb
    DruxtBlocks --> DruxtMenu
    DruxtBlocks --> DruxtRouter
  end
  subgraph Route
    DruxtRouter --> DruxtEntity
    DruxtRouter --> DruxtView
    DruxtView --> DruxtEntity
  end
Loading

background: /images/umami-storybook.png class: text-center layout: cover

Theming

with Wrappers and Slots


layout: section

Vue crash course

Warning: Information overload


layout: full

Vue single file component

<template>
  <article>
    <h2>{{ entity.attributes.title }}</h2>
    <slot name="body" />
    <AppButton :to="link" @click="onClick">Click me</AppButton>
  </article>
</template>

<script>
export default {
  computed: {
    link: ({ entity }) => entity.attributes.path.alias || `/node/${entity.attributes.drupal_internal__nid}`,
  },
  methods: {
    onClick() { ... }
  }
}
</script>

<style scoped>
h2 {
  color: #007bff;
}
</style>

image: /images/devtools-attrs-props-slots.png layout: image-right

$attrs, mixins, props & slots

<template>
  <article v-bind="$attrs">
    <h2>{{ entity.attributes.title }}</h2>
    <slot name="field_image" />
    <slot name="field_tags" />
    <slot name="body" />
  </article>
</template>

<script>
import { DruxtEntityMixin } from 'druxt-entity'
export default {
  mixins: [DruxtEntityMixin],
}
</script>
  • $attrs: attributes / unregistered properties
  • mixins: vue presets
  • props: properties
  • slots: template regions / data

layout: image-right image: /images/components.png position: left

@nuxt/components

nuxt.config.js
export default {
  components: true
}

DruxtWrapper

  • Components provide component.options
  • First available used

Example:

<DruxtEntity type="node--article">
  • DruxtEntityNodeArticleDefault.vue
  • druxt/entity/node/article/Default.vue

layout: image-right image: /images/umami-storybook.png position: top left

@nuxtjs/storybook

storybook.nuxtjs.org

+ Druxt =

Zero-config, auto-generated Storybook integration with Druxt modules.

Getting started

  1. Download @nuxtjs/storybook module
npm i -D @nuxtjs/storybook postcss@latest
  1. npx nuxt storybook

class: text-center layout: cover

Live demo

Theming with Storybook

https://gitpod.io#github.com/druxt/quickstart-druxt-site


background: https://source.unsplash.com/collection/94734566/1920x1080 class: text-center layout: cover

Single Page Applications

with Druxt Components


layout: full

Druxt components

<template>
  <div>

    <DruxtBlock id="umami_branding" />

    <DruxtBreadcrumb />

    <DruxtMenu name="main" />

    <DruxtEntity type="node--article" :uuid="uuid" mode="teaser" />

    <DruxtView display-id="block_1" view-id="promoted_items" />

  </div>
</template>

layout: full

Template injection

<template>
  <DruxtEntity
    mode="default"
    type="node--article"
    uuid="b5cb94eb-9d14-4cea-9c3b-433ac5ebfead"
  >
    <template #default="article">
      <h1 class="text-3xl">{{ article.entity.attributes.title }}</h1>

      <DruxtEntity
        type="file--file"
        :uuid="article.entity.relationships.field_image.data.id"
      >
        <template #default="file">
          <img :src="file.entity.attributes.uri.url" />
        </template>
      </DruxtEntity>

      {{ article.entity.attributes.body.summary }}
    </template>
  </DruxtEntity>
</template>

class: text-center layout: cover

Live demo

Building pages

https://gitpod.io#github.com/druxt/quickstart-druxt-site


background: https://source.unsplash.com/collection/94734566/1920x1080 class: text-center layout: cover

Entity forms

and reactivity


image: /images/druxt-entity-form.png layout: image-right

DruxtEntityForm

<DruxtEntityForm
  type="contact_message--feedback_form"
/>

v-model

<template>
  <div>
    <DruxtEntity v-bind="props" v-model="model">
    <DruxtEntityForm v-bind="props" v-model="model">
  </div>
</template>

<script>
export default {
  data: () => ({
    model: null,
    props: { type: 'node--article', uuid: '...' }
  }),
}
</script>

class: text-sm id: OL_bRANN6oA layout: youtube-right

EditBar experiment


class: text-center layout: cover

Live demo

Nearly headless blog

https://gitpod.io/#github.com/Decipher/example-druxt-blog


id: SoWU5PfE7SI layout: youtube-right

Static Site Generation

  1. Configure nuxt.config.js
target: 'static',
ssr: true,

// optional.
generate: {
  routes: ['/', '/en', '/es'],
}
  1. npm run generate

  2. (optional) npm start


background: https://source.unsplash.com/collection/94734566/1920x1080 class: text-center layout: cover

#GetInvolved

discord.druxtjs.org / #druxt @ Drupal Slack


layout: section

Druxt Office Hours

Every Wednesday
09:00 - ~17:00 AEDT
(22:00 - ~06:00 UTC)

https://discord.druxtjs.org


layout: two-cols

Druxt

Docs:

Mono-repo:

Support:

::right::

Drupal

Projects:

Slack:

  • #contenta
  • #decoupled
  • #decoupled-menu-initiative

class: text-sm id: R6eM3JQ_pv8 layout: youtube-right

Umami Parity project


class: text-center layout: cover

Sponsors

Development

Hosting


background: https://source.unsplash.com/collection/94734566/1920x1080 class: text-center layout: cover

Questions

and answers


class: text-center layout: cover

Find out more