bringing gutenberg javascript outside of the block editor...wp scripts — building — linting —...

54
Bringing Gutenberg Javascript outside of the Block Editor

Upload: others

Post on 13-Jul-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Bringing Gutenberg Javascript outside of the Block Editor

Page 2: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Building a React WP-Admin App

— Interactivity

— Defined Extensibility

— Speed of Development

Page 3: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Getting Started

— New or existing codebase^ This of course works great when you are starting a new plugin, but you can add it to an existing codebase as well.

Page 4: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Getting Started

— New or existing codebase

— REST API First

Page 5: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Getting Started

— New or existing codebase

— REST API First

— Don’t rewrite everything

Page 6: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

WP Scripts

— Building

— Linting

— Testing

Page 7: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

npm install @wordpress/scripts --save-dev

Page 8: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

WP Scripts - Build/Start

— npm run-script build

— Builds code insrc/index.js and outputs it to build/index.js

— Webpack

— Babel

— Dependency extraction

— No SCSS yet

Page 9: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Packages

— 60 odd packages

— Documented on developer.wordpress.org

Page 10: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Packages

— Components

— Data

— Plugins

Page 11: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Components Pre-Gutenberg

— Informal component library

— Limited set of components

Page 12: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Components Pre-Gutenberg

wpadmin.bracketspace.com

Page 13: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Components Pre-Gutenberg

— Informal component library

— Limited set of components

— Varying ease of use

— submit_button()

— Notices

— Thickbox

Page 14: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Gutenberg Component Library

— Extensive

— Familiar patterns admin-wide

Page 15: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Gutenberg Component Library

— Speed of Development

— Dropzones, Dragging, Tab Panels, Modals, Popovers

Page 16: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Gutenberg Component Library

— Accessibility

— Modals/Popovers

— Focus Trapping

— Navigable Regions

Page 17: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Gutenberg Component Library

— Documented ondevleoper.wordpress.org

— Usage Instructions

Page 18: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Storybook

https://wordpress.github.io/gutenberg/

Page 19: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Gotchas

— Most reliable in WP Admin

— Styles may be tied to the Block Editor

— CSS Selector Specificity

Page 20: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Data Package

— Brain of the Application

— Manages State

Page 21: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

State – Application Data

— User generated content

— Posts, comments, users, etc…

— Machine generated data

— Logs

— Emails

Page 22: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

State – UI

— Current post

— Visible metaboxes

— Actions in progress

Page 23: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —
Page 24: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —
Page 25: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

{ // List of email ids for the list of emails list: [], // Object of ids to their full object byId: {}, // List of ids of items that are being deleted deleting: [], // List of ids of items that are being fetched fetching: [], // Is the inbox currently being updated emptyingInbox: false, // Is the list being fetched isFetching: false,}

Page 26: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Data Store

— Layer on top of state

— With a defined API

— Integrates with React

Page 27: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Actions

— Select an email to view

— Delete an email

— Refresh the inbox

— Receive the emails

Page 28: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Actions

dispatch('wpmd/emails').fetchEmails();dispatch('wpmd/emails').deleteEmail( emailId );dispatch('wpmd/app').viewEmail( emailId );

Page 29: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Actions

{ type: 'DELETE_EMAIL', emailId: 5,}

Page 30: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Reducer

— Given an action just took place, what is the new application state

Page 31: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Reducer

Action Old State New State

Fetch Items isFetching: false

isFetching: true

Receive Items list: [] list: [ 1, 2 ]

Finish Fetch isFetching: true isFetching: false

Page 32: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Selectors

— Hide “raw” state

— Answers a question based on the raw state

— Transforms state into richer values

Page 33: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

function isFetching( state ) { return state.isFetching;}

select('wpmd/emails').isFetching();

Page 34: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

function getEmails(state) { const ids = state.list, byId = state.byId; const emails = new Array(ids.length); let index = -1;

while (++index < ids.length) { emails[index] = byId[ids[index]].email; }

return emails;}

Page 35: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

select('wpmd/emails').getEmails();

[ { id: 1, subject: 'Hello World' }, { id: 2, subject: 'Password Reset' },]

Page 36: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Multiple Data Stores

— Multiple stores for an application

— Di!erent store for each context

Page 37: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Application UI Store

— What is reusable in other contexts?

— What is specific to this interface?

Page 38: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Benefits over Redux?

— Forces you to define an API, adding semantics to a cryptic state shape

— Easier for 3rd party developers to use

Page 39: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Benefits over Redux?

— Forces you to define an API, adding semantics to a cryptic state shape

— Easier for 3rd party developers to use

— Resolvers

— Async actions

— Testability

Page 41: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Plugins Package

— Define code for inclusion in another application

— 3rd party developers

— Modular 1st party code

Page 42: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

<PluginArea />

— Render in application root

— Once per-application

— Not where plugins appear

Page 43: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

registerPlugin()

— Unique slug for the plugin

— Render function

Page 44: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

registerPlugin('my-plugin', { render() { // Todo }});

Page 45: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Slot Fill

— <Slot name="Sidebar" /> <Fill name="Sidebar" />

— Unique slot name per pluggable area

Page 46: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Create the Slot Fill

import {createSlotFill} from '@wordpress/components';

const { Fill, Slot } = createSlotFill( 'Sidebar' );

export { Fill as SidebarFill, Slot as SidebarSlot };

Page 47: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Register a Fill

registerPlugin('my-plugin', { render() { return ( <SidebarFill> Hello World! </SidebarFill> ); }});

Page 48: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Display the Fills

function EmailSidebar( { email } ) { return ( <div className="wmd-email-sidebar"> <Headers email={ email } /> <SidebarSlot /> </div> );}

Page 49: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Passing data

— fillProps are passed to fills

— Fill must be a function

Page 50: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Passing data

<SidebarSlot fillProps={ { email } } />

render() { return ( <SidebarFill> {(props) => ( <div>{props.email.subject}</div> )} </SidebarFill> )}

Page 51: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Sharing Components

— Export components in your entry file

— Specify library and libraryTarget

Page 52: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Sharing Components

export {SidebarFill} // src/index.js

output: { // webpack.config.js ...defaultConfig.output, library: [ 'wpMailDebugger', '[name]' ], libraryTarget: 'this',},

const {SidebarFill} = wpMailDebugger.entry;

Page 53: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Demo

Page 54: Bringing Gutenberg Javascript outside of the Block Editor...WP Scripts — Building — Linting — Testing. npm install @wordpress/scripts --save-dev. WP Scripts - Build/Start —

Questions

Slides & Plugin: timothybjacobs.com