npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@nexlylab/widget

v1.35.14

Published

Bramka <script> dla widgetu Nexly: loader v1.js pod stałym adresem. Agent AI na dowolnej stronie w jednej linijce HTML — bez builda, bez frameworka, bez konfiguracji.

Readme

@nexlylab/widget

Agent AI na dowolnej stronie w jednej linijce HTML. Bez builda, bez frameworka, bez konfiguracji.

Instalacja

Wklej przed </body>:

<script src="https://e-commerce-studio.nexlylab.dev/widget/pk_live_TWOJ_KLUCZ.js" defer></script>

To wszystko. Gotowy snippet — z już wpisanym kluczem — skopiujesz z panelu → Produkt → Instalacja. Motyw, język, zestaw bloków i pozostałe ustawienia pobierane są z serwera na podstawie klucza, więc zmiana konfiguracji nie wymaga dotykania Twojej strony.

Klucz podajesz raz — w adresie. To on mówi serwerowi, o który produkt chodzi, więc odpowiedź niesie wersję przypiętą do tego produktu zamiast domyślnej wersji kanału. Serwer wpisuje ten klucz do wydawanego pliku, dlatego nie trzeba go powtarzać w data-api-key. Klucz pk_live_… jest z założenia publiczny — i tak stoi w HTML-u Twojej strony — a o dostępie decydują wyłącznie sprawdzenia po stronie serwera (allowed_origins i kontrola klucza przy każdym żądaniu).

Starszy adres /widget.js (bez klucza) działa nadal i będzie działał zawsze — to właśnie ten adres wstawiają wtyczki WooCommerce i Shopify. Różnice są dwie: nie zna Twojego klucza, więc wymaga atrybutu data-api-key i nie da się pod nim przypiąć wersji per produkt. Jeżeli wklejasz snippet ręcznie, użyj formy z kluczem powyżej.

Gdy podasz oba, a będą różne, wygrywa klucz z adresu — to on zdecydował, którą wersję serwer wydał tej stronie — i loader powie o tym w konsoli.

Jeżeli korzystasz z własnej instancji Studio, podmień origin — ścieżka /widget/<klucz>.js jest taka sama na każdej instalacji i obsługuje ją sama platforma. Ten plik to tylko loader (bramka): którą wersję runtime'u pobrać i skąd, rozstrzyga serwer w chwili żądania, per klucz (katalog wydań w panelu superadmina). Sam runtime — UI, bloki, własny React — to osobna paczka @nexlylab/widget-runtime, której nikt nie instaluje: istnieje po to, żeby CDN (w naszym hostowanym wydaniu cdn.jsdelivr.net) miał co serwować. Jeżeli serwujesz runtime z własnego adresu, zarejestruj wydanie pod tym adresem w katalogu albo wskaż go w snippecie atrybutem data-cdn="https://twoj-cdn/…".

Dlaczego ten adres

Ten adres jest jedyną rekomendowaną ścieżką instalacji i celowo nie zawiera numeru wersji. Obie formy — /widget/<klucz>.js i starsze /widget.js — serwujemy z własnego origin z nagłówkami public, max-age=300, must-revalidate i silnym ETagiem (zmierzone na produkcji 2026-09-14: 200, 9 775 B, ok. 4,7 KB po gzipie) — przeglądarka odpytuje go co najwyżej raz na 5 minut, a między odpytaniami płaci tanie 304. Nowe wydanie widgetu dociera więc do Twoich odwiedzających w ciągu kilku minut, bez czyszczenia cache'u i bez trybu incognito.

npm i jsDelivr zostają hostem kodu. Te ~9,8 KB to wyłącznie drogowskaz: loader czyta z niego, którą wersję runtime'u pobrać, i ściąga ją z cdn.jsdelivr.net spod adresu przypiętego do konkretnej wersji paczki @nexlylab/widget-runtime — a więc immutable i cache'owanego na zawsze. Ciężki, kilkusetkilobajtowy kod widgetu nadal leci z sieci brzegowej jsDelivr; z naszego serwera idzie tylko ten mały wskaźnik, i tylko on odświeża się co 5 minut.

Dlatego nie wklejaj adresu z numerem wersji (…/@nexlylab/[email protected]/…). Taki adres jsDelivr odpowiada nagłówkiem max-age=31536000, immutable, co oznacza, że przeglądarka przez rok nie sprawdzi go ani razu — nawet przy wymuszonym odświeżeniu. Zamraża Cię to na jednym wydaniu do czasu ręcznej zmiany adresu w kodzie strony. Kopia v1.js publikowana w tej paczce na npm ma z tego samego powodu wskaźnik wpisany na stałe — na wersję runtime'u aktualną w chwili publikacji — bo jsDelivr nie ma serwera, który mógłby go rozstrzygać; numer tej paczki to numer bramki, nie runtime'u. Nie używaj też aliasu @latest: jest cache'owany niezależnie na każdym węźle jsDelivr przez 12 godzin, przez co potrafi wskazać loaderowi ścieżkę runtime'u, która jeszcze nie istnieje — widget wtedy nie wstaje w ogóle. Pełne pomiary i uzasadnienie: ADR 0001 — kontrakt dystrybucji widgetu.

Jak to wpływa na szybkość strony

Wklejony <script> pobiera tylko loader (ok. 5,75 KB gzip — 4,7 KB do wydania ECO-16734, które dodało odczyt notatki otwartego panelu, i ECO-16737, które dodało ofsety launchera sterowane przez stronę), który rysuje sam przycisk. Właściwy widget ściąga się dopiero, gdy odwiedzający najedzie na przycisk lub go kliknie, a poszczególne moduły — dopiero gdy są potrzebne. Ładowanie Twojej strony pozostaje nietknięte.

Opcje

Wszystkie są opcjonalne — domyślne wartości pochodzą z ustawień produktu.

| Atrybut | Wartości | Domyślnie | |---|---|---| | data-api-key | klucz pk_live_… / pk_test_… | brany z adresu; wymagany tylko na /widget.js | | data-theme | light, dark, system | system | | data-position | bottom-right, bottom-left | bottom-right | | data-preload | hover, idle, click | hover | | data-debug | obecność atrybutu włącza logi | wyłączone |

Diagnostykę można też włączyć bez zmiany kodu, dopisując ?nexly-debug=1 do adresu strony.

Sterowanie z Twojego kodu

window.Nexly istnieje natychmiast po wykonaniu snippetu — wywołania sprzed załadowania widgetu trafiają do kolejki i wykonują się później, więc nie trzeba niczego opóźniać.

<button onclick="Nexly('open')">Potrzebuję pomocy</button>

Dostępne polecenia: open, close, destroy.

Wymagania

Widget wymaga HTTPS, jeśli chcesz korzystać z rozmowy głosowej — mikrofon i WebRTC są przez przeglądarki dostępne wyłącznie w bezpiecznym kontekście. Czat tekstowy działa również po HTTP.

Domenę Twojej strony trzeba dodać w panelu do listy dozwolonych originów. Bez tego widget wczyta się, ale rozmowa zwróci błąd — komunikat w konsoli wskaże, gdzie to uzupełnić.

Licencja

MIT © NexlyLab