dedlfix: Code dynamisch laden und speichern

Beitrag lesen

Tach!

Frage 1: Bestimmte (vergleichsweise komplexe) Komponenten wie eine Türklinke gibt es fertig in einer Datenbank. Speicherformat ist im Prinzip Javascriptcode[^1].

Code ist üblicherweise wiedeverwendbar, muss aber mitunter gewartet werden. Welchen Grund hat es, ihn so wartungsunfreundlich in einem DBMS abzulegen? Was siehst du in deinem Fall als Vorteil an, ihn nicht als Datei im Dateisystem abzulegen, wo sie recht einfach vom Webserver an den Client geliefert werden könnte?

Gibt es eine Möglichkeit den Code vom Server (also eine Javascriptfunktion) wieder als solche zu speichern?

Also solchen? Ausliefern als text/javascript und Einbinden mit dem script-Element. Auch anderweitige Code-Nachladebibliotheken gibt es im Javascript-Land.

Erster Lösungsansatz: Code vom Server landet als String in einer Variablen und wird dann per eval() interpretiert. Funktioniert, ich lese aber immer eval() = evil() = böse und das gefällt mir nicht…

Diese einfache Gleichung stimmt so nicht ganz. Nicht das eval() ist evil, sondern wenn du damit vom Nutzer beeinflussbaren Code ausführst. Diesebe Evilei hast du auch wenn du Code entgegennimmst und vom Server abholend in ein script-Element laden lässt. Code ist nicht vertrauenswürdiger, wenn er nicht durch eval() geschickt wird. Du musst - egal auf welchem Wege du ihn ausführen lässt - sicherstellen, dass in dem Code nichts ungewünschtes enthalten ist.

Gibt es noch andere Möglichkeiten, Javascriptcode nachzuladen, aber eben nicht gleich auszuführen?

Ihn in ein script-Element als Code laden. Funktionen werden nicht gleich ausgeführt, sondern erst beim Aufruf. (Und ich meine Funktionen als solche, keine Funktionsausdrücke oder gar IIFEs.)

Ich gehe übrigens die ganze Zeit davon aus, dass eine Webserver-Browser-Konstellation vorliegt. (Diese Informationen wären in der ersten Hälfte deines Postings sinnvoll gewesen.)

Oder ist es sinnvoller das Ergebnis vor/von eval() zu überprüfen?

Was soll da genau geprüft werden?

dedlfix.