Una domanda ricorrente da parte dei clienti che analizzano i propri eseguibili è «perché il mio EXE è cresciuto dopo aver aggiunto sgcWebSockets?». Parte di quella crescita deriva da un file di risorse che i pacchetti runtime di sgcWebSockets incorporano per impostazione predefinita: sgcResources.RES. Contiene il bundle del client JavaScript che un server sgcWebSockets può distribuire tramite HTTP a un browser remoto — una funzionalità che la maggior parte delle applicazioni Delphi e C++Builder non usa mai.
A partire da sgcWebSockets 2026.6, puoi escluderlo. Il Setup dell'edizione sorgente acquisisce una nuova casella di controllo Include Resources nella pagina Opzioni; deselezionandola si annulla la definizione di una nuova direttiva di compilazione SGC_RESOURCES in sgcVer.inc prima che i pacchetti runtime vengano compilati. La risorsa semplicemente non viene mai collegata — né nelle BPL, né negli EXE dei tuoi clienti.
Cosa viene rimosso
La direttiva {$R} nel codice sorgente di sgcWebSockets è ora racchiusa in {$IFDEF SGC_RESOURCES}:
// sgcWebSocket_Protocol_Base_Server.pas
{$IFDEF SGC_RESOURCES}
{$R sgcResources.RES} // sgcWebSockets JS client bundle
{$ENDIF}
Quando SGC_RESOURCES non è definito, il linker non ha nulla da incorporare. La risorsa scompare semplicemente da ogni eseguibile che effettua il link al codice sorgente.
Quando non hai bisogno di questa risorsa
Il bundle incorporato è necessario solo quando un server sgcWebSockets distribuisce effettivamente il client JS in bundle a un browser remoto. Ciò avviene con i componenti TsgcWSProtocol_JS_*, o con qualsiasi server che risponda a GET /sgcwebsockets.js restituendo il JavaScript in bundle.
Non serve per:
- Client WebSocket Delphi / C++Builder — i dati vengono consumati in codice nativo, mai in un browser.
- Server da nativo a nativo — server i cui client sono anch'essi applicazioni Delphi / C++Builder.
- Back-end WebSocket che servono JS personalizzato — se distribuisci il tuo client JavaScript (il tuo bundler, il tuo CDN), quello incorporato è peso morto.
- Server MQTT, AMQP, STOMP, WAMP, MCP e server di soli protocolli — nessuno di essi usa il client JS in bundle.
Come abilitarlo
Il percorso più pulito è l'installer. Quando esegui il setup dell'edizione sorgente di sgcWebSockets, premi il pulsante Options e deseleziona la nuova voce:
[ ] Include Resources
L'installer riscriverà la riga {$DEFINE SGC_RESOURCES} in sgcVer.inc trasformandola in {.$DEFINE SGC_RESOURCES} prima di compilare qualsiasi pacchetto, in modo che le BPL design-time e runtime vengano prodotte senza il bundle incorporato.
Se hai già sgcWebSockets installato e preferisci apportare la modifica manualmente, apri <sgc-install-folder>\Source\sgcVer.inc, individua la riga:
{$DEFINE SGC_RESOURCES} { RESOURCES }
e commenta la parentesi graffa:
{.$DEFINE SGC_RESOURCES} { RESOURCES }
Poi ricompila i pacchetti runtime / design-time e la tua applicazione. Vai su Project > Build All Projects nell'IDE, oppure esegui il tuo solito script di build.
Misurare il risparmio
Se vuoi verificare il risparmio sul tuo progetto, genera una mappa del linker dettagliata prima e dopo la modifica. Dopo aver ricompilato, apri il file *.map generato e scorri fino alla sezione delle risorse — sgcResources.RES dovrebbe essere scomparso. Anche la dimensione del modulo .text per sgcWebSocket_Protocol_Base_Server diminuisce leggermente, perché il codice di supporto che carica la risorsa viene eliminato come codice morto.
Il risparmio esatto dipende dalla tua configurazione di build e dall'edizione di sgcWebSockets che usi, ma in una tipica build client-only l'EXE si riduce in modo evidente. Se combini questa opzione con gli switch a livello di edizione già esistenti ({$UNDEF SGC_EDT_ENT} per eliminare WebAuthn / HTTP2 / OAuth-server, o sostituendo uses sgcWebSocket con uses sgcWebSocket_Client nel codice client-only), la riduzione totale può essere considerevole.
Compatibilità con le versioni precedenti
L'impostazione predefinita in sgcVer.inc rimane {$DEFINE SGC_RESOURCES}, quindi i progetti esistenti continuano a compilare e funzionare esattamente come prima. Il nuovo flag è rigorosamente opt-out: nulla cambia a meno che tu non disabiliti esplicitamente la risorsa, sia tramite la casella di controllo dell'installer sia modificando sgcVer.inc da solo.
Se disabiliti SGC_RESOURCES e poi chiami un metodo del server che tenta di servire il client JS in bundle (per esempio, un gestore di risposta TsgcWSProtocol_JS_*), otterrai un chiaro EResNotFound — un segnale evidente che hai disattivato qualcosa di cui avevi effettivamente bisogno. Basta riattivare la define e ricompilare.
Disponibilità
La nuova opzione è inclusa in sgcWebSockets 2026.6, solo negli installer dell'edizione sorgente (Standard, Professional ed Enterprise). L'installer Trial mantiene la risorsa incorporata in modo che le demo del client JS in bundle funzionino senza configurazioni aggiuntive.
I clienti con un abbonamento attivo possono scaricare la nuova build dall'area clienti. Domande o suggerimenti per ulteriori switch di riduzione delle dimensioni? Contattaci — riceverai una risposta dalle persone che hanno scritto il codice.
