SlideShare a Scribd company logo
1 of 94
Download to read offline
HUGOMAKE WEBDEV FUN AGAIN
Marcin Gajda
The Software House
TREND
http://example.com http://m.example.com
HISTORIA
Szukamy czegoś nowego
- Łatwy deploy
- Łatwy upgrade
- Treść rzadko aktualizowana
- Lekki
- Szybkie
- Może tańsze w utrzymaniu?
Szukamy czegoś nowego
A FAST & MODERN
STATIC WEBSITE
ENGINE
Instalacja
Instalacja
Ubuntu> sudo apt install hugo
Instalacja
Ubuntu> sudo apt install hugo
MacOS> brew install hugo
Instalacja
Ubuntu> sudo apt install hugo
MacOS> brew install hugo
Windows:
- ściągnij odpowiednie archiwum z
https://github.com/gohugoio/hugo/releases
- rozpakuj plik do folderu na dysku
- zmień nazwę pliku wykonywalnego na hugo.exe
- dodaj hugo.exe do PATH w zmiennych środowiskowych
NOWY PROJEKT
Zakładanie nowego projektu
> hugo new site uszanowanko
Congratulations! Your new Hugo site
is created in /projects/uszanowanko.
[more]
Zakładanie nowego projektu
> tree
Zakładanie nowego projektu
> tree
.
├── archetypes
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes
Zakładanie nowego projektu
> tree
.
├── archetypes
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes Nasz CSS, JavaScript, obrazki
Pliki JSON, YAML, TOML
Dodatkowe szablony
Pobrane motywy
Wzorce postów
Strony, post, etc
TREŚĆ
Tworzenie nowych stron
> hugo new localization.md
Tworzenie nowych stron
> hugo new localization.md
/projects/uszanowanko/content/localization.md created
Tworzenie nowych stron
> hugo new lecture/hugo.md
Tworzenie nowych stron
> hugo new lecture/hugo.md
typ wpisu nazwa pliku
Tworzenie nowych stron
> hugo new lecture/hugo.md
/projects/uszanowanko/content/lecture/hugo.md created
Tworzenie nowych stron
> tree content
Tworzenie nowych stron
> tree content
content
├── lecture
│ └── hugo.md
└── localization.md
Tworzenie nowych stron
> tree content
content
├── lecture
│ └── hugo.md
└── localization.md
FRONT MATTER
lectures/hugo.md
+++
date = "2017-06-19T14:06:54+02:00"
title = "hugo"
draft = true
+++
lectures/hugo.md
+++
date = "2017-06-19T14:06:54+02:00"
title = "hugo"
draft = true
+++
front matter
treść w
markdown
lectures/hugo.md
+++
date = "2017-06-19T14:06:54+02:00"
title = "hugo"
draft = true
+++
front matter
# Abstrakt
Nowe *potężne* narzędzia do
tworzenia _stron internetowych_
pojawiają się codziennie. My
jednak postanowiliśmy _cofnąć się
o krok_ i postawić na to co
proste. Efekt?
+ korzyści dla zespołu
+ korzyści dla klienta
treść w
markdown
Front matter w TOML
+++
date = "2017-06-19T14:06:54+02:00"
title = "hugo"
draft = true
+++
Front matter w JSON
{
date: "2017-06-19T14:06:54+02:00"
title: "hugo"
draft: true
}
Front matter w YAML
---
date: "2017-06-19T14:06:54+02:00"
title: hugo
draft: true
---
Front matter w YAML
---
date: "2017-06-19T14:06:54+02:00"
title: Hugo - make webdev fun again!
draft: true
slug: hugo-static-website-engine
aliases:
- /2017/06/hugo-make-webdev-fun-again
speaker: Marcin Gajda
time: 60min
---
Front matter w YAML
---
date: "2017-06-19T14:06:54+02:00"
title: Hugo - make webdev fun again!
draft: true
slug: hugo-static-website-engine
aliases:
- /2017/06/hugo-make-webdev-fun-again
speaker: Marcin Gajda
time: 60min
---
http://uszanowanko.pl/lectures/hugo-static-website-engine
ARCHETYPY
archetypes/lecture.md
---
speaker: Speaker name
time: time in minutes
---
Wpisu z archetypu
> hugo new lecture/grid.md
Wpisu z archetypu
> hugo new lecture/grid.md
/projects/uszanowanko/content/lecture/grid.md created
Wpisu z archetypu
> hugo new lecture/grid.md
/projects/uszanowanko/content/lecture/grid.md created
> cat content/lecture/grid.md
Wpisu z archetypu
> hugo new lecture/grid.md
/projects/uszanowanko/content/lecture/grid.md created
> cat content/lecture/grid.md
---
date: 2017-06-19T16:48:32+02:00
title: grid
time: time in minutes
speaker: Speaker name
---
MOTYW
Tworzenie motywu
> hugo new theme doge
Tworzenie motywu
themes/doge
├── LICENSE.md
├── archetypes
│ └── default.md
├── layouts
│ ├── 404.html
│ ├── _default
│ │ ├── list.html
│ │ └── single.html
│ ├── index.html
│ └── partials
│ ├── footer.html
│ └── header.html
├── static
│ ├── css
│ └── js
└── theme.toml
Systemy szablonów
- Go templates
- Ace templates
- Amber templates
Szablony GO
{{ partial "header.html" . }}
<section>
<h1>{{ .Title }}</h1>
<div>
<article>
{{ .Content }}
</article>
<aside>
Prezenter {{ .Params.speaker }} <br>
Czas trwania {{ .Params.time }}
</aside>
</div>
</section>
{{ partial "footer.html" . }}
Co jest wbudowane w HUGO i Szablony GO?
- dziesiątki filtrów i funkcji
- warunki, iteratory, magazyn danych
- bloki i “partiale”
- generowanie linków
- taksonomie
- paginacja
- tworzenie menu nawigacyjnego
- kanał RSS
- komentarze Disqus
- informacje o repozytorium GIT
- generowanie robots.txt
a także…
WIELOJĘZYCZNOŚĆ
config.yml
defaultContentLanguage: pl
enableMissingTranslationPlaceholders: true
defaultContentLanguageInSubdir: true
languages:
pl:
title: Strona internetowa Uszanowanka!
en:
title: WOW, such programming, very agile!
Wielojęzyczne posty
content
├── localization.en.md
├── localization.pl.md
└── lectures
├── grid.en.md
├── grid.pl.md
├── hugo.en.md
└── hugo.pl.md
DODATKOWE
ŹRÓDŁA
DANYCH
Wczytywanie z JSON, YAML, TOML
data/meetupjs/FrontemDoDeva.json
{{ range $.Site.Data.meetupjs.FrontemDoDeva.participants }}
<li>{{ .fullName }}</li>
{{ end }}
JSON lub CSV z zewnątrz
<div>
{{ $data := getJSON "http://weather.tld/gliwice.json" }}
{{ partial “weather.html” (index $data $meetupDay)}}
</div>
Listowanie folderu
{{ $files := readDir “/static/slides” }}
{{ range $files }}
<img src=”/slides/{{ .Name | relURL }}” />
{{ end }}
WYJŚCIE
Wbudowane formaty wyjściowe
- HTML
- AMP
- Calendar
- RSS
- JSON
- CSV
- CSS
Własny format wyjściowy
outputFormats:
epubFormat
mediaType text/html
baseName: epub
isPlainText: true
Path: epub
Własny format wyjściowy
outputFormats:
epubFormat
mediaType text/html
baseName: epub
isPlainText: true
Path: epub ---
outputs:
- html
- epub
---
WYSZUKIWARKA
Lunr.js
+ Indeks to zwykła tablica JS z treścią
+ Istnieją generatory indeksów
- Wymaga załadowania całego indeksu do przeglądarki
- Trzeba zaprogramować wyświetlanie wyników w JS
hugoidx (Bleve)
+ Szybsze przeszukiwanie
+ Żądanie AJAX będzie zwracać tylko wyniki
- Wymaga backendu do uruchomienia Bleve
- Wymaga znajomości środowiska GO
- Trzeba zaprogramować wyświetlanie wyników w JS
GENEROWANIE
Generowanie strony
> hugo
> hugo --buildDrafts
Wygenerowana strona
public
├── css
├── en
│ ├── index.html
│ ├── index.xml
│ ├── lecture
│ │ ├── grid
│ │ │ └── index.html
│ │ ├── hugo
│ │ │ └── index.html
│ │ ├── index.html
│ │ └── index.xml
│ ├── localization
│ │ └── index.html
│ └── sitemap.xml
├── index.html
├── js
├── pl
...
└── sitemap.xml
Tryb developerski
> hugo server
> hugo server --buildDrafts
Tryb developerski
> hugo server
> hugo server --buildDrafts
LiveReload
WDROŻENIE
WDROŻENIE
deploy
Jak to wygląda u nas?
- Korzystamy z BitBucket Pipelines
- Generujemy konfigurację z użyciem confd
- Generujemy stronę z HUGO
- Czyścimy bucket na AWS S3
- Wysyłamy nowe pliki na AWS S3
- Gotowe
Ewentualnie...
> hugo server --baseURL=http://example.com/ 
--port=80 
--appendPort=false 
--disableLiveReload=true 
--bind=87.245.198.50
Co zyskaliśmy?
- Łatwość modyfikacji
Co zyskaliśmy?
- Łatwość modyfikacji
- Oszczędność z powodu możliwości użycia S3
Co zyskaliśmy?
- Łatwość modyfikacji
- Oszczędność z powodu możliwości użycia S3
- Szybkość działania
Szybkość?
Szybkość?
2.61s
Szybkość?
2.61s
0.93s
https://next.smashingmagazine.com/
Pytania?
@marcingajda91

More Related Content

Similar to Hugo. Make webdev fun again!

Similar to Hugo. Make webdev fun again! (8)

Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
[FDD 2017] Łukasz Kokoszka - Case study: pluginable frontend
[FDD 2017] Łukasz Kokoszka - Case study: pluginable frontend[FDD 2017] Łukasz Kokoszka - Case study: pluginable frontend
[FDD 2017] Łukasz Kokoszka - Case study: pluginable frontend
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp Wrocław
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki start
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHP
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp Trójmiasto
 

More from The Software House

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Hugo. Make webdev fun again!