{"id":288,"date":"2022-02-24T14:49:24","date_gmt":"2022-02-24T14:49:24","guid":{"rendered":"https:\/\/webdevs.blog\/pl\/?p=288"},"modified":"2026-02-20T07:28:18","modified_gmt":"2026-02-20T07:28:18","slug":"netlify","status":"publish","type":"post","link":"https:\/\/webdevs.blog\/pl\/netlify\/","title":{"rendered":"Netlify &#8211; idealna przysta\u0144 dla Twojego kolejnego projektu"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Pisz\u0105c ten artyku\u0142 zastanawia\u0142em si\u0119 jak najlepiej okre\u015bli\u0107 us\u0142ug\u0119 Netlify. Z jednej strony jest to hosting stron statycznych, z drugiej ca\u0142e zaplecze backendowe dla funkcji serverless, z trzeciej infrastruktura CI\/CD, z czwartej&#8230; Mo\u017cna by tak wymienia\u0107, powiedzmy wi\u0119c, \u017ce jest to zestaw narz\u0119dzi, kt\u00f3re u\u0142atwiaj\u0105 \u017cycie developerom. Zestaw bardzo pot\u0119\u017cnych narz\u0119dzi.<\/h4>\n\n\n\n<p>Do tej pory mia\u0142em okazj\u0119 postawi\u0107 na Netlify kilkana\u015bcie r\u00f3\u017cnych stron i aplikacji &#8211; od prostych formularzy zbieraj\u0105cych dane po system do zarz\u0105dzania projektami i relacjami z klientami. Poni\u017cej znajdziecie kilka ficzer\u00f3w platformy, z kt\u00f3rych korzystam i mog\u0119 z czystym sumieniem poleci\u0107:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Continuous Integration\/Deployment<\/h2>\n\n\n\n<p>Tworz\u0105c nowy projekt w Netlify mo\u017cemy w prosty spos\u00f3b podpi\u0105\u0107 repozytorium z jednego z popularnych provider\u00f3w (GitHub, GitLab, Bitbucket). Nast\u0119pnie mo\u017cemy okre\u015bli\u0107 czy \u017ar\u00f3d\u0142owe pliki maj\u0105 zosta\u0107 przeniesione 1:1 czy raczej &#8211; co pewnie b\u0119dzie cz\u0119stszym scenariuszem &#8211; ma odby\u0107 si\u0119 proces buildowania (np. czy ma si\u0119&nbsp;uruchomi\u0107 komenda npm run build bezpo\u015brednio w infrastrukturze Netlify). <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2208\" height=\"1150\" src=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd.png\" alt=\"\" class=\"wp-image-295\" srcset=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd.png 2208w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd-300x156.png 300w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd-1024x533.png 1024w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd-768x400.png 768w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd-1536x800.png 1536w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-ci-cd-2048x1067.png 2048w\" sizes=\"auto, (max-width: 2208px) 100vw, 2208px\" \/><\/figure>\n\n\n\n<p>A co je\u015bli mamy super ma\u0142y projekt i nie stworzyli\u015bmy dla niego repozytroium? Netlify pozwala na r\u0119czny upload ca\u0142ego katalogu z projektem z poziomu aplikacji.<\/p>\n\n\n\n<p>Du\u017c\u0105 zalet\u0105 jest tak\u017ce to, \u017ce mo\u017cemy okre\u015bli\u0107 z jakiego brancha chcemy by deploy zosta\u0142 wykonany. Mo\u017cemy tak\u017ce skonfigurowa\u0107 platform\u0119 tak, by ka\u017cdy Pull Request generowa\u0142 unikalny link z podgl\u0105dem projektu, a co wi\u0119cej dzi\u0119ki aplikacji na Githubie, bot automatycznie mo\u017ce aktualizowa\u0107 takiego PRa o odpowiedni komentarz:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1864\" height=\"498\" src=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview.png\" alt=\"\" class=\"wp-image-297\" srcset=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview.png 1864w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview-300x80.png 300w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview-1024x274.png 1024w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview-768x205.png 768w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-preview-1536x410.png 1536w\" sizes=\"auto, (max-width: 1864px) 100vw, 1864px\" \/><\/figure>\n\n\n\n<p>W panelu Netlify mamy te\u017c list\u0119 wszystkich deploy\u00f3w wraz opcj\u0105 przywracania, dzi\u0119ki temu mo\u017cemy szybko przywr\u00f3ci\u0107 stron\u0119\/aplikacj\u0119&nbsp;do poprzedniego stanu.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<p class=\"has-dark-color has-light-background-color has-text-color has-background has-small-font-size\">Wa\u017cna informacja w kontek\u015bcie hostowanych plik\u00f3w: tutaj nie mamy bezpo\u015bredniego dost\u0119pu do plik\u00f3w, kt\u00f3re s\u0105 w chmurze. Nie mo\u017cemy np. tak jak w przypadku tradycyjnych hosting\u00f3w, wej\u015b\u0107 na serwer i pobra\u0107 lub doda\u0107 pojedynczy plik. Pocz\u0105tkowo mo\u017ce si\u0119&nbsp;to wydawa\u0107 ograniczeniem, natomiast dzi\u0119ki temu uzyskujemy pewno\u015b\u0107, \u017ce pliki na platformie zawsze b\u0119d\u0119 zgodn\u0105 w stu procentach z tymi, kt\u00f3re mamy w repo. Dodatkowo, mamy mo\u017cliwo\u015b\u0107 odpalania plugin\u00f3w i r\u00f3\u017cnych optymalizacji, minifikacji podczas procesu automatycznego deployu. <\/p>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Funkcje serverless<\/h2>\n\n\n\n<p>Je\u015bli do tej pory nie mieli\u015bcie z nimi do czynienia to koniecznie zajrzyjcie najpierw tutaj: <a href=\"https:\/\/serverless.css-tricks.com\/about\" data-type=\"URL\" data-id=\"https:\/\/serverless.css-tricks.com\/about\">serverless.css-tricks.com<\/a>. Do czego przede wszystkim mog\u0105 nam si\u0119&nbsp;przyda\u0107? <\/p>\n\n\n\n<p>W przypadku aplikacji typu Single Page Aplication, a tak\u017ce niekt\u00f3rych stron, nie zawsze b\u0119dziemy chcieli by wszystkie dane by\u0142y jawne. Czasem potrzebny jest jaki\u015b backend tylko po to by ukry\u0107 klucz API serwisu, z kt\u00f3rego pobieramy dane, czasem pojawi si\u0119 jaka\u015b logika, kt\u00f3r\u0105 nie chcieliby\u015bmy wykonywa\u0107 po stronie przegl\u0105darki. Id\u0105c dalej czasem nawet nie b\u0119dziemy mogli wykona\u0107 requestu do zewn\u0119trznego endpointu API ze wzgl\u0119du na CORSy. Rozwi\u0105zaniem tych wszystkich problem\u00f3w s\u0105 w\u0142a\u015bnie funkcje serverless. <\/p>\n\n\n\n<p>W najprostszej postaci za pomoc\u0105 tych funkcji b\u0119dziemy tworzy\u0107 w\u0142asne endpointy, do kt\u00f3rych b\u0119dziemy si\u0119 odwo\u0142ywa\u0107 i one zwr\u00f3c\u0105 nam w odpowiedzi JSONa. Natomiast mo\u017ce to by\u0107 te\u017c plik pdf, albo screenshot, albo wyrenderowany dynamicznie html ca\u0142ej strony (tutaj warto zainteresowa\u0107&nbsp;si\u0119 projektem, kt\u00f3ry powsta\u0142 przy okazji trzeciej wersji Nuxt.js: Nitro). <\/p>\n\n\n\n<p>Mo\u017cliwo\u015bci s\u0105 prawie nieograniczone. No prawie. Ogranicza nas 10 sekundowy limit czasu wykonania funkcji. Chyba, \u017ce zdecydujemy si\u0119 na:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Background Functions<\/strong><\/h2>\n\n\n\n<p>Swego czasu pracowali\u015bmy w <a href=\"https:\/\/coditive.com\/?utm_source=www&amp;utm_medium=article-288&amp;utm_campaign=webdevs.blog\" data-type=\"URL\" data-id=\"https:\/\/coditive.com\/?utm_source=www&amp;utm_medium=article-288&amp;utm_campaign=webdevs.blog\">Coditive<\/a> nad projektem pobieraj\u0105cym i analizuj\u0105cym dane z kilku stron internetowych, czyli po prostu by\u0142 to scraper wykorzystuj\u0105cy headless chromium w postaci <a href=\"https:\/\/github.com\/puppeteer\/puppeteer\">puppeteera<\/a>. Projekt nadawa\u0142 si\u0119 by uruchomi\u0107 go na platformie Netlify, gdyby w\u0142a\u015bnie nie limit 10 sekund wykonania funkcji. Ostatecznie zdecydowali\u015bmy si\u0119&nbsp;na stack oparty o Express.js, czyli klasycznie na serwerze dzia\u0142a\u0142 proces Node odpalony na Ubuntu. Kilka miesi\u0119cy p\u00f3\u017aniej Netlify uruchomi\u0142o Background Functions, kt\u00f3re by\u0142o dok\u0142adnie tym czego wtedy potrzebowali\u015bmy, czyli:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Czas wykonania takiej funkcji mo\u017ce wynosi\u0107 nawet 15 minut<\/li>\n\n\n\n<li>Funkcje s\u0105 przetwarzane jako zadania w tle przy u\u017cyciu wywo\u0142a\u0144 asynchronicznych. Co istotne gdy funkcja dzia\u0142aj\u0105ca w tle zostanie pomy\u015blnie wykonana, wynik (np. zestaw zescrapowanych danych) zostaje najcze\u015bciej przekazywany do innego miejsca ni\u017c klient inicjuj\u0105cy. W skr\u00f3cie &#8211; odpalamy tak\u0105 funkcj\u0119 i funkcja leci sobie w tle, w tym czasie wykonujemy inne operacje w aplikacji, b\u0105d\u017a idziemy na kaw\u0119.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><meta charset=\"utf-8\">Netlify CLI<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<p>Netlify CLI pozwala nam na korzystanie z zestawu komend, dzi\u0119ki kt\u00f3rym lokalny development jest du\u017co \u0142atwiejszy. Komenda <strong>dev<\/strong> automatycznie wykryje z jakiego frameworka korzystamy (np. z Vue czy z Reacta) i na tej podstawie uruchomi docelow\u0105 komend\u0119 dev, ale opakowan\u0105 w ficzery Netlify. Dzi\u0119ki temu np. mo\u017cemy wykorzysta\u0107 zmienne \u015brodowiskowe zdefiniowane w panelu platformy (oczywi\u015bcie nie ma te\u017c problemu by je nadpisa\u0107), czy uruchamia\u0107 lokalnie funkcje serverless i analizowa\u0107 ich logi. <\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"928\" height=\"850\" src=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-dev-cli-1.png\" alt=\"\" class=\"wp-image-302\" srcset=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-dev-cli-1.png 928w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-dev-cli-1-300x275.png 300w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2022\/02\/netlify-dev-cli-1-768x703.png 768w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>CLI pozwala tak\u017ce wykonywa\u0107 deploy (bez konieczno\u015bci pushowania do repozytorium) i weryfikowa\u0107 czy build ju\u017c si\u0119 wykona\u0142.<\/p>\n\n\n\n<p>I wisienka na torcie &#8211; mo\u017cemy stworzy\u0107 share&#8217;owalny server live naszego projektu i udost\u0119pni\u0107 link do niego naszemu wsp\u00f3\u0142pracownikowi. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Formularze<\/h2>\n\n\n\n<p>Netlify posiada wbudowan\u0105 obs\u0142ug\u0119 formularzy. Dzia\u0142a to w taki spos\u00f3b, \u017ce podczas buildowania boty kompiluj\u0105ce parsuj\u0105 HTML i wykrywaj\u0105 u\u017cycie formularza. Dzi\u0119ki temu nawet nie musimy pisa\u0107 funkcji, kt\u00f3ra b\u0119dzie taki formularz obs\u0142ugiwa\u0107. Kto\u015b mo\u017ce powiedzie\u0107, \u017ce to lenistwo &#8211; bo obs\u0142uga forma to po prostu kilka linijek w JSie, natomiast je\u015bli jeszcze dodamy to, co Netlify oferuje domy\u015blnie, czyli:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wychwytywanie spamu<\/li>\n\n\n\n<li>Mo\u017cliwo\u015b\u0107 eksportu danych z formularzy do pliku CSV<\/li>\n\n\n\n<li>Powiadomienia mailowe b\u0105d\u017a na slacka<\/li>\n\n\n\n<li>Upload plik\u00f3w<\/li>\n<\/ul>\n\n\n\n<p>&#8230;to uzyskujemy ju\u017c porz\u0105dny kawa\u0142 logiki, wi\u0119c dzi\u0119ki wbudowanej obs\u0142udze formularzy mo\u017cemy zaoszcz\u0119dzi\u0107 troch\u0119 czasu.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Oczywi\u015bcie to tylko kilka funkcji Netlify, z kt\u00f3rych korzystam na codzie\u0144, wiele wci\u0105\u017c <meta charset=\"utf-8\">stoi w kolejce do przetestowania: <strong><a href=\"https:\/\/docs.netlify.com\/configure-builds\/build-plugins\/\">Build Plugins<\/a><\/strong>, <a href=\"https:\/\/docs.netlify.com\/visitor-access\/identity\/\"><strong>Netlify Identity<\/strong><\/a>, czy niedawno og\u0142oszone <strong><a href=\"https:\/\/github.com\/netlify\/labs\/tree\/main\/features\/graph\/documentation\">Netlify Graph<\/a><\/strong>.<\/p>\n\n\n\n<p>A Wy? Mieli\u015bcie ju\u017c okazj\u0119 sprawdzi\u0107 t\u0119 platform\u0119? Dajcie zna\u0107 w komentarzach.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Pisz\u0105c ten artyku\u0142 zastanawia\u0142em si\u0119 jak najlepiej okre\u015bli\u0107 us\u0142ug\u0119 Netlify. Z jednej strony jest to hosting stron statycznych, z drugiej ca\u0142e zaplecze backendowe dla funkcji serverless, z trzeciej infrastruktura CI\/CD, z czwartej&#8230; Mo\u017cna by tak wymienia\u0107, powiedzmy wi\u0119c, \u017ce jest to zestaw narz\u0119dzi, kt\u00f3re u\u0142atwiaj\u0105 \u017cycie developerom. Zestaw bardzo pot\u0119\u017cnych narz\u0119dzi. Do tej pory mia\u0142em [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":289,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,4],"tags":[29,27,24,23,22,26,25],"class_list":["post-288","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-serwery","category-web-development","tag-continuous-deployment","tag-continuous-integration","tag-hosting","tag-netlify","tag-serverless","tag-single-page-applications","tag-vue"],"_links":{"self":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/comments?post=288"}],"version-history":[{"count":27,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/288\/revisions"}],"predecessor-version":[{"id":694,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/288\/revisions\/694"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/media\/289"}],"wp:attachment":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/media?parent=288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/categories?post=288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/tags?post=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}