{"id":50,"date":"2015-11-02T08:00:09","date_gmt":"2015-11-02T07:00:09","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=50"},"modified":"2023-08-24T15:43:17","modified_gmt":"2023-08-24T13:43:17","slug":"angularjs-1-x-zalety-i-wady","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/angularjs-1-x-zalety-i-wady\/","title":{"rendered":"AngularJS 1.X \u2013 Zalety i wady"},"content":{"rendered":"\n<p>AngularJs jest jednym z najpopularniejszych framework\u00f3w JavaScriptowych umo\u017cliwiaj\u0105cym tworzenie zar\u00f3wno prostych jak i skomplikowanych aplikacji client side w oparciu o architektur\u0119 MVC.<\/p>\n\n\n\n<p>W ci\u0105gu kilku lat oka\u017ce si\u0119 czy jest kolejn\u0105 zabawk\u0105 wujka Google czy stabilnym i wspieranym produktem, w kt\u00f3ry warto inwestowa\u0107 czas i pieni\u0105dze, jednak z ca\u0142\u0105 pewno\u015bci\u0105 jest powa\u017cnym graczem na rynku i warto mu si\u0119 bli\u017cej przyjrze\u0107.<\/p>\n\n\n\n<p>Du\u017co kontrowersji pojawi\u0142o si\u0119 wraz z rozpocz\u0119ciem prac nad wersj\u0105 2.0 opart\u0105 o AtScript (rozszerzenie MS TypeScript), przewiduj\u0105c\u0105 ca\u0142kowite przebudowanie frameworka i now\u0105 sk\u0142adni\u0119. Nie jest to zbyt dobra informacja dla firm, kt\u00f3re zainwestowa\u0142y w du\u017ce projekty, wymagaj\u0105ce utrzymania i rozwoju przez najbli\u017csze lata, poniewa\u017c nie mo\u017cna p\u0142ynnie przeprowadzi\u0107 migracji wersji 1.X do wersji drugiej. Na pocieszenie Google zapowiada mo\u017cliwo\u015b\u0107 mixowania obu wersji w ramach jednej aplikacji i supportu wersji 1.X.<\/p>\n\n\n\n<p>W tym artykule skupi\u0119 si\u0119 na wersji 1.3, z kt\u00f3r\u0105 mia\u0142em okazj\u0119 pracowa\u0107 rok przy dw\u00f3ch projektach. Jak ka\u017cdy framework angularJS nie jest pozbawiony wad, tote\u017c postaram si\u0119 przedstawi\u0107 dobre i ciemne strony mocy, z kt\u00f3rymi warto si\u0119 zapozna\u0107 przed rozpocz\u0119ciem prac i wyborze technologii.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zalety AngularJS 1.X<\/strong><\/h2>\n\n\n\n<p><strong>Zastosowanie<\/strong><br>Niew\u0105tpliwie mo\u017cemy budowa\u0107 z\u0142o\u017cone aplikacje SPA zar\u00f3wno webowe jak i mobilne, odci\u0105\u017caj\u0105c backend od renderowania kodu html a skupieniu si\u0119 na operacjach biznesowych. Wykorzystuj\u0105c bootstrapp, css3 czy animacje mo\u017cemy zaskoczy\u0107 klienta efektem &#8222;wow&#8221;.<\/p>\n\n\n\n<p><strong>Wstrzykiwanie zale\u017cno\u015bci<\/strong><br>Dependency Injection zdecydowanie u\u0142atwia testowanie, umo\u017cliwia \u0142atwe przekazywanie i wsp\u00f3\u0142prac\u0119 komponent\u00f3w w ramach z\u0142o\u017conego systemu. Warto tu zwr\u00f3ci\u0107 na uwag\u0119 na kwesti\u0119 minifikacji przy bezpo\u015brednim przekazywaniu parametr\u00f3w, kt\u00f3ra zmieniaj\u0105c nazwy, potrafi przerwa\u0107 dzia\u0142anie aplikacji z racji specyfiki dzia\u0142ania kontenera DI w wersji 1.X. Przy czym istnieje pewne ma\u0142o eleganckie rozwi\u0105zanie tego problemu.<\/p>\n\n\n\n<p><strong>Dyrektywy i szablony<\/strong><br>Dyrektywy, przyjmuj\u0105ce posta\u0107 atrybut\u00f3w&nbsp;DOM, s\u0105 jednym z ciekawszych element\u00f3w frameworka, mog\u0105 by\u0107 wielokrotnie u\u017cywane zgodnie z zasad\u0105 DRY. Ponadto istnieje mo\u017cliwo\u015b\u0107 wykorzystania tych wbudowanych (np.ngClick, ngSubmit, ngShow, ngModel) jak i stworzenia w\u0142asnych, pocz\u0105wszy od prostych walidacji na widoku, po budowanie z\u0142o\u017conych komponent\u00f3w wype\u0142nionych logik\u0105 biznesow\u0105, co pozwala na odchudzenie kontroler\u00f3w.<\/p>\n\n\n\n<p><strong>Obustronne bindowanie<\/strong><br>Dzi\u0119ki tej funkcjonalno\u015bci interfejs jest automatycznie uaktualniany pod wp\u0142ywem zmian modelu danych u\u017cytkownika czy tych pochodz\u0105cych z serwera bez konieczno\u015bci bezpo\u015bredniej obs\u0142ugi programisty. Zapewnia wygod\u0119 kosztem wydajno\u015bci.<\/p>\n\n\n\n<p><strong>Wsp\u00f3\u0142praca z REST<\/strong><br>Niew\u0105tpliw\u0105 zaleta jest wbudowana komunikacja REST za pomoc\u0105 serwis\u00f3w $http i $resource.<\/p>\n\n\n\n<p><strong>Wsp\u00f3\u0142praca z zewn\u0119trznymi bibliotekami<\/strong><br>AngularJS \u015bwietnie wsp\u00f3\u0142pracuje z wieloma frameworkami mi\u0119dzy innymi: JQuery, UnderscoreJS czy&nbsp;Ionic framework.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wady AngularJS 1.X<\/strong><\/h3>\n\n\n\n<p><strong>Wydajno\u015b\u0107<\/strong><br>Pr\u0119dko\u015b\u0107 nie jest mocn\u0105 stron\u0105 angulara, niew\u0105tpliwie spora wad\u0119 stanowi natywny brak &#8222;Lazy loading&#8221; i konieczno\u015b\u0107 \u0142adowania wszystkich skrypt\u00f3w naraz przy starcie aplikacji! P\u00f3ki co, mo\u017cemy si\u0119 ratowa\u0107 bundlingiem i minifikacj\u0105, ale jest to materia\u0142 na osobny artyku\u0142. W kolejnych wersjach (1.5 i 2.0) ma powsta\u0107 mechanizm routingu pozwalaj\u0105cy na do\u0142\u0105czanie skrypt\u00f3w pod konkretn\u0105 sekcj\u0119 aplikacji.<br>Niew\u0105tpliwy wp\u0142yw na zapotrzebowanie pami\u0119ci ma dodatkowa kopia ka\u017cdego obiektu, kt\u00f3ra umo\u017cliwia por\u00f3wnanie w &#8222;dirty check&#8221;, przy czym kosztowne cykle &#8222;dirty check&#8221; dotycz\u0105 wszystkich danych powi\u0105zanych z widokiem.<br>Z ca\u0142\u0105 pewno\u015bci\u0105 powinni\u015bmy si\u0119 dwa razy zastanowi\u0107, rozpoczynaj\u0105c projekt o wysokich wymaganiach wydajno\u015bciowych. Zach\u0119cam do zapoznania si\u0119 z artyku\u0142em <a href=\"http:\/\/www.alexkras.com\/11-tips-to-improve-angularjs-performance\/\" target=\"_blank\" rel=\"noopener\" class=\"ek-link\" rel=\"nofollow\" >11 tips to improve angularjs performance<span style=\"text-decoration: underline;\">.<\/span><br><\/a><br><strong>SEO i indeksowanie<\/strong><br>WebCrawlery kiepsko radz\u0105 sobie z JavaScriptem, w celu pe\u0142nej indeksacji nale\u017cy wykorzysta\u0107 zewn\u0119trzne narz\u0119dzia np. prerender.io, kt\u00f3re zwr\u00f3c\u0105 w\u0142a\u015bciwy kod html.<\/p>\n\n\n\n<p><strong>Nauka i dokumentacja<br><\/strong>Podstawy frameworka s\u0105 stosunkowo proste, jednak skomplikowane procesy implikuj\u0105 wykorzystanie bardziej zaawansowanych technik i tu mog\u0105 pojawi\u0107 si\u0119 problemy. Istnieje ryzyko, \u017ce zaczynaj\u0105ce swoj\u0105 przygod\u0119 zespo\u0142y spal\u0105 czas na walk\u0119 z niuansami frameworka. Z dokumentacj\u0105 jest coraz lepiej i w sieci pojawia si\u0119 coraz wi\u0119cej materia\u0142\u00f3w, jednak nie zawsze tak by\u0142o, wej\u015bcie na poziom eksperta wci\u0105\u017c jest wyzwaniem i wymaga du\u017cego nak\u0142adu czasu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Reasumuj\u0105c, wyb\u00f3r frameworka aplikacji SPA to kwestia kompromis\u00f3w, na rynku istnieje ich wiele, mi\u0119dzy innymi: DurandalJS, KnockoutJS, Aurelia, React, Flux, BackboneJS, Ember. <\/p>\n\n\n\n<p>Istotne jest, aby zrozumie\u0107 pozytywne i negatywne cechy ka\u017cdego z nich i efektywnie je wykorzysta\u0107, tu niestety nie ma drogi na skr\u00f3ty. Z ca\u0142\u0105 pewno\u015bci\u0105 angularJS znajduje si\u0119 w \u015bcis\u0142ej czo\u0142\u00f3wce kr\u00f3lewskiej kategorii framework\u00f3w JavaScript, przy czym wersja 2.0 wzbudza szczeg\u00f3lne emocje i oczekiwania jako produkt Google z bardzo du\u017c\u0105 spo\u0142eczno\u015bci\u0105 i wsparciem.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Wi\u0119cej o Angular mo\u017cesz dowiedzie\u0107 si\u0119 r\u00f3wnie\u017c z <a href=\"https:\/\/sii.pl\/blog\/wyszukiwarka\/angular\/\" target=\"_blank\" aria-label=\"innych artyku\u0142\u00f3w naszych ekspert\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">innych artyku\u0142\u00f3w naszych ekspert\u00f3w<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;50&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;AngularJS 1.X \u2013 Zalety i wady&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>AngularJs jest jednym z najpopularniejszych framework\u00f3w JavaScriptowych umo\u017cliwiaj\u0105cym tworzenie zar\u00f3wno prostych jak i skomplikowanych aplikacji client side w oparciu o &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/angularjs-1-x-zalety-i-wady\/\">Continued<\/a><\/p>\n","protected":false},"author":3,"featured_media":480,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[17,202],"class_list":["post-50","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-angularjs","tag-javascript"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/10\/12_Angular_v2.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/50"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":23822,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/50\/revisions\/23822"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/480"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}