{"id":298,"date":"2020-07-01T07:35:51","date_gmt":"2020-07-01T07:35:51","guid":{"rendered":"https:\/\/blogs.zeiss.com\/tech\/?p=298"},"modified":"2020-08-06T07:14:31","modified_gmt":"2020-08-06T07:14:31","slug":"our-journey-to-microfrontends","status":"publish","type":"post","link":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/","title":{"rendered":"Our journey to microfrontends"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>What can\nyou expect from this read?<\/strong><\/h2>\n\n\n\n<p>Nowadays, Microfrontends\nas architectural style are not unknown \u2013 and Microfrontends is quite a popular\nbuzzword in the world of modern frontend software development, but for us it is\nmore than a buzzword!&nbsp; <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"616\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-1024x616.png\" alt=\"\" class=\"wp-image-300\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-1024x616.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-300x181.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-768x462.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-640x385.png 640w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar-1200x722.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Screenshot_ThoughWorks-Tech-Radar.png 1431w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 770px\" \/><figcaption>Actual <a href=\"https:\/\/www.thoughtworks.com\/radar\/techniques\/micro-frontends\">ThoughWorks Technology Radar<\/a> screenshot<\/figcaption><\/figure><\/div>\n\n\n\n<p>And if we\nlook at <a href=\"https:\/\/www.thoughtworks.com\/radar\/techniques\/micro-frontends\">ThoughtWorks\nTechnology Radar<\/a> you can see how this tech had its fast expansion since it first came\nup, at the end of 2016. If you search for Microfrontends you can find many\nresources, and nowadays also many frameworks for building your Microfrontends\napplications, and that\u2019s why in this blog post I would like to focus more on\nwhy we chose this technology, and how we developed our Microfrontends, instead\nof explaining this coding style in general.<\/p>\n\n\n\n<p>I will not\nbe talking about simple to-do-list application, but a real-world, fully\nflagged, international application, used by all our clients. So, if you are\nsomeone thinking about using Microfrontends in your application or business,\nand looking for an idea, or maybe some positive example of a famous, large,\ninternational company, which managed to successfully implement this technology,\nthen you are in right place.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A little\nbit of history\u2026<\/strong><\/h2>\n\n\n\n<p>Now, before\nI start going more into details about our Microfrontend solution, I want to\ntell you about how it all started. At the end of 2017, when we were about to\nstart working on our new project &#8211; one-stop-shop for our customers, to access\nand consume all our digital solutions. <\/p>\n\n\n\n<p>Since this\nproject was pretty much greenfield, we had a great opportunity to choose our\ntech stack and architecture. Although microservices where quite a known term\nand architecture style, but Microfrontends was still new and not many resources\nwere available. We were pioneers in this area. The community started talking\nabout Microfrontends, but most of the engineers and architects were hesitant to\nuse it in a large-scale application. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>About our\napplication \u2026<\/strong><\/h2>\n\n\n\n<p>Our team\u2019s task was to build an application called \u201cDigital Customer Companion\u201d, meant to serve as customer facing portal for many different digital solutions for very different customers and customer groups. Since the application was primarily a B2B app and meant to work as a sort of a tool for our customers (that is: ZEISS\u2019 businesses), we definitely wanted to build a Single Page Application (SPA). As the ZEISS Group has various business units, with a lot of different digital solutions, our intended solution was supposed to be exposed to our clients via this application. <\/p>\n\n\n\n<p>Above all,\nthese business units also had different teams that are often geographically distant\nand use different technologies \u2013 hence, they had independence in choosing the\nfrontend framework to be used. For instance, some teams wanted to use Angular,\nbut others React as their frontend framework, with the potential of using some\nother technologies as well \u2013 and our goal was to provide the means of\naccommodating all those choices \u2013 we needed to stay flexible.<\/p>\n\n\n\n<p>To\naccommodate these requirements, Microfrontends seemed to be a great choice, and\nit turned out, it was, indeed. In just a few weeks, we had the first version of\nReact and Angular applications running next to each other inside their isolated\nMicrofrontend &#8220;sandboxes&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architecture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Challenges<\/strong><\/h3>\n\n\n\n<p>Most of our\nMicrofrontends where isolated and independent from each other. That, on the one\nhand, was quite positive because the architecture we have chosen was perfect\nfor it, but on the other hand, it was quite challenging as we wanted to avoid\nthe scenario of reinventing the wheel over and over again. Most of our Microfontend\napplications had to deal with a similar set of challenges like common layout,\nauthentication, common UI, error handling, localization, tracking, etc. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Solution<\/strong><\/h3>\n\n\n\n<p>Basically,\nthere are two important parts to our solution. The first one is our Microfrontends\ncommon layer, aka the Portal. It was designed as a layer to expose useful\ncommon APIs but as well to enforce some common shared dependencies \u2013 like\nReact, Redux, our UI library, etc. This UI library was an important piece of the\npuzzle, and I would like to use this opportunity to point you to our open\nsource component library, <a href=\"https:\/\/precise-ui.io\/\">Precise-UI<\/a> (see also one of\nmy colleague\u2019s <a href=\"https:\/\/blogs.zeiss.com\/tech\/precise-ui\/\">blog post<\/a>),\nwhich we have developed and used for the mentioned application. <\/p>\n\n\n\n<p>The second\npart were the actual Microfrontends, aka Zeisslets. The Zeisslet is an AMD\nlibrary which exports one specific function, used by the portal as an entry\npoint. From the perspective of the portal, a Zeisslet is just a single\nJavaScript file that is transmitted via HTTP. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1001\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-1024x1001.png\" alt=\"\" class=\"wp-image-301\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-1024x1001.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-300x293.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-768x751.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-640x626.png 640w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture-1200x1173.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Microfrontends_architecture.png 1239w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 770px\" \/><figcaption> This is how our high-level architecture looks like (including the service-side part as well) <\/figcaption><\/figure><\/div>\n\n\n\n<p>The portal\nprovides many common functionalities, exposed via different APIs to each Microfrontend\napplication. <\/p>\n\n\n\n<p>Just to\ngive you an idea what I\u2019m talking about \u2013 APIs can be used by Microfrontends as\nmounting points such as, dashboard tiles, pages, navigation, etc. The Portal\nalso exposes APIs for accessing our GraphQL gateway, but there are others like\ntranslation, localization, tracking, and some other handy APIs. With all this\ninfrastructure provided by the Portal, the Zeisslet developer can clearly focus\non business logic implementation. <\/p>\n\n\n\n<p>One might\nargue that this layer is quite thick, and sure, depending on use cases, this\nmight be the truth, but in our case, this worked well. <\/p>\n\n\n\n<p>For a Zeisslet\nto be served by the portal it needs to be built following an AMD module\nspecification, exposing one specific function as entry point \u2013 but it must also\nbe available on our CDN, so that it can be \u201cpicked up\u201d by our microservice. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Developer\nexperience (DX)<\/strong><\/h2>\n\n\n\n<p>Nowadays, an\nimportant part in software development is developer experience \u2013 and that\u2019s why\nwe invested heavily in providing the best possible DX. For this purpose, we\nmanaged to develop different generators for getting you up and running with\nyour Zeisslet in a matter of seconds, no matter which frontend framework you\nwant to use. Also, together with the mentioned generator, the Zeisslets get\nshipped with the development version of the Portal, which enables developers to\nsee their Zeisslet running in the actual portal when locally debugging.&nbsp; <\/p>\n\n\n\n<p>When it\ncomes to CI\/CD, this is also being handled out-of-the-box, and the Zeisslets\nare tested and available on the CDN as soon as they get merged into\ncorresponding branch (see also other <a href=\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents\/\">blog post<\/a>\non our CI\/CD).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Take-away<\/strong>s<\/h2>\n\n\n\n<p>What I\u2019ve\nshown you here is really high-level and just scratching the surface of the\noverall challenge. The intention was not going too much into details and\ndistract the focus from important things. What I would like you to take out of\nthis read, is, first of all, the high-level architecture, but also a positive\nexample of one great company which is successfully using Microfrontends as\narchitectural style.&nbsp; <\/p>\n\n\n\n<p>I hope I managed to spark your attention about this pretty cool technology, but also about ZEISS as a cool company growing also into a digital technology company. If you would like to know more about ZEISS and Microfrontends, I would like to use this opportunity to point you to a <a href=\"https:\/\/www.meetup.com\/Microfrontends\/\">meetup<\/a> group, which is proudly supported by <a href=\"https:\/\/www.zeiss.com\/corporate\/int\/home.html\">ZEISS<\/a> and <a href=\"https:\/\/www.zeiss.com\/corporate\/int\/innovation-and-technology\/digital-innovation-partners.html\">ZEISS Digital Innovation Partners<\/a>. Although the group is still quite young, we already managed to gather more than 100 Microfrontends enthusiasts, and we plan to use this group to socialize and share knowledge and ideas.<\/p>\n\n\n\n  <figure id=\"image-wo-block_5efc331ca8215\" class=\"image-options  none full-width\">\n\n\n\n    <div class=\"image-wo\">\n       <div class=\"image-wo-wrap\">\n              <div class=\"copyright black\">\u00a9 James Pond on Unsplash<\/div>\n      \n\n                       <img decoding=\"async\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-1024x683.jpg\" alt=\"\">\n                 <\/div>\n          \n\n\n\n\n  <!-- end image-options-->\n  <\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Nowadays, Microfrontends as architectural style are not unknown \u2013 and Microfrontends is quite a popular buzzword in the world of modern frontend software development, but for us it is more than a buzzword!  <\/p>\n","protected":false},"author":12,"featured_media":302,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[24],"tags":[13,25,26,27],"topics":[17],"class_list":["post-298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-architecture","tag-frontend","tag-microfrontends","tag-ci-cd","tag-architecture","topics-frontend"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Our journey to microfrontends - Digital Innovation Partners<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Our journey to microfrontends - Digital Innovation Partners\" \/>\n<meta property=\"og:description\" content=\"Nowadays, Microfrontends as architectural style are not unknown \u2013 and Microfrontends is quite a popular buzzword in the world of modern frontend software development, but for us it is more than a buzzword!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital Innovation Partners\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-01T07:35:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-08-06T07:14:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Boris Maric\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Boris Maric\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/\",\"name\":\"Our journey to microfrontends - Digital Innovation Partners\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg\",\"datePublished\":\"2020-07-01T07:35:51+00:00\",\"dateModified\":\"2020-08-06T07:14:31+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/4b444820839dcf0b21b85ff26cb2fbfb\"},\"breadcrumb\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.zeiss.com\/tech\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Our journey to microfrontends\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#website\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/\",\"name\":\"Digital Innovation Partners\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.zeiss.com\/tech\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/4b444820839dcf0b21b85ff26cb2fbfb\",\"name\":\"Boris Maric\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Boris-150x150.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Boris-150x150.jpg\",\"caption\":\"Boris Maric\"},\"description\":\"Boris is a passionate senior software developer, bridging the gap between frontend and backend. Quality always comes first \u2013 at the forefront of bringing the top-quality solutions to our customers on their journey to digital. Outside the office, he usually spends time with his 3 kids, listening to (or sometimes even playing) good old blues, or running.\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/author\/boris-mariczeiss-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Our journey to microfrontends - Digital Innovation Partners","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/","og_locale":"en_US","og_type":"article","og_title":"Our journey to microfrontends - Digital Innovation Partners","og_description":"Nowadays, Microfrontends as architectural style are not unknown \u2013 and Microfrontends is quite a popular buzzword in the world of modern frontend software development, but for us it is more than a buzzword!","og_url":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/","og_site_name":"Digital Innovation Partners","article_published_time":"2020-07-01T07:35:51+00:00","article_modified_time":"2020-08-06T07:14:31+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg","type":"image\/jpeg"}],"author":"Boris Maric","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Boris Maric","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/","url":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/","name":"Our journey to microfrontends - Digital Innovation Partners","isPartOf":{"@id":"https:\/\/blogs.zeiss.com\/tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage"},"image":{"@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg","datePublished":"2020-07-01T07:35:51+00:00","dateModified":"2020-08-06T07:14:31+00:00","author":{"@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/4b444820839dcf0b21b85ff26cb2fbfb"},"breadcrumb":{"@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#primaryimage","url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-scaled.jpg","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.zeiss.com\/tech\/our-journey-to-microfrontends\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.zeiss.com\/tech\/"},{"@type":"ListItem","position":2,"name":"Our journey to microfrontends"}]},{"@type":"WebSite","@id":"https:\/\/blogs.zeiss.com\/tech\/#website","url":"https:\/\/blogs.zeiss.com\/tech\/","name":"Digital Innovation Partners","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.zeiss.com\/tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/4b444820839dcf0b21b85ff26cb2fbfb","name":"Boris Maric","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/image\/","url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Boris-150x150.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/Boris-150x150.jpg","caption":"Boris Maric"},"description":"Boris is a passionate senior software developer, bridging the gap between frontend and backend. Quality always comes first \u2013 at the forefront of bringing the top-quality solutions to our customers on their journey to digital. Outside the office, he usually spends time with his 3 kids, listening to (or sometimes even playing) good old blues, or running.","url":"https:\/\/blogs.zeiss.com\/tech\/author\/boris-mariczeiss-com\/"}]}},"author_meta":{"display_name":"Boris Maric","author_link":"https:\/\/blogs.zeiss.com\/tech\/author\/boris-mariczeiss-com\/"},"featured_img":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/07\/james-pond-26vBUtlufFo-unsplash-300x200.jpg","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/architecture\/\" class=\"advgb-post-tax-term\">Architecture<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Architecture<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/architecture\/\" class=\"advgb-post-tax-term\">Frontend<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/architecture\/\" class=\"advgb-post-tax-term\">Microfrontends<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/architecture\/\" class=\"advgb-post-tax-term\">CI\/CD<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/architecture\/\" class=\"advgb-post-tax-term\">Architecture<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Frontend<\/span>","<span class=\"advgb-post-tax-term\">Microfrontends<\/span>","<span class=\"advgb-post-tax-term\">CI\/CD<\/span>","<span class=\"advgb-post-tax-term\">Architecture<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 6 years ago","modified":"Updated 6 years ago"},"absolute_dates":{"created":"Posted on July 1, 2020","modified":"Updated on August 6, 2020"},"absolute_dates_time":{"created":"Posted on July 1, 2020 7:35 am","modified":"Updated on August 6, 2020 7:14 am"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/comments?post=298"}],"version-history":[{"count":9,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/298\/revisions"}],"predecessor-version":[{"id":334,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/298\/revisions\/334"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/media\/302"}],"wp:attachment":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/media?parent=298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/categories?post=298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/tags?post=298"},{"taxonomy":"topics","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/topics?post=298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}