Elm Assets mit Parcel einfach verpacken

Mit der kürzlich erschienen Version 1.10 unterstützt Parcel jetzt auch Elm Assets ohne zusätzliches Plugin – damit wird das Projekt Setup einer Elm Webapp massiv vereinfacht. Wie ein solches Projekt Setup aussehen kann, wird in diesem Blogpost beschrieben.

Parcel – Geschenke verpacken oder was?

Die Aufgabe eines Bundlers ist es, die Assets einer Webapplikation (HTML, CSS, Javascript, Images etc.) und ihre Dependencies aufzubereiten, so dass die Applikation am Schluss optimal an den Browser ausgeliefert wird. Parcel ist eine Alternative zu Webpack, Browserify und Rollup. Im Gegensatz zu diesen kommt Parcel ohne jegliche Konfiguration aus. Wollte man bisher eine Elm-Applikation mit Parcel builden, war man auf externe Plugins angewiesen.  Das ist zwar nicht schlecht, aber es ist natürlich umso schöner, wenn ein Tool die gewünschte Funktionalitäten gleich von Haus aus mitbringt.

Projekt Setup

(Lieber Leser: mach mit!)

Das Setup einer Elm-Applikation mit Parcel als Bundler gestaltet sich tatsächlich extrem einfach. Voraussetzung ist lediglich eine relativ aktuelle node/npm Installation, wie beispielsweise:

$ node --version
v9.2.0
$ npm --version
5.5.1

Anschliessend kann das Projekt erstellt werden:

$ mkdir elm-parcel-project && cd $_ && npm init -y
$ npm install --save-dev parcel-bundler

Als Einstiegspunkt erstellen wir die Datei index.html:

$ touch index.html

Das HTML unserer Applikation ist minimal: Ein div-Element enthält und lädt unsere Applikation.

Die Applikation ist vorerst in reinem Javascript gehalten und ersetzt lediglich den Inhalt des HTML Elements mit einem Text:

$ mkdir src/ && touch src/main.js

Und main.js sieht wie folgt aus:

document.getElementById('app').innerHTML="Hello Parcel";

Die Applikation kann nun mit ./node_modules/.bin/parcel index.html gestartet werden – am einfachsten geht dies mit einem spezifischen npm-Script in package.json:

  "scripts": {
    "start": "parcel index.html --open
  },

Jetzt kann die Applikation über das Skript gestartet werden:

$ npm start

> elm-parcel-project@1.0.0 start /home/.../elm-parcel/elm-parcel-project
> parcel index.html

Server running at http://localhost:1234 
>  Built in 682ms.

Betrachtet man den Quelltext im Browser erkennt man, dass Parcel unsere Datei main.js mit einem Hash versehen und in index.html die entsprechende Anpassung vorgenommen hat. Anpassungen in unserer Applikation werden zudem wie erwartet automatisch im Browser nachgeladen.

Elm Assets verpacken

Anstatt einfach mit Javascript in den Dom-Node  zu schreiben wollen wir dort jetzt eine Elm-Applikation mounten.

Dazu schreiben wir die wohl bekannteste Applikation aller Zeiten, jetzt einfach in Elm – Hello World und zwar in src/Main.elm:

$ touch src/Main.elm
module Main exposing (main)

import Html

main = 
  Html.text "Hello World from Elm!"

(Main.elm)

In main.js können wir jetzt die Elm-Applikation importieren und auf dem div initialisieren:

import { Elm } from './Main.elm'

var element = document.getElementById('app');
Elm.Main.init({node: element});

Sobald diese Datei gespeichert wird, merkt Parcel, dass wir jetzt ein Elm-Asset laden wollen. Automatisch werden alle notwendigen Dependecies installiert und die Konfigurationsdatei elm.json initialisiert!

Damit haben wir eine simples aber robustes Projektsetup für die Entwicklung von Elm-Applikationen erstellt.

Production Build und Optimierungen

Zu den Merkmalen des kürzlich erfolgten Releases von Elm 0.19 sind die Optimierungen des Compilers, welche auf die funktionale Natur der Sprache zurückzuführen sind. Parcel beherzigt die entsprechenden Empfehlungen aus dem Elm Guide, wie aus dem entsprechenden Source Code unschwer zu erkennen ist.

Ein einfaches Skript in package.json zum Builden unserer Applikation genügt, um ein optimales Resultat zu erhalten:

  "scripts": {
    ...
    "build": "parcel build index.html"
  }
> parcel build index.html
>  Built in 2.31s.

dist/main.16091949.js     7.82 KB    1.76s
dist/main.0a44fb6b.map      405 B      2ms
dist/index.html              92 B    479ms

Fazit

Die ersten Gehversuche mit Parcel sind vielversprechend: innerhalb weniger Minuten ist ein simples aber robustes Projekt erstellt, welches sowohl für die Entwicklungsphase als auch für die Produktion bereits ansprechende bis optimale Resultate liefert – und dies ohne jegliche Konfiguration (ein Weg, den z.B. Webpack mit den neuesten Releases ebenfalls eingeschlagen hat).

Die Integration mit Elm ist sehr gut gelöst – der Entwickler muss keine zusätzlichen Dependencies  installieren oder zusätzliche Schritte im Projekt Setup durchführen, sobald ein Elm Asset eingebunden wird übernimmt Parcel die gesamte Arbeit.
Das gleiche gilt für all die anderen Assets, die von Parcel unterstützt werden: z.B. Sass, Less, Reason u.v.m

Das hier erstellte Template ist auf Github veröffentlicht und kann für eigene Projekte verwendet werden: https://github.com/mburri/elm-starter-parcel

Kommentare sind geschlossen.