{ "version": "2.0", "xmlns": { "atom": "http://www.w3.org/2005/Atom", "content": "http://purl.org/rss/1.0/modules/content/", "georss": "http://www.georss.org/georss", "gml": "http://www.opengis.net/gml" }, "channel": { "title": "fboës - Der Blog | Artikel mit dem Tag \"NodeJS\"", "link": "https://journal.3960.org/", "description": "Programmierung, Luft- & Raumfahrt, Kurioses: Der Blog von und mit Frank Boës.", "language": "de-DE", "copyright": "© 2008-2023 Creative Commons BY", "atom_link": { "href": "https://journal.3960.org/tagged/nodejs/rss.json", "rel": "self", "type": "application/rss+json" }, "lastBuildDate": "Fri, 22 Mar 2024 18:00:20 +0100", "atom_updated": "2024-03-22T18:00:20+01:00", "generator": "blogophon", "image": { "url": "https://cdn.3960.org/images/tile-128x128.png", "title": "fboës - Der Blog", "link": "https://journal.3960.org/" }, "items": [ { "title": "PHP in Javascript übersetzen", "description": "
Schon vor längerer Zeit hatte ich mir darüber Gedanken gemacht, wie man PHP-Klassen in Javascript-Objekte übersetzt. Jetzt habe ich einen kleinen Helfer bauen können, der einen Großteil der Arbeit automatisiert.
", "content_encoded": "Schon vor längerer Zeit hatte ich mir darüber Gedanken gemacht, wie man PHP-Klassen in Javascript-Objekte übersetzt. Jetzt habe ich einen kleinen Helfer bauen können, der einen Großteil der Arbeit automatisiert.
\n\nWie man am Beispiel eines kleinen Vigenère-Listings sieht, sind die Strukturen von PHP-Klassen und Javascript-Objekten eigentlich sehr gleichartig. Mit der folgenden Javascript kann man einen Großteil der Transformation durchführen, und muss danach nur noch einige Details anpassen.
\n/**\n * Afterwards you will need to:\n * - add `var` in front of uninitialized variables\n * - move default values for function parameters into function body like `param = param || 'default';`\n * - add `,` after every object property (variables & methods)\n * - replace PHP functions\n * @param {String} php [description]\n * @return {String} [description]\n */\nvar transformPhpToJs = function(php) {\n return php\n .replace(/<\\?php\\s*/g, '')\n .replace(/\\?>\\s*/g, '')\n .replace(/(protected|public|private|const) (\\S+)\\s?=/g, '$2 :')\n .replace(/(protected|public|private|const) /g, '')\n .replace(/(function) (\\S+)\\s?/g, '$2: $1')\n .replace(/(class) (\\S+)\\s?/g, 'var $2 = ')\n .replace(/\\$/g, '')\n .replace(/SELF::/g, 'this.')\n .replace(/->/g, '.')\n .replace(/array\\(([\\s\\S]*?)\\);/g, '[$1];')\n .replace(/=>/g, ':')\n .replace(/empty\\((.+?)\\)/g, '!$1')\n .replace(/preg_replace\\(['"](.+?)['"],(.+?),\\s?(.+?)\\s?\\)/g, '$3.replace(/$1/g,$2)')\n .replace(/preg_match\\(['"](.+?)['"],\\s?(.+?)\\s?\\)/g, '$2.match(/$1/)')\n ;\n}\n
\nDiese Funktion könnt ihr z.B. in die F12
-Konsole von eurem Browser eingeben, und danach euren PHP-Quelltext im Browser übersetzen lassen. Folgender Aufruf gibt euch das transformierte PHP zurück:
transformPhpToJs(`INSERT YOUR PHP HERE`);\n
\nGeht dafür wie folgt vor:
\nF12
eure Entwicklerkonsole.Enter
.Natürlich muss das Ergebnis noch nachbearbeitet werden, aber für die meisten Fälle erledigt es zumindest die groben Arbeiten. Danach könnt ihr z.B. daran gehen die richtige NodeJS-Modul-Struktur einzubauen.
\nUpdate: Mathias hat mich auf Locutus aufmerksam gemacht:
\n\nLocutus is a project that seeks to assimilate other languages’ standard libraries to JavaScript.
Hier findet ihr viele PHP-Funktionen als Javascript-Module umgesetzt. Die ganze Bibliothek ist zwar mit Augenzwinkern zu verstehen, für schnelle Erfolgserlebnisse eignet sie sich aber alle Mal.
", "link": "https://journal.3960.org/posts/2017-08-18-php-javascript-uebersetzen/", "pubDate": "Fri, 18 Aug 2017 19:02:00 +0200", "atom_published": "2017-08-18T19:02:00+02:00", "atom_updated": "2020-01-31T16:55:40+01:00", "guid": "user/posts/2017-08-18-php-javascript-uebersetzen.md", "author": "info@3960.org (Frank Boës)", "categories": [ "PHP", "Javascript", "Programmierung", "NodeJS", "Für Tumblr" ] }, { "title": "Backreferences in regulären Ausdrücken", "description": "Niemand auf diesem Planeten wird jemals ernsthaft behaupten, ein Meister der regulären Ausdrücke zu sein. Selbst nach jahrelangem Einsatz findet man immer wieder neue Techniken. Meine jüngste Erkenntnis: Backreferences in regulären Ausdrücken.
", "content_encoded": "Niemand auf diesem Planeten wird jemals ernsthaft behaupten, ein Meister der regulären Ausdrücke zu sein. Selbst nach jahrelangem Einsatz findet man immer wieder neue Techniken. Meine jüngste Erkenntnis: Backreferences in regulären Ausdrücken.
\n\nIm Blogophon (der Blog-Software zu dieser Seite) gibt es eine größere Bibliothek, die HTML in noch viel schöneres HTML verwandeln soll. Dazu wiederum werden Unmengen an regulären Ausdrücken verwendet.
\nEin spezieller Ausdruck ist dafür zuständig, alle Vorkommen von „…“
und ‚…‘
in ein <kbd>
-Tag einzuwickeln. Der erste Versuch sah wie folgt aus:
.replace(/("|'|')(.*?)("|'|')/g, '<kbd>$0</kbd>')\n
\nDummerweise ist der Ausdruck falsch, denn so findet er auch „…‚
und ‘…“
. Die Lösung für dieses Dilemma sind dann separate Ersetzungen:
.replace(/(")(.*?)(")/g, '<kbd>$0</kbd>')\n.replace(/(')(.*?)(')/g, '<kbd>$0</kbd>')\n.replace(/(')(.*?)(')/g, '<kbd>$0</kbd>')\n
\nWie man unschwer erkennt, ist das ein deutlicher Verstoß gegen das DRY-Prinzip, aber augenscheinlich notwendig, um eine Ersetzung nur durchzuführen, wenn Anfangs- und Endzeichen identisch sind.
\nBeim Lesen des Buches „Secrets of the Javascript Ninja“ von John Resig, Bear Bibeault und Josip Maras bin ich neben vielen anderen erhellenden Kapiteln auch auf das Kapitel über reguläre Ausdrücke gestoßen. Und hier werden im Nebensatz Backreferences erläutert.
\nMit einer Backreference kann man exakt den Inhalt einer einmal in einem regulären Ausdruck gefundenen Gruppe nochmals finden. Um z.B. den Inhalt von Gruppe 1 nochmal zu finden, verwendet man \\1
, von Gruppe zwei dementsprechend \\2
.
Das obige Beispiel ist damit korrekt:
\n.replace(/("|'|')(.*?)(\\1)/g, '<kbd>$0</kbd>')\n
",
"link": "https://journal.3960.org/posts/backreferences-regulaeren-ausdruecken/",
"pubDate": "Fri, 10 Feb 2017 19:32:09 +0100",
"atom_published": "2017-02-10T19:32:09+01:00",
"atom_updated": "2017-10-05T10:30:09+02:00",
"guid": "user/posts/backreferences-regulaeren-ausdruecken.md",
"author": "info@3960.org (Frank Boës)",
"categories": [
"Programmierung",
"Javascript",
"Für Tumblr",
"NodeJs",
"Performance"
]
},
{
"title": "Node.js Pattern: Das Modul",
"description": "Nach mehrmonatigen Experimentieren habe ich für mich endlich das gelungene Pattern gefunden, mit dem ich in Node.js meine Module baue.
", "content_encoded": "Nach mehrmonatigen Experimentieren habe ich für mich endlich das gelungene Pattern gefunden, mit dem ich in Node.js meine Module baue.
\n\n// module-name.js\n\n'use strict';\n\nconst someNodeModule = require('some-node-module');\nconst someOwnModule = require('./some-own-module');\n\n/**\n * [modulName description]\n * @constructor\n */\nconst modulName = function (config) {\n const external = {};\n const internal = {};\n\n /**\n * [someVariable description]\n * @type {[type]}\n */\n external.someVariable = null;\n\n /**\n * [someOtherVariable description]\n * @type {[type]}\n */\n internal.someOtherVariable = null;\n\n /**\n * [someFunction description]\n * @params {[type]} [name] [description]\n * @return {[type]} [description]\n */\n external.someFunction = function () {\n };\n\n /**\n * [someOtherFunction description]\n * @params {[type]} [name] [description]\n * @return {[type]} [description]\n */\n internal.someOtherFunction = function () {\n };\n\n return external;\n};\n\nmodule.exports = modulName;\n
\nDer Aufruf ist dann ganz einfach:
\n\nconst moduleName = require('./moduleName');\n\nmoduleName({});\n
\nEine Erweiterung des Objekts um neue Eigenschaften geht ebenfalls flott von der Hand:
\n// some-other-module-name.js\n\n'use strict';\n\nconst moduleName = require('./moduleName');\n\n/**\n * [someOtherModuleName description]\n * @constructor\n */\nconst someOtherModuleName = function (config) {\n const external = moduleName(config);\n const internal = {};\n\n // Add extra variables and methods here\n\n return external;\n};\n\nmodule.exports = modulName;\n
\nBei dieser Konstruktion sind folgende Punkte erfüllt:
\npublic
und private
Variablen und Methoden. Diese sind hier als external
und internal
bezeichnet, da public
und private
reservierte Wörter sind.new
.Natürlich gibt es noch unzählige andere Methoden. Aber bei dieser Methode finde ich die Mischung aus Übersichtlichkeit und Erweiterbarkeit für meine Belange am Besten.
\nUpdate: Für ECMAScript 6 wurden alle Variablendeklarationen mit const
durchgeführt. Wenn die Deklarationen abwärtskompatibel sein sollen, können diese mit var
gemacht werden.
Ein kleiner Streifzug durch die Fülle an Anwendungsgebieten, in denen man inzwischen mit Javascript bzw. Node.js entwickeln kann:
", "content_encoded": "Ein kleiner Streifzug durch die Fülle an Anwendungsgebieten, in denen man inzwischen mit Javascript bzw. Node.js entwickeln kann:
\n\nGleichzeitig wächst das Node.js/Javascript-Ökosystem NPM mit einer rasenden Geschwindigkeit, so dass man für eine eigene Applikation sehr einfach die Bibliotheken vieler anderer Programmierer sehr einfach nutzen kann. Diese Abhängigkeit ist ab und zu auch gefährlich, doch generell kann man mit Node.js sehr schnell sehr gut programmieren.
", "link": "https://journal.3960.org/posts/was-man-alles-mit-node-js-machen-kann/", "pubDate": "Fri, 09 Sep 2016 18:48:01 +0200", "atom_published": "2016-09-09T18:48:01+02:00", "atom_updated": "2017-10-05T10:28:52+02:00", "guid": "user/posts/was-man-alles-mit-node-js-machen-kann.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Anleitung", "NodeJs", "Programmierung" ] }, { "title": "Node.js Pattern: Promise()", "description": "Gerade für PHP-Programmierer ist die eventbasierte Programmierung in Javascript bzw. node.js eine Umstellung im Denken. Dabei sind Events die besondere Stärke, wenn man sie denn richtig anfasst.
\nDabei „horcht“ ein Stückchen Programmierung mittels eines Event-Listeners, ob ein bestimmtes Event ausgelöst wird. Wenn man das Javascript von Browsern noch kennt, sind Event-Listener eigentlich schon bekannt. Zumindest in node.js gibt es aber eine deutlich kompaktere Schreibweise für bestimmte Vorgänge.
", "content_encoded": "Gerade für PHP-Programmierer ist die eventbasierte Programmierung in Javascript bzw. node.js eine Umstellung im Denken. Dabei sind Events die besondere Stärke, wenn man sie denn richtig anfasst.
\nDabei „horcht“ ein Stückchen Programmierung mittels eines Event-Listeners, ob ein bestimmtes Event ausgelöst wird. Wenn man das Javascript von Browsern noch kennt, sind Event-Listener eigentlich schon bekannt. Zumindest in node.js gibt es aber eine deutlich kompaktere Schreibweise für bestimmte Vorgänge.
\n\nMein Anwendungsfall: Ich warte auf eine bestimmte Anzahl von Events, und löse mein eigenes Event aus, wenn alle meine Sub-Events erfolgreich abgeschlossen haben. Bisher sah das so aus (schon mit der Kraft von Array.forEach
):
var files = ['a.txt','b.txt','c.txt'];\n var processed = 0;\n\n var checkProcessed = function(err) {\n if (err) {\n console.log("Error!");\n }\n if (++processed === files.length) {\n console.log("Done!");\n }\n };\n\n files.forEach(function(file) {\n fs.writeFile(file, "Test test test", checkProcessed);\n });\n
\nSeit geraumer Zeit bzw. Node 4.x gibt es nämlich Promise
. Der eigentlich Aufbau eines Promise wird an vielen Stellen hinlänglich erklärt. Zusammen mit Array.map
erlaubt das folgende Konstruktion:
var files = ['a.txt','b.txt','c.txt'];\n\n // Making promises\n var promises = files.map(function(file) {\n return new Promise (\n function (resolve, reject) {\n fs.writeFile(file, "Test test test", function(err) {\n if (err) {\n reject;\n } else {\n resolve;\n }\n });\n }\n );\n });\n\n // Checking promises\n Promise\n .all(promises)\n .then(function() {\n console.log("Done!");\n })\n .catch(function(err) {\n console.log("Error!"); \n })\n ;\n};\n
\nNoch einfacher wird dieses Beispiel, wenn die Methode, auf die man wartet, nicht ein Event, sondern direkt ein Promise zurückgibt:
\n var fsp = require('fs-promise');\n var files = ['a.txt','b.txt','c.txt'];\n\n // Making promises\n var promises = files.map(function(file) {\n return fsp.writeFile(file, "Test test test");\n });\n\n // Checking promises\n Promise\n .all(promises)\n .then(function() {\n console.log("Done!");\n })\n .catch(function(err) {\n console.log("Error!"); \n })\n ;\n};\n
\nViele node.js-Bibliotheken, die vormals mit Events funktionierten, gibt es inzwischen auch als Variante mit Promises. So existiert z.B. das Projekt „Modernize node.js“, dass viele Events in Promises umwandelt.
", "link": "https://journal.3960.org/posts/nodejs-pattern-promise/", "pubDate": "Sun, 28 Aug 2016 19:05:24 +0200", "atom_published": "2016-08-28T19:05:24+02:00", "atom_updated": "2020-01-31T16:53:25+01:00", "guid": "user/posts/nodejs-pattern-promise.md", "author": "info@3960.org (Frank Boës)", "categories": [ "NodeJs", "Anleitung", "Javascript", "Programmierung" ] }, { "title": "Node.js Pattern: Array.map()", "description": "Wenn man jahrelang Javascript nur für Browser programmiert hat (bzw. für ältere Browser), beginnt man unweigerlich in node.js mit den selben Konstruktionen. Inzwischen gibt es aber eine Handvoll Methoden, die das Leben deutlich einfacher machen – und das nicht nur in node.js, sondern auch in neueren Browsern.
\nHeute: Wie erzeugt man aus einem Array ein neues Array?
", "content_encoded": "Wenn man jahrelang Javascript nur für Browser programmiert hat (bzw. für ältere Browser), beginnt man unweigerlich in node.js mit den selben Konstruktionen. Inzwischen gibt es aber eine Handvoll Methoden, die das Leben deutlich einfacher machen – und das nicht nur in node.js, sondern auch in neueren Browsern.
\nHeute: Wie erzeugt man aus einem Array ein neues Array?
\n\nVormals sah das Erzeugen eines neuen Arrays aus einem bereits existierenden Array wie folgt aus:
\n\nvar a = ['a','b','c'];\nvar b = [];\n\nfor (var i = 0; i < a.length; i ++) {\n var el = a[i];\n // do something with el\n b.push(el);\n}\n
\nDie Methode Array.map()
erlaubt folgende Konstruktion:
var a = ['a','b','c'];\n\nvar b = a.map(function(el, i) {\n // do something with el\n return el;\n});\n
\nDamit eigenet sich die Funktion z.B. zum Filtern oder Umformen von Arrays.
\nmap
ist Bestandteil von ECMAScript 5.1 bzw. Javascript 1.6. Damit ist Array.map
eigentlich in jedem Browser verfügbar (bis auf den Internet Explorer 8 und ältere).
Wenn man jahrelang Javascript nur für Browser programmiert hat (bzw. für ältere Browser), beginnt man unweigerlich in node.js mit den selben Konstruktionen. Inzwischen gibt es aber eine Handvoll Methoden, die das Leben deutlich einfacher machen – und das nicht nur in node.js, sondern auch in neueren Browsern.
\nHeute: Wie durchläuft man am Einfachsten ein komplettes Array?
", "content_encoded": "Wenn man jahrelang Javascript nur für Browser programmiert hat (bzw. für ältere Browser), beginnt man unweigerlich in node.js mit den selben Konstruktionen. Inzwischen gibt es aber eine Handvoll Methoden, die das Leben deutlich einfacher machen – und das nicht nur in node.js, sondern auch in neueren Browsern.
\nHeute: Wie durchläuft man am Einfachsten ein komplettes Array?
\n\nVormals sah das Durchlaufen eines Array wie folgt aus:
\n\nvar a = ['a','b','c'];\n\nfor (var i = 0; i < a.length; i ++) {\n var el = a[i];\n // do something with el\n}\n
\nDie Methode Array.forEach()
erlaubt folgende Konstruktion:
var a = ['a','b','c'];\n\na.forEach(function(el, i) {\n // do something with el\n});\n
\nforEach
ist Bestandteil von ECMAScript 5.1 bzw. Javascript 1.6. Damit ist Array.forEach
eigentlich in jedem Browser verfügbar (bis auf den Internet Explorer 8 und ältere).
In vielen meiner kleinen und mittelgroßen Node.js-Projekten benutze ich immer wieder ein und dieselben Node-Packages. Zuletzt fiel mir bei meinem Static Site Generator Blogophon auf, dass es – zumindest für mich – eine Liste an unverzichbaren Paketen gibt:
", "content_encoded": "In vielen meiner kleinen und mittelgroßen Node.js-Projekten benutze ich immer wieder ein und dieselben Node-Packages. Zuletzt fiel mir bei meinem Static Site Generator Blogophon auf, dass es – zumindest für mich – eine Liste an unverzichbaren Paketen gibt:
\n\nPromise
, bzw. bringt ein Polyfill mit für Umgebungen, die noch kein Promise
nativ anbieten.fs-extra
ist eine Erweiterung für fs
, die neben den üblichen Dateikomandos zusätzliche Befehle wie z.B. rekursives Löschen oder Anlegen von Verzeichnissen mitbringt. fs-extra-promise
erweitert dann nochmals das Paket um Promise
(s.o.).glob
, mit der man Dateien schnell über ein Muster suchen kann.Zusammengefasst in einer Zeile werden diese Pakete wie folgt installiert:
\nnpm install chalk dateformat fs-extra-promise glob inquirer promise --save\n
",
"link": "https://journal.3960.org/posts/meine-wichtigsten-node-packages/",
"pubDate": "Sun, 14 Aug 2016 08:24:20 +0200",
"atom_published": "2016-08-14T08:24:20+02:00",
"atom_updated": "2018-12-03T09:19:07+01:00",
"guid": "user/posts/meine-wichtigsten-node-packages.md",
"author": "info@3960.org (Frank Boës)",
"categories": [
"NodeJs",
"Programmierung",
"Anleitung"
]
},
{
"title": "Wie man als PHP-Entwickler bei Node.js einsteigt",
"description": "Node.js und PHP unterschieden sich hinsichtlich ihrer Philosophie erheblich. Aber da jeder PHP-Entwickler auch Javascript beherrscht, ist ein Sprung zu Node.js gar nicht so schwer.
\nDa ich mich auch erst seit kurzer Zeit mit Node.js beschäftige, liste ich hier die größten Unterschiede zu PHP auf, die mir ins Auge gefallen sind.
", "content_encoded": "Node.js und PHP unterschieden sich hinsichtlich ihrer Philosophie erheblich. Aber da jeder PHP-Entwickler auch Javascript beherrscht, ist ein Sprung zu Node.js gar nicht so schwer.
\nDa ich mich auch erst seit kurzer Zeit mit Node.js beschäftige, liste ich hier die größten Unterschiede zu PHP auf, die mir ins Auge gefallen sind.
\n\nNode.js kann ähnliche Aufgaben wie PHP abdecken… aber auch deutlich mehr. So kann man damit neben Webapplikationen (z.B. via Express) auch auf allen Betriebssystemen funktionsfähige Kommandozeilen-Tools bis hin zu komplett eigenständigen Desktop-Applikationen schreiben.
\nNicht zuletzt ist Node.js der Motor hinter Projekten wie Gulp und Grunt, die bei der Web-Entwicklung wichtige Dienste leisten. Wer Node.js beherrscht, kann für beide Task-Runner eigene Plugins schreiben.
\nNicht zuletzt kann man Techniken aus Node.js auch in „normalen“ Browser-Javascript einsetzen, um z.B. eine bessere Modularisierung zu erreichen.
\nUm Node.js betreiben zu können, muss man wenig überraschend Node.js installieren. Dazu lädt man Node.js von der zugehörigen Seite herunter und installiert es.
\nBestandteil des Pakets ist der Node Package Manager, mit dem man auf eine Vielzahl von Paketen zugreifen kann. Anders als bei PHP sind viele sehr Funktionen wie z.B. Datenbank-APIs, Dateisystem-APIs o.ä. nicht von vorne herein bei Node dabei, sondern können projektweise als kleines Paket nachinstalliert werden.
\nNach der Installation kann mittels node
auf der Kommandozeile der Node-Interpreter gestartet werden. Mit node DATEINAME
kann eine Node.js-Datei ausgeführt werden.
Mittels npm
wird der Node Package Manager aufgerufen. Mittels npm install PACKAGENAME --save
wird ein Package installiert. Ein wichtiges Paket sollte mit npm install -g jshint
gleich global installiert werden: JSHint findet gefährliche und unschöne Javascript-Konstruktionen in eurem Code und macht euch generell zu einem besseren Programmierer.
Bei Node.js kommt Javascript als Sprache zum Einsatz. Um Javascript als solches richtig zu benutzen, empfiehlt es sich, das Buch „Javascript – The Good Parts“ von Douglas Crockford zu lesen (und zu verstehen). Folgende Kern-Ideen sollten für PHP-Programmierer gewöhnungsbedürftig sein:
\nnpm
erst installieren muss. Nach einer kurzen NPM oder Google-Suche findet man einen Package-Namen, den man einfach via npm install PACKAGENAME --save
installiert.require
wird immer an eine Variable gebunden; die Funktionalität aus der per require
eingebundenen Datei steht dann unter dem betreffenden Variablennamen bereit.Ein kleines Beispiel:
\nnpm install glob --save-dev # Installiert das Paket `glob`\n
\nIm Javascript wird dies dann wie folgt verwendet:
\nvar glob = require("glob");\n\nglob(…){…}\n
\nnpm init
könnt ihr die ersten Details eures Projekts erläutern. Das erzeugt gleichzeitig die Datei package.json
, in der sich später zentrale Einstellungen eures Projekts wiederfinden. U.a. wird in dieser Datei festgehalten, welche Node-Packages installiert werden sollen.blogophon-index.js
anlegen, in der ihr fröhlich herumcoden könnt.node blogophon-index.js
kann man die Datei danach ausführen..gitignore
-Datei anlegen, in der ihr das Verzeichnis node_modules
eintragt. In diesem Verzeichnis werden nämlich die in der package.json
vermerkten Packages installiert.Für Web-Entwickler ist der Einstieg leicht, da Javascript sowieso in Browsern verwendet wird. Zumindest eine kurze Stippvisite erweitert den Horizont ungemein. Außerdem werden Kernideen von Node.js auch in wichtigen Javascript-Frameworks wie jQuery, Angular oder React eingesetzt.
", "link": "https://journal.3960.org/posts/wie-man-als-php-entwickler-bei-node-js-einsteigt/", "pubDate": "Sat, 13 Aug 2016 19:14:36 +0200", "atom_published": "2016-08-13T19:14:36+02:00", "atom_updated": "2017-10-05T10:29:16+02:00", "guid": "user/posts/wie-man-als-php-entwickler-bei-node-js-einsteigt.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Programmierung", "Anleitung", "NodeJs" ] }, { "title": "Static Site Generator als neuer Blog", "description": "Da meine alte Blog-Software nicht mehr auf meinem Server funktioniert, habe ich mal etwas neues probiert: Ich habe einen Static Site Generator aufgesetzt.
", "content_encoded": "Da meine alte Blog-Software nicht mehr auf meinem Server funktioniert, habe ich mal etwas neues probiert: Ich habe einen Static Site Generator aufgesetzt.
\n\nWar ich vor wenigen Monaten noch voller Begeisterung über Grav, so haben die PHP-Anforderungen der neuen Version es mir leider unmöglich gemacht, die Software noch länger zu betreiben. Netterweise hat Grav aber alle Blog-Artikel als Markdown-Artikel gespeichert, die eine sehr gute Grundlage sind, um darauf seinen eigenen Static Site Generator zu bauen.
\nEigentlich macht es keinen Sinn, seinen eigenen Generator zu bauen, da genug gut programmierte Generatoren kostenlos zur Verfügung stehen. Aber um ehrlich zu sein, gab es doch gute Gründe:
\nDie Vorteile eines Static Site Generators lagen schon länger auf der Hand:
\nMein Ansatz für einen Static Site Generator war ganz einfach:
\ngulp
aktiv ist, passiert dies automatisch beim Speichern der Markdown-Datei.Und andererseits denke ich daran herum, die HTML-Dateien via Dropbox auf den Server kopieren zu lassen.
", "link": "https://journal.3960.org/posts/static-site-generator/", "pubDate": "Mon, 01 Aug 2016 20:00:00 +0200", "atom_published": "2016-08-01T20:00:00+02:00", "atom_updated": "2017-10-05T10:30:29+02:00", "guid": "user/posts/static-site-generator.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Programmierung", "NodeJs", "Blog", "CMS" ] } ] } }