Schlankere sgcWebSockets-Builds — eingebettete JS-Ressource ausschließen

· Funktionen

Eine seit Langem wiederkehrende Frage von Kunden, die ihre ausführbaren Dateien analysieren, lautet «Warum ist meine EXE nach dem Hinzufügen von sgcWebSockets gewachsen?». Ein Teil dieses Zuwachses stammt aus einer Ressourcendatei, die die sgcWebSockets-Runtime-Pakete standardmäßig einbetten: sgcResources.RES. Sie enthält das JavaScript-Client-Bundle, das ein sgcWebSockets-Server über HTTP an einen entfernten Browser ausliefern kann — eine Funktion, die die meisten Delphi- und C++Builder-Anwendungen nie nutzen.

Ab sgcWebSockets 2026.6 können Sie darauf verzichten. Das Setup der Source-Edition erhält auf der Optionsseite ein neues Kontrollkästchen Include Resources; wird es deaktiviert, hebt es eine neue Compiler-Direktive SGC_RESOURCES in sgcVer.inc vor der Kompilierung der Runtime-Pakete auf. Die Ressource wird schlicht nicht eingebunden — weder in die BPLs noch in die EXEs Ihrer Kunden.

Was entfernt wird

Die {$R}-Direktive im sgcWebSockets-Quellcode ist jetzt von {$IFDEF SGC_RESOURCES} umschlossen:

// sgcWebSocket_Protocol_Base_Server.pas
{$IFDEF SGC_RESOURCES}
{$R sgcResources.RES}      // sgcWebSockets JS client bundle
{$ENDIF}

Ist SGC_RESOURCES nicht definiert, hat der Linker nichts zum Einbetten. Die Ressource verschwindet schlicht aus jeder ausführbaren Datei, die gegen die Quelle gelinkt wird.

Wann diese Ressource nicht benötigt wird

Das eingebettete Bundle wird nur benötigt, wenn ein sgcWebSockets-Server den gebündelten JS-Client tatsächlich an einen entfernten Browser ausliefert. Das ist der Fall bei TsgcWSProtocol_JS_*-Komponenten oder einem beliebigen Server, der auf GET /sgcwebsockets.js mit dem gebündelten JavaScript antwortet.

Es wird nicht benötigt für:

So aktivieren Sie die Option

Der sauberste Weg führt über den Installer. Wenn Sie das Setup der sgcWebSockets-Source-Edition ausführen, klicken Sie auf die Schaltfläche Options und deaktivieren Sie den neuen Eintrag:

[ ] Include Resources

Der Installer schreibt die Zeile {$DEFINE SGC_RESOURCES} in sgcVer.inc in {.$DEFINE SGC_RESOURCES} um, bevor irgendein Paket kompiliert wird, sodass die Designtime- und Runtime-BPLs ohne das eingebettete Bundle erzeugt werden.

Wenn sgcWebSockets bereits installiert ist und Sie die Änderung lieber manuell vornehmen möchten, öffnen Sie <sgc-install-folder>\Source\sgcVer.inc und suchen die Zeile:

{$DEFINE SGC_RESOURCES} { RESOURCES }

und kommentieren die Klammer aus:

{.$DEFINE SGC_RESOURCES} { RESOURCES }

Bauen Sie anschließend die Runtime-/Designtime-Pakete und Ihre Anwendung neu. Rufen Sie in der IDE Project > Build All Projects auf oder führen Sie Ihr übliches Build-Skript aus.

Die Einsparung messen

Wenn Sie die Einsparung in Ihrem eigenen Projekt nachprüfen möchten, erzeugen Sie vor und nach der Änderung eine detaillierte Linker-Map. Öffnen Sie nach dem erneuten Build die erzeugte *.map-Datei und scrollen Sie zum Ressourcenabschnitt — sgcResources.RES sollte verschwunden sein. Auch die .text-Modulgröße von sgcWebSocket_Protocol_Base_Server schrumpft geringfügig, weil der Hilfscode, der die Ressource lädt, durch Dead-Code-Elimination entfernt wird.

Die exakte Einsparung hängt von Ihrer Build-Konfiguration und der verwendeten sgcWebSockets-Edition ab, doch bei einem typischen reinen Client-Build schrumpft die EXE spürbar. Kombinieren Sie diese Option mit den bestehenden Edition-Schaltern ({$UNDEF SGC_EDT_ENT}, um WebAuthn / HTTP2 / OAuth-Server zu entfernen, oder uses sgcWebSocket durch uses sgcWebSocket_Client in reinem Client-Code zu ersetzen), kann die Gesamtreduktion erheblich ausfallen.

Abwärtskompatibilität

Die Voreinstellung in sgcVer.inc bleibt {$DEFINE SGC_RESOURCES}, sodass bestehende Projekte weiterhin exakt wie zuvor kompilieren und laufen. Das neue Flag ist strikt opt-out: Es ändert sich nichts, sofern Sie die Ressource nicht ausdrücklich deaktivieren — entweder über das Installer-Kontrollkästchen oder durch eigenhändiges Bearbeiten von sgcVer.inc.

Wenn Sie SGC_RESOURCES deaktivieren und anschließend eine Servermethode aufrufen, die versucht, den gebündelten JS-Client auszuliefern (zum Beispiel ein Antwort-Handler eines TsgcWSProtocol_JS_*), erhalten Sie einen sauberen EResNotFound — ein eindeutiges Signal, dass Sie etwas abgeschaltet haben, das Sie tatsächlich bräuchten. Aktivieren Sie das Define einfach wieder und bauen Sie neu.

Verfügbarkeit

Die neue Option ist in sgcWebSockets 2026.6 enthalten, ausschließlich in den Installern der Source-Edition (Standard, Professional und Enterprise). Der Trial-Installer behält die eingebettete Ressource bei, damit die gebündelten JS-Client-Demos sofort funktionieren.

Kunden mit aktivem Abonnement können das neue Build im Kundenbereich herunterladen. Fragen oder Vorschläge für weitere Schalter zur Größenreduktion? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.