joe shindelar eojthebrave hi i m joe eojthebrave joe
play

& Joe Shindelar @eojthebrave Hi, Im Joe @eojthebrave - PowerPoint PPT Presentation

Twin Cities DrupalCamp 2019 & Joe Shindelar @eojthebrave Hi, Im Joe @eojthebrave joe@drupalize.me Ti is talk covers: What is Gatsby Combining it with Drupal Building awesome stu ff thats OMG fast ! @eojthebrave Why


  1. Twin Cities DrupalCamp 2019 & Joe Shindelar @eojthebrave

  2. Hi, I’m Joe @eojthebrave joe@drupalize.me

  3. Ti is talk covers: • What is Gatsby • Combining it with Drupal • Building awesome stu ff that’s OMG fast ! @eojthebrave

  4. Why talk about Gatsby? • Learn React, GraphQL, and front-end performance • Experiment with decoupled architectures • New ways to use your existing Drupal skill set @eojthebrave

  5. What is Gatsby? (https://gatsbyjs.org) • A blazing-fast application generator for React • Open source (Gatsby, Inc.) • Written in Node.js • Uses React & GraphQL • Awesome developer experience

  6. $ gatsby build src/pages/index.js import React from 'react' import … const IndexPage = () => ( <div> <Header /> <h1>Hi friend</h1> <p>Welcome to your new Gatsby site.</p> <Link to="/page-2/">Go to page 2</Link> <Footer /> </div> ) export default IndexPage

  7. “Blazing means good.” Addy Osmani https://medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4

  8. How do you get blazing? 1. H/2 7. TTI 2. PRPL 8. TTFP 3. RAIL 9. FMP 4. FLIP 10.FCP 5. SPA 11.PWA 6. SW 12.TTFB https://developers.google.com/web/fundamentals/glossary

  9. Gatsby does … • Route based code-splitting • Automatically inline critical resources • Pre-fetch/pre-cache routes • Image optimizations • PWA / service workers (gatsby-plugin-o ffl ine) @eojthebrave

  10. Data from anywhere Gatsby source plugins … Any API. Any CMS. Any fj le. You bring data and Gatsby will assemble it into a uni fj ed GraphQL dataset.

  11. /gatsby-node.js /src/templates/pageTemplate.js exports.createPages = ({ boundActionCreators, graphql }) => { const { createPage } = boundActionCreators; const pageTemplate = path.resolve(`src/templates/pageTemplate.js`); class Template extends React.Component { return graphql(` render() { { const { data } = this.props; allMarkdownRemark( const { markdownRemark } = data; limit: 1000, const { frontmatter, html } = markdownRemark; # Skip any README.md files. return ( filter: {fileAbsolutePath: {glob: "!**/README.md"}} <div> ) { <Helmet edges { title={frontmatter.title + " | React for Drupal"} node { /> fileAbsolutePath, <Header /> frontmatter { <Navigation /> Hello world! path <div className={styles.grid}> } <div className={styles.content}> } Generate HTML pages from Markdown source data. <div dangerouslySetInnerHTML={{ __html: html }} /> } </div> } </div> } <Footer /> `).then(result => { </div> if (result.errors) { ); return Promise.reject(result.errors); } } } // Create pages for content sourced from file system. export default Template; result.data.allMarkdownRemark.edges.forEach(({ node }) => { // Skip any files that don't have a path defined in their frontmatter. export const pageQuery = graphql` if (!node.frontmatter.path) { query PageByPath($path: String!) { report.warn(`Skipping ${node.fileAbsolutePath} - invalid frontmatter.`); markdownRemark(frontmatter: { path: { eq: $path } }) { } html else { frontmatter { createPage({ path path: node.frontmatter.path, title component: pageTemplate, } context: {}, } }); } } `; }); }); };

  12. Plugins

  13. Why use Drupal? • Powerful data modeling tools • Complex editorial work fm ows • Fine grained access control • Self hosted (own your data!) • Open source (own your code!) @eojthebrave

  14. Drupal supports complex editorial processes: 1. Author 2. Technical review 3. Copy editor 4. Style guide review 5. Schedule for publication 6. Publish 7. Revisions

  15. Sub-site Landing page IoT / Alexa Native applications (Roku, iOS) Javascript application Primary site Many clients Business partners One backend Node.js Web Services / JSON API / REST / GraphQL Drupal

  16. Required Drupal modules • JSON API - drupal.org/project/jsonapi Recommended Drupal modules • JSON API Extras - drupal.org/project/jsonapi_extras • Simple OAuth - drupal.org/project/simple_oauth

  17. OMG!!! Drupal 8.7+ JSON:API is now in core Photo by Nitish Meena on Unsplash

  18. Required Drupal modules • JSON API - drupal.org/project/jsonapi Recommended Drupal modules • JSON API Extras - drupal.org/project/jsonapi_extras • Simple OAuth - drupal.org/project/simple_oauth

  19. ? l a p o u t ! r E w D e R d N e E l p H u o T c e R Contenta CMS d A T S Contenta is an API-First Drupal distribution • http://www.contentacms.org/ • https://using-drupal.gatsbyjs.org • https://github.com/gatsbyjs/gatsby/tree/master/examples/using-drupal

  20. { "data": { "type": "recipes", "id": "7c6c536c-2531-42e3-b228-145ee09320ed", "attributes": { "internalId": 14, "isPublished": true, "title": "Crema catalana", "createdAt": "2018-08-07T09:48:43-0600", "updatedAt": "2018-08-07T09:48:43-0600", "isPromoted": true, "path": “/recipes\crema-catalana", "cookingTime": 20, "difficulty": "medium", "ingredients": [ "1l milk", "200g sugar", "6 egg yolks", "30g cornstarch", "1 cinnamon stick", "1 piece lemon peel" ], "numberOfservings": 8, Data modelling "preparationTime": 10, "instructions": {}, "summary": { "value": "Enjoy this sweet recipe for one of the ...", "format": null, "processed": "<p>Enjoy this sweet recipe ..." } }, "relationships": { "contentType": { ... }, "owner": { ... }, "author": { ... }, "image": { "data": { "type": "images", "id": "091b4dc5-39db-43f7-967e-d289188819e0" }, "links": { "self": "http://contenta.ddev.local/api/recipes/7c6c536c-2531-42e3-b228-145ee09320ed/relationships/image", "related": "http://contenta.ddev.local/api/recipes/7c6c536c-2531-42e3-b228-145ee09320ed/image" } }, "category": { ... }, "tags": { ... } }, "links": { "self": "http://contenta.ddev.local/api/recipes/7c6c536c-2531-42e3-b228-145ee09320ed" } },

  21. { "data": [], "links": { "self": "http://cms.contentacms.io/api", "blocks": "http://cms.contentacms.io/api/blocks", "comments": "http://cms.contentacms.io/api/comments" "reviews": "http://cms.contentacms.io/api/reviews" "commentTypes": "http://cms.contentacms.io/api/commentTypes" "consumer--consumer": "http://cms.contentacms.io/api/consumer/consumer" "files": "http://cms.contentacms.io/api/files", "imageStyles": "http://cms.contentacms.io/api/imageStyles" "mediaBundles": "http://cms.contentacms.io/api/mediaBundles" "images": "http://cms.contentacms.io/api/images", "articles": "http://cms.contentacms.io/api/articles" {json:api} is a known spec. "pages": "http://cms.contentacms.io/api/pages", "recipes": "http://cms.contentacms.io/api/recipes" "node--tutorial": "http://cms.contentacms.io/api/node/tutorial" "contentTypes": "http://cms.contentacms.io/api/contentTypes" "menus": "http://cms.contentacms.io/api/menus", "vocabularies": "http://cms.contentacms.io/api/vocabularies" "categories": "http://cms.contentacms.io/api/categories" "tags": "http://cms.contentacms.io/api/tags", "roles": "http://cms.contentacms.io/api/roles", "users": "http://cms.contentacms.io/api/users", "menuLinks": "http://cms.contentacms.io/api/menuLinks" } }

  22. npm install --save gatsby-source-drupal /gatsby-con fj g.js module.exports = { plugins: [ { resolve: `gatsby-source-drupal`, options: { baseUrl: process.env.API_URL, // http://cms.contentacms.io/ apiBase: `api`, // optional, defaults to `jsonapi` }, }, ], }

  23. exports.createPages = ({ boundActionCreators, graphql }) => { const { createPage } = boundActionCreators; const tutorialTemplate = path.resolve(`src/templates/tutorialTemplate.js`); return graphql(` { allNodeTutorial { edges { node { drupal_id, title, path { alias }, } } } Use Gatsby’s Node API to } `).then(result => { if (result.errors) { provide Gatsby with a list of return Promise.reject(result.errors); } pages you want to dynamically // Create pages for tutorials sourced from Drupal. result.data.allNodeTutorial.edges.forEach(({ node }) => { generate. let path; if (node.path.alias == null) { path = `tutorial/${node.drupal_id}`; } else { path = node.path.alias; } createPage({ path: path, component: tutorialTemplate, context: { drupal_id: node.drupal_id, }, }); }); /gatsby-node.js }); };

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend