Wyszukiwarka na statycznych stronach/blogu bez backendu
Tylko Javascript, na przykładzie bloga na Jekyllu
Zastanawiałem się niedawno czy możliwe jest zrobienie wyszukiwarki na statycznej stronie/blogu bez użycia technologii backendowych (chciałem mieć taką na blogu). Okazuję się, że tak - zdziwiłbym się, jeśli było by inaczej, bo czego to nie można zrobić w IT? Pokażę jak to zrobić wykorzystując projekt na Githubie jekyll-search-js, który zmodyfikowałem na swoje potrzeby. Niby jest on typowo pod Jekylla, ale można wykorzystać to w innych technologiach - kluczowe jest wygenerowanie wcześniej pliku JSON z mapą naszych linków do wyszukiwania.
Generowanie pliku z mapą wyszukiwania
Bez tego nasza wyszukiwarka się nie obejdzie. To w nim będzie się odbywało wyszukiwanie elementów. Jeśli mamy możliwość wygenerować taki plik, to będziemy mogli zrobić wyszukiwarkę. Dlatego nie jest to ograniczone do Jekylla jak nazwa wskazuje. Zapewne można to zrobić na co najmniej kilka sposobów
W Jekyllu jest to całkiem proste. Po ściągnięciu paczki z Githuba umieszczamy ją w zasobach projektu i otwieramy plik search.json. W domyślnej wersji do wyszukiwarki trafią nie tylko posty, ale również podstrony. Na blogu chciałem wyszukiwarkę tylko dla postów i zmodyfikowałem nieco kod:
Ponadto, dodałem wszystkie brakujące informację o poście - podtytuł i datę, a usunąłem miedzy innymi content, bo nie chcę w wyszukiwarce pokazywać treści postu, tylko sam odnośnik. Te brzydkie “casey” po środku odpowiadają za tłumaczenie miesięcy na polski. Niestety w Jekyllu nie ma lepszego rozwiązania.
Po wygenerowaniu pliku przez Jekyll wygląda to tak:
Czyli mamy plik z danymi o każdym poście na stronie, gotowy do obróbki.
Przeszukiwanie i pokazywanie wyników
Tu całą robotę zrobi za nas Javascript. W paczce są jeszcze 2 pliki search-min.js i fetch-min.js. Ten drugi odpowiada za dobieranie się do wygenerowanego pliku JSON, a całą logikę realizuje search-min.js. Tak więc, fetch-min.js zostawiamy w spokoju, a pod własne potrzeby modyfikujemy ten pierwszy. Kluczowe są dwie metody - findResults()
, gdzie możemy zmodyfikować sposób dopasowywania wyników i displayResults()
, gdzie modyfikujemy sposób prezentacji.
U siebie, wyszukiwanie zmodyfikowałem tak, aby były brane pod uwagę pojedyncze słowa, a nie całe frazy:
Z kolejnych słów wpisanych w wyszukiwarce budowane jest wyrażenie regularne, oddzielając je '|' - co znaczy, że będzie dopasowane dowolne słowo, a nie tak jak domyślnie - całe zdania. U mnie działa to o wiele lepiej.
Warstwę prezentacji zmodyfikowałem o klasy występujące na blogu i wcześniej dodane pola:
Pozostało nam dołączyć wyszukiwarkę do naszej strony, czyli:
- zdefiniować wymagane elementy w HTML
- załączyć skrypty
- utworzyć nowy obiekt
jekyllSearch
podając kolejno:- ścieżkę do pliku z mapą wyszukiwania, tu
'/dist/js/search/search.json'
- klasę inputa/pola wyszukiwarki, tu
'search-value'
- pojemnika na wyniki, tu
'search-results'
- ścieżkę do pliku z mapą wyszukiwania, tu
- i zainicjować go:
A oto efekt - działa zaskakująco dobrze