Od dawna powtarzające się pytanie klientów profilujących swoje pliki wykonywalne brzmi: «dlaczego mój EXE urósł po dodaniu sgcWebSockets?». Część tego przyrostu pochodzi z pliku zasobów, który pakiety runtime sgcWebSockets domyślnie osadzają: sgcResources.RES. Zawiera on pakiet klienta JavaScript, który serwer sgcWebSockets może dostarczyć przez HTTP do zdalnej przeglądarki — funkcja, z której większość aplikacji Delphi i C++Builder nigdy nie korzysta.
Od wersji sgcWebSockets 2026.6 możesz z tego zrezygnować. Instalator edycji źródłowej zyskuje nowe pole wyboru Include Resources na stronie Options; jego odznaczenie usuwa definicję nowej dyrektywy kompilatora SGC_RESOURCES w sgcVer.inc przed kompilacją pakietów runtime. Zasób po prostu nigdy nie jest dołączany — ani do BPL, ani do EXE Twoich klientów.
Co jest usuwane
Dyrektywa {$R} w źródłach sgcWebSockets jest teraz opakowana w {$IFDEF SGC_RESOURCES}:
// sgcWebSocket_Protocol_Base_Server.pas
{$IFDEF SGC_RESOURCES}
{$R sgcResources.RES} // sgcWebSockets JS client bundle
{$ENDIF}
Gdy SGC_RESOURCES jest niezdefiniowane, linker nie ma nic do osadzenia. Zasób po prostu znika z każdego pliku wykonywalnego, który linkuje się ze źródłem.
Kiedy ten zasób nie jest potrzebny
Osadzony pakiet jest potrzebny tylko wtedy, gdy serwer sgcWebSockets faktycznie dostarcza dołączony klient JS do zdalnej przeglądarki. Dzieje się tak w przypadku komponentów TsgcWSProtocol_JS_* lub dowolnego serwera, który odpowiada na GET /sgcwebsockets.js zwracając dołączony JavaScript.
Nie jest natomiast potrzebny dla:
- Klientów WebSocket Delphi / C++Builder — dane są konsumowane w kodzie natywnym, nigdy w przeglądarce.
- Serwerów natywny-do-natywnego — serwerów, których klientami są również aplikacje Delphi / C++Builder.
- Back-endów WebSocket serwujących własny JS — jeśli dostarczasz własny klient JavaScript (własny bundler, własny CDN), osadzony jest martwym balastem.
- Serwerów MQTT, AMQP, STOMP, WAMP, MCP i serwerów wyłącznie protokołowych — żaden z nich nie używa dołączonego klienta JS.
Jak to włączyć
Najczystsza droga to instalator. Po uruchomieniu instalatora edycji źródłowej sgcWebSockets naciśnij przycisk Options i odznacz nowy wpis:
[ ] Include Resources
Instalator przepisze linię {$DEFINE SGC_RESOURCES} w sgcVer.inc na {.$DEFINE SGC_RESOURCES} przed kompilacją jakiegokolwiek pakietu, dzięki czemu BPL projektowe i runtime zostaną wyprodukowane bez osadzonego pakietu.
Jeśli masz już zainstalowane sgcWebSockets i wolisz wprowadzić zmianę ręcznie, otwórz <sgc-install-folder>\Source\sgcVer.inc, znajdź linię:
{$DEFINE SGC_RESOURCES} { RESOURCES }
i zakomentuj nawias:
{.$DEFINE SGC_RESOURCES} { RESOURCES }
Następnie przebuduj pakiety runtime / design-time oraz swoją aplikację. Wybierz Project > Build All Projects w IDE lub uruchom swój zwykły skrypt budujący.
Mierzenie oszczędności
Jeśli chcesz potwierdzić oszczędność we własnym projekcie, wygeneruj szczegółową mapę linkera przed i po zmianie. Po przebudowaniu otwórz wygenerowany plik *.map i przewiń do sekcji zasobów — sgcResources.RES powinno zniknąć. Rozmiar modułu .text dla sgcWebSocket_Protocol_Base_Server również nieznacznie spada, ponieważ kod pomocniczy ładujący zasób jest eliminowany jako martwy kod.
Dokładna oszczędność zależy od konfiguracji kompilacji i używanej edycji sgcWebSockets, ale w typowej kompilacji wyłącznie klienckiej EXE zauważalnie się kurczy. Jeśli połączysz tę opcję z istniejącymi przełącznikami poziomu edycji ({$UNDEF SGC_EDT_ENT}, aby pominąć WebAuthn / HTTP2 / OAuth-server, lub usunięcie uses sgcWebSocket na rzecz uses sgcWebSocket_Client w kodzie wyłącznie klienckim), łączna redukcja może być znacząca.
Zgodność wsteczna
Domyślnym ustawieniem w sgcVer.inc pozostaje {$DEFINE SGC_RESOURCES}, więc istniejące projekty kompilują się i działają dokładnie tak jak wcześniej. Nowa flaga jest ściśle opt-out: nic się nie zmienia, dopóki jawnie nie wyłączysz zasobu, albo poprzez pole wyboru w instalatorze, albo edytując samodzielnie sgcVer.inc.
Jeśli wyłączysz SGC_RESOURCES, a następnie wywołasz metodę serwera, która próbuje udostępnić dołączony klient JS (na przykład procedurę obsługi odpowiedzi TsgcWSProtocol_JS_*), otrzymasz czysty wyjątek EResNotFound — oczywisty sygnał, że wyłączyłeś coś, czego faktycznie potrzebowałeś. Wystarczy ponownie włączyć dyrektywę i przebudować.
Dostępność
Nowa opcja jest dostarczana w sgcWebSockets 2026.6, wyłącznie w instalatorach edycji źródłowej (Standard, Professional i Enterprise). Instalator Trial zachowuje osadzony zasób, aby dołączone dema klienta JS działały od razu po instalacji.
Klienci z aktywną subskrypcją mogą pobrać nową kompilację z obszaru klienta. Pytania lub sugestie dotyczące dalszych przełączników redukcji rozmiaru? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.
