Ein Gutenberg-Block kann komplett ohne zusätzliche Tools mit klassischem JavaScript erstellt werden. Einfacher und übersichtlicher (zumindest nach meinem Empfinden) wird es aber durch den Einsatz von Dingen wie JSX, damit HTML-Elemente innerhalb von JavaScript fast wie normale HTML-Elemente erstellt werden können.
Weniger einfach ist an dem Teil die Einrichtung der Entwicklungsumgebung, um etwa JSX nutzen zu können. Inzwischen ist das aber deutlich leichter geworden, so gibt es ein NPM-Package, das eigentlich alles mitbringt, was für die Gutenberg-Entwicklung notwendig ist 🎉
@wordpress/scripts to the rescue
Im Januar 2018 wurde die erste Version des @wordpress/scripts-NPM-Pakets veröffentlicht. Anfangs enthielt es Tools zum Testen von Code, später kamen Dinge wie Babel-Kompilierung von JavaScript mit Webpack und JSX-Support dazu, und dieses Jahr wurde auch die Behandlung von Style-Dateien hinzugefügt.
Damit ist das Package mindestens für den Anfang der Block-Entwicklung eigentlich die einzige Abhängigkeit, die wir benötigen. Natürlich kann es sein, dass in speziellen Fällen weitere Abhängigkeiten installiert werden müssen, aber für viele Blöcke dürfte es ausreichen.
Voraussetzung und Installation
Voraussetzung ist, dass Node und NPM installiert (NPM kommt in der Regel mit der Node-Installation) und halbwegs aktuell sind – @wordpress/scripts
benötigt mindestens Node 10 und NPM 6.9.0. Außerdem wäre eine lokale WordPress-Installation nicht schlecht, in der der zu erstellende Block getestet werden kann.
Wenn das gegeben ist, erstellt einen Order für euer Plugin und führt darin mittels der Konsole den Befehl npm init
aus, um eine package.json
-Datei zu erstellen. Nachdem ihr den Befehl ausgeführt habt, werdet ihr einige Dinge gefragt, etwa nach dem Package-Namen und der Version. Unter anderem werdet ihr auch nach dem entry point
gefragt, dessen Standardwert auf index.js
gesetzt ist. Das ist nur relevant, wenn der Block als NPM-Package veröffentlicht werden würde, ich lösche den Eintrag meist manuell aus der erstellten package.json
.
Als Ergebnis des Befehls solltet ihr in dem Plugin-Verzeichnis eine package.json
vorfinden, die vom Prinzip so aussieht:
{
"name": "krautpress-patterns-block",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Florian Brinkmann",
"license": "GPL-3.0-or-later",
}
Code-Sprache: JSON / JSON mit Kommentaren (json)
Jetzt können wir das @wordpress/scripts
-Paket mit dem folgenden Befehl installieren:
npm install @wordpress/scripts --save-dev
Code-Sprache: Bash (bash)
Dadurch sollte in der package.json
ein neuer Eintrag eingefügt werden (die Versionsnummer könnte bei euch anders sein):
"devDependencies": {
"@wordpress/scripts": "^12.6.0"
}
Code-Sprache: JSON / JSON mit Kommentaren (json)
Jetzt benötigen wir noch eine src/index.js
-Datei. Diese Datei nutzt @wordpress/scripts
als Ausgangspunkt für seine Funktionen.
Damit haben wir die Voraussetzungen erfüllt 🎉 Jetzt schauen wir uns kurz an, nach welchem Schema die Dateien und Dateitypen verarbeitet werden.
Schema der Verarbeitung von JavaScript- und Stylesheet-Dateien
Wie bereits erwähnt, muss die Haupt-JavaScript-Datei index.js
heißen und im src
-Verzeichnis liegen. Das Ergebnis der Verarbeitung des JavaScript-Codes durch @wordpress/scripts
wird als index.js
im build
-Verzeichnis gespeichert.
Wenn ihr im Plugin auch CSS für den Block braucht, könnt ihr .css
, .scss
oder .sass
-Dateien verwenden (eine Mischung der unterschiedlichen Typen ist auch möglich) und erstellt die Dateien am besten ebenfalls im src
-Verzeichnis. Damit @wordpress/scripts
die Dateien verarbeitet, müssen sie in die index.js
(oder eine dort importierte JavaScript-Datei) eingebunden werden.
Gehen wir davon aus, dass eine src/index.css
-Datei existiert, dann könnten wir die wie folgt in die src/index.js
importieren:
import './index.css';
Code-Sprache: JavaScript (javascript)
Alle importierten Stylesheet-Dateien werden durch die später besprochenen start
– und build
-Skripte in die build/index.css
verarbeitet. Diese Datei ist für Styles gedacht, die nur im Editor verwendet werden.
Die einzige Ausnahme ist, wenn eine style.(css|scss|sass)
-Datei importiert wird: diese Datei wird zu einer build/style-index.css
verarbeitet und soll Regeln beinhalten, die für das Frontend und den Editor gelten.
Kommen wir jetzt zu den Möglichkeiten, die @wordpress/scripts
bietet.
@wordpress/scripts und seine Möglichkeiten
Das @wordpress/scripts
-Paket kommt mit einem praktischen Modul wp-scripts
, das uns erlaubt, Funktionen des Pakets relativ einfach über NPM-Skripte auszuführen.
Vielleicht fragt ihr euch jetzt, was »NPM-Skripte« sind. In der package.json
seht ihr den Eintrag scripts
, der nach npm init
das Skript test
enthält. Dieses Skript könnt ihr wie folgt ausführen:
npm run test
Code-Sprache: Bash (bash)
Ihr solltet als Ausgabe den Satz »Error: no test specified« sowie eine Fehlermeldung zurückbekommen.
Zurück zu wp-scripts
: Ich setze bisher meist nur die Befehle start
und build
ein, aber es gibt noch deutlich mehr. Im folgenden werde ich auf die zum Zeitpunkt der Veröffentlichung des Beitrags verfügbaren Funktionen eingehen, vorab hier eine Liste der Befehle als NPM-Skripte, wie sie in die package.json
eingefügt werden kann:
"scripts": {
"build": "wp-scripts build",
"start": "wp-scripts start",
"check-engines": "wp-scripts check-engines",
"check-licenses": "wp-scripts check-licenses",
"format:js": "wp-scripts format-js",
"lint:css": "wp-scripts lint-style",
"lint:js": "wp-scripts lint-js",
"lint:md:docs": "wp-scripts lint-md-docs",
"lint:md:js": "wp-scripts lint-md-js",
"lint:pkg-json": "wp-scripts lint-pkg-json",
"packages-update": "wp-scripts packages-update",
"test:e2e": "wp-scripts test-e2e",
"test:unit": "wp-scripts test-unit-js"
},
Code-Sprache: JavaScript (javascript)
start- und build-Befehl
Beide Befehle nehmen sich eure src/index.js
vor, verarbeiten diese sowie gegebenenfalls importierte Dateien und speichern die Ergebnisse im build
-Verzeichnis, von wo sie durch das Plugin genutzt werden können.
start
ist während der Entwicklung nützlich, da es einen Watcher startet und auf Änderungen in der src/index.js
und eingebundenen Dateien lauscht. Sobald sich eine Datei ändert, werden die build
-Dateien neu erzeugt und die Änderungen können getestet werden, ohne erst ein NPM-Skript starten zu müssen.
build
erzeugt minifizierte Dateien, die für den Produktiv-Einsatz optimiert sind.
Außerdem sehr praktisch: durch das Dependency Extraction Webpack Plugin wird eine build/index.asset.php
erzeugt, die unter anderem ein Array mit den WordPress-Skripten enthält, die vor unserem Plugin-Skript geladen werden müssen. Wenn in unserem Skript beispielsweise import { Component } from '@wordpress/element';
steht, führt das zum wp-element
-Eintrag in dem Array. Zusätzlich sorgt das Webpack-Plugin dafür, dass diese WordPress-Abhängigkeiten nicht in dem Build-Skript eingebunden werden, da sie ja über WordPress geladen werden können. Welche Skripte dabei genau unterstützt werden und wie das Einbinden eines Skripts mit dem Abhängigkeiten-Array aussehen kann, ist beispielhaft in der verlinkten Dokumentation des Webpack-Plugins beschrieben.
Beide Befehle können angepasst werden, um zum Beispiel mehrere JavaScript-Dateien als Einstiegspunkte zu definieren und/oder das Verzeichnis für die verarbeiteten Dateien zu verändern. Mehr Informationen dazu findet ihr auf der Seite des NPM-Packages.
check-engines- und check-licenses-Befehl
Über check-engines
kann geprüft werden, ob die installierte Node- und NPM-Version den Voraussetzungen entspricht.
check-licenses
prüft, ob die Lizenzen der NPM-Pakete mit der Lizenz des Projekts kompatibel sind.
format-js-Befehl
Der format-js
-Befehl formatiert Source-JavaScript-Dateien nach den JavaScript-Coding-Standards. Dateien in den Verzeichnissen build
, node_modules
, vendor
und wordpress
werden standardmäßig ignoriert.
lint-js-, lint-pkg-json-, lint-md-docs-, lint-md-js- und lint-style-Befehl
Wie an den Namen erkennbar, sind diese Befehle alle dafür da, um Code auf die Einhaltung von Coding-Standards zu überprüfen:
lint-js
kümmert sich um JavaScript-Source-Dateien,linkt-pkg-json
um diepackage.json
-Datei,lint-md-docs
um Markdown-Dateien,lint-md-js
um Code-Blöcke in Markdown-Dateien undlint-style
um Style-Dateien.
Alle fünf Skripte ignorieren Dateien in den Verzeichnissen build
, node_modules
, vendor
und wordpress
.
packages-update-Befehl
Der Befehl aktualisiert WordPress-Pakete (beginnend mit @wordpress/
) in der package.json
auf ihre neueste Version.
test-e2e- und test-unit-js-Befehl
Diese beiden Befehle sind für das Schreiben von Tests. test-e2e
startet den End-To-End-Test-Runner, Tests können mit dem JEST-API in Verbindung mit dem Puppeteer-API geschrieben werden.
test-unit-js
startet den Unit-Test-Runner, Tests können mit dem JEST-API geschrieben werden.
Weitere Möglichkeiten
Bei einigen Befehlen gibt es zusätzliche Optionen – ihr findet alle Befehle mit den verfügbaren Optionen auf der NPM-Seite des Pakets.
Weiter unten auf der Seite gibt es noch einen Bereich Advanced Usage, der beispielsweise beschreibt, wie eine eigene Webpack-Konfiguration genutzt werden kann.
Fazit
Die Möglichkeiten, die @wordpress/scripts
bietet, sind auf den ersten Blick vielleicht etwas überwältigend. Die wichtigsten Befehle sind start
und build
, alles andere ist schön, aber nicht notwendig um für Gutenberg zu entwickeln.
Dank @wordpress/scripts
brauchen wir uns in der Regel nur noch um die Installation eines NPM-Pakets zu kümmern und können dann direkt loslegen, ohne uns mit Dingen wie der Webpack-Konfiguration rumschlagen zu müssen, und das ist sehr, sehr angenehm.
Mentions