1UnitedPower: PHP Code in externer Datei

Beitrag lesen

Hakuna matata!

Aloha ;)

Einverstanden, aber Platzhalter in JavaScript-Code sind nicht sinnvoll. Es fängt damit an, dass man keine Modultests für solche generischen Skript-Bausteine entwickeln kann. [...] Syntax-Highlighting, Precompiler (minfiy, browserify) und Dependency-Injectors. Und auch andere Werkzeuge, wie Modul-Loader (require.js) arbeiten nicht nahtlos mit JS-Templates zusammen. Kurz und bündig: das gesamte JavaScript-Ökosystem wird dir überm' Kopf zusammenbrechen.

Tatsächlich?

Syntax-Highlighting und Precompiler sollten mit Platzhaltern genauso arbeiten, da valides JS erzeugt wird […]

Wird es nicht. Gehen wir von folgendem Template aus:
var foo = '<?= $foo ?>';
Und im PHP:
$foo = "arrr'rrrk";
Das fertig gerenderte Template, sähe dann so aus:
var foo = 'arrr'rrrk';

Man könnte jetzt hingehen und das Anführungszeichen maskieren, die korrekte Ausgabe wäre dann:
var foo = 'arrr\'rrrk';

So, aber was wenn nun die Template-Variable nicht von einfachen, sondern von doppelten Anführungszeichen umschlossen wird? Das Ergebnis nach unserer Anpassung von gerade, wäre diesmal zwar kein Syntax-Fehler, aber auch nicht die Zeichenkette, die wir erwarten würden:

var foo = "arrr\'rrrk";

Für diese konstruierten Fall, ließe sich wieder ein Lösung finden, aber um es kurz zu machen: eine allgemine Lösung für die Problemklasse erhält man nur, wenn man der Template-Engine gestattet die umschließenden String-Begrenzer selbst zu generieren. Also in etwa so:

var foo = <?= json_encode( $foo ); ?>

json_encode eignet sich zum Glück hervorragend, um JavaScript-Strings zu maskieren. Das Problem an dieser Stelle ist aber eben, dass der Platzhalter nun nicht mehr von JavaScript-String-Begrenzern umgeben wird, ein JavaScript-Parser (1) würde hier also auf die öffnende Spitze Klammer stoßen und sich dann verabschieden. Eben habe ich von static Analysis gesprochen, das ist beschreibt die Fähigkeit Aussagen über Code zu treffen, ohne ihn ausführen zu müssen. Das erfordert aber Syntax-Parsing, und eine ganze Reihe Werkzeuge, die ich eben auch schon genannt habe, hängt davon ab und wie wir gerade gesehen haben können wir kontextgerechte Maskierung und Syntax-Parsing nicht gleichzeitig haben. hottis etwas andere Syntax für Platzhaler, kann das übrigens auch nicht, sie hat mit genau dem gleichen Problem zu kämpfen.

  1. Ein JavaScript-Parser ist kein Interpreter, der Parser sorgt erstmal nur dafür den JavaScript-Code in einen abstrakten Syntaxbaum zu übersetzen. Das habe ich in meinen Anfangstagen als Programmierer noch nicht gewusst, und konnte mich sehr verwirren. Aus diesem Grund die Fußnote für Entwickler, denen es vielleicht so ähnlich geht.
--
“All right, then, I'll go to hell.” – Huck Finn