\n \u003Cinput type=\"text\" name=\"superpower\" />\n \u003Cbutton type=\"submit\" is=\"ajax-submit\" data-target=\"hero-container\">\n add new item\n \u003C/button>\n\u003C/form>\n\n\u003Cdiv id=\"hero-container\">\u003C/div>\n","html",[147,240,241,275,303,325,357,363,373,383,390],{"__ignoreMap":141},[242,243,246,250,253,257,260,264,267,269,272],"span",{"class":244,"line":245},"line",1,[242,247,249],{"class":248},"sVt8B","\u003C",[242,251,149],{"class":252},"s9eBZ",[242,254,256],{"class":255},"sScJk"," action",[242,258,259],{"class":248},"=",[242,261,263],{"class":262},"sZZnC","\"/heroes\"",[242,265,266],{"class":255}," method",[242,268,259],{"class":248},[242,270,271],{"class":262},"\"post\"",[242,273,274],{"class":248},">\n",[242,276,278,281,284,287,289,292,295,297,300],{"class":244,"line":277},2,[242,279,280],{"class":248}," \u003C",[242,282,283],{"class":252},"input",[242,285,286],{"class":255}," type",[242,288,259],{"class":248},[242,290,291],{"class":262},"\"text\"",[242,293,294],{"class":255}," name",[242,296,259],{"class":248},[242,298,299],{"class":262},"\"hero\"",[242,301,302],{"class":248}," />\n",[242,304,306,308,310,312,314,316,318,320,323],{"class":244,"line":305},3,[242,307,280],{"class":248},[242,309,283],{"class":252},[242,311,286],{"class":255},[242,313,259],{"class":248},[242,315,291],{"class":262},[242,317,294],{"class":255},[242,319,259],{"class":248},[242,321,322],{"class":262},"\"superpower\"",[242,324,302],{"class":248},[242,326,328,330,332,334,336,339,342,344,347,350,352,355],{"class":244,"line":327},4,[242,329,280],{"class":248},[242,331,227],{"class":252},[242,333,286],{"class":255},[242,335,259],{"class":248},[242,337,338],{"class":262},"\"submit\"",[242,340,341],{"class":255}," is",[242,343,259],{"class":248},[242,345,346],{"class":262},"\"ajax-submit\"",[242,348,349],{"class":255}," data-target",[242,351,259],{"class":248},[242,353,354],{"class":262},"\"hero-container\"",[242,356,274],{"class":248},[242,358,360],{"class":244,"line":359},5,[242,361,362],{"class":248}," add new item\n",[242,364,366,369,371],{"class":244,"line":365},6,[242,367,368],{"class":248}," \u003C/",[242,370,227],{"class":252},[242,372,274],{"class":248},[242,374,376,379,381],{"class":244,"line":375},7,[242,377,378],{"class":248},"\u003C/",[242,380,149],{"class":252},[242,382,274],{"class":248},[242,384,386],{"class":244,"line":385},8,[242,387,389],{"emptyLinePlaceholder":388},true,"\n",[242,391,393,395,397,400,402,404,407,409],{"class":244,"line":392},9,[242,394,249],{"class":248},[242,396,223],{"class":252},[242,398,399],{"class":255}," id",[242,401,259],{"class":248},[242,403,354],{"class":262},[242,405,406],{"class":248},">\u003C/",[242,408,223],{"class":252},[242,410,274],{"class":248},[234,412,416],{"className":413,"code":414,"language":415,"meta":141,"style":141},"language-javascript shiki shiki-themes github-light github-dark","class AjaxSubmitButton extends HTMLButtonElement {\n connectedCallback() {\n this.addEventListener(\"click\", async (event) => {\n event.preventDefault();\n let html = await ajaxFormSubmit();\n document.getElementById(this.dataset.target).innerHTML = html;\n });\n }\n}\n\ncustomElements.define(\"ajax-submit\", AjaxSubmitButton, {\n extends: \"button\",\n});\n","javascript",[147,417,418,436,444,483,494,512,533,538,543,548,553,569,581],{"__ignoreMap":141},[242,419,420,424,427,430,433],{"class":244,"line":245},[242,421,423],{"class":422},"szBVR","class",[242,425,426],{"class":255}," AjaxSubmitButton",[242,428,429],{"class":422}," extends",[242,431,432],{"class":255}," HTMLButtonElement",[242,434,435],{"class":248}," {\n",[242,437,438,441],{"class":244,"line":277},[242,439,440],{"class":255}," connectedCallback",[242,442,443],{"class":248},"() {\n",[242,445,446,450,453,456,459,462,465,468,471,475,478,481],{"class":244,"line":305},[242,447,449],{"class":448},"sj4cs"," this",[242,451,452],{"class":248},".",[242,454,455],{"class":255},"addEventListener",[242,457,458],{"class":248},"(",[242,460,461],{"class":262},"\"click\"",[242,463,464],{"class":248},", ",[242,466,467],{"class":422},"async",[242,469,470],{"class":248}," (",[242,472,474],{"class":473},"s4XuR","event",[242,476,477],{"class":248},") ",[242,479,480],{"class":422},"=>",[242,482,435],{"class":248},[242,484,485,488,491],{"class":244,"line":327},[242,486,487],{"class":248}," event.",[242,489,490],{"class":255},"preventDefault",[242,492,493],{"class":248},"();\n",[242,495,496,499,502,504,507,510],{"class":244,"line":359},[242,497,498],{"class":422}," let",[242,500,501],{"class":248}," html ",[242,503,259],{"class":422},[242,505,506],{"class":422}," await",[242,508,509],{"class":255}," ajaxFormSubmit",[242,511,493],{"class":248},[242,513,514,517,520,522,525,528,530],{"class":244,"line":365},[242,515,516],{"class":248}," document.",[242,518,519],{"class":255},"getElementById",[242,521,458],{"class":248},[242,523,524],{"class":448},"this",[242,526,527],{"class":248},".dataset.target).innerHTML ",[242,529,259],{"class":422},[242,531,532],{"class":248}," html;\n",[242,534,535],{"class":244,"line":375},[242,536,537],{"class":248}," });\n",[242,539,540],{"class":244,"line":385},[242,541,542],{"class":248}," }\n",[242,544,545],{"class":244,"line":392},[242,546,547],{"class":248},"}\n",[242,549,551],{"class":244,"line":550},10,[242,552,389],{"emptyLinePlaceholder":388},[242,554,556,559,562,564,566],{"class":244,"line":555},11,[242,557,558],{"class":248},"customElements.",[242,560,561],{"class":255},"define",[242,563,458],{"class":248},[242,565,346],{"class":262},[242,567,568],{"class":248},", AjaxSubmitButton, {\n",[242,570,572,575,578],{"class":244,"line":571},12,[242,573,574],{"class":248}," extends: ",[242,576,577],{"class":262},"\"button\"",[242,579,580],{"class":248},",\n",[242,582,584],{"class":244,"line":583},13,[242,585,586],{"class":248},"});\n",[18,588,589,590,593],{},"Der Vorteil des Custom-Elements gegenüber jQuery (oder sonstiger eigener Implementierung) ist, dass der Browser sich\ndarum kümmert, unser JavaScript mit dem HTML zu verbinden und eine Instanz des ",[147,591,592],{},"AjaxSubmitButtons"," zu erstellen.",[18,595,596,597,600,601,606],{},"Kommen zur Laufzeit weitere ",[147,598,599],{},"submit"," Buttons mit diesem Attribut hinzu, werden sie vom Browser automatisch mit unserem\ngewünschten Verhalten erweitert. Ist das JavaScript aus irgendwelchen Gründen nicht verfügbar funktioniert weiterhin das\ngute alte HTML Formular mit komplettem Seitenreload. Wir verbessern unsere Anwendung mit jedem weiteren\nTechnologie-Layer, der zur Verfügung\nsteht, ",[24,602,605],{"href":603,"rel":604},"https://developer.mozilla.org/de/docs/Glossary/Progressive_Enhancement",[28],"Progressive Enhancement"," genannt. HTML\nbeschreibt den Inhalt, CSS macht es bunt, und zu guter Letzt verbessern wir die Benutzererfahrung mit JavaScript.",[18,608,609],{},"Das Backend wird mit diesem Ansatz auch nicht komplizierter oder gar komplexer. Im Controller müssen wir erkennen, dass\nes sich um einen Ajax Request handelt. In dem Fall wird ein HTML Fragment gerendert, andernfalls wird die komplette\nSeite gerendert:",[234,611,615],{"className":612,"code":613,"language":614,"meta":141,"style":141},"language-java shiki shiki-themes github-light github-dark","@PostMapping(value = \"/heroes\")\npublic String addSuperhero(\n @RequestParam String hero,\n @RequestParam String superpower,\n @RequestHeader(name = \"X-Requested-With\", defaultValue = \"\") String requestedWith,\n Model model\n ) {\n\n model.addAttribute(\"hero\", hero);\n model.addAttribute(\"superpower\", superpower);\n\n if (\"ajax\".equals(requestedWith)) {\n return \"fragments/hero-fragment :: hero-fragment\";\n }\n\n return \"full-page-including-the-hero-fragment\";\n}\n\n","java",[147,616,617,622,627,632,637,642,647,652,656,661,666,670,675,680,686,691,697],{"__ignoreMap":141},[242,618,619],{"class":244,"line":245},[242,620,621],{},"@PostMapping(value = \"/heroes\")\n",[242,623,624],{"class":244,"line":277},[242,625,626],{},"public String addSuperhero(\n",[242,628,629],{"class":244,"line":305},[242,630,631],{}," @RequestParam String hero,\n",[242,633,634],{"class":244,"line":327},[242,635,636],{}," @RequestParam String superpower,\n",[242,638,639],{"class":244,"line":359},[242,640,641],{}," @RequestHeader(name = \"X-Requested-With\", defaultValue = \"\") String requestedWith,\n",[242,643,644],{"class":244,"line":365},[242,645,646],{}," Model model\n",[242,648,649],{"class":244,"line":375},[242,650,651],{}," ) {\n",[242,653,654],{"class":244,"line":385},[242,655,389],{"emptyLinePlaceholder":388},[242,657,658],{"class":244,"line":392},[242,659,660],{}," model.addAttribute(\"hero\", hero);\n",[242,662,663],{"class":244,"line":550},[242,664,665],{}," model.addAttribute(\"superpower\", superpower);\n",[242,667,668],{"class":244,"line":555},[242,669,389],{"emptyLinePlaceholder":388},[242,671,672],{"class":244,"line":571},[242,673,674],{}," if (\"ajax\".equals(requestedWith)) {\n",[242,676,677],{"class":244,"line":583},[242,678,679],{}," return \"fragments/hero-fragment :: hero-fragment\";\n",[242,681,683],{"class":244,"line":682},14,[242,684,685],{}," }\n",[242,687,689],{"class":244,"line":688},15,[242,690,389],{"emptyLinePlaceholder":388},[242,692,694],{"class":244,"line":693},16,[242,695,696],{}," return \"full-page-including-the-hero-fragment\";\n",[242,698,700],{"class":244,"line":699},17,[242,701,547],{},[74,703,705],{"id":704},"auf-dem-weg-zur-single-page-application","Auf dem Weg zur Single Page Application",[18,707,708],{},"Mittlerweile haben wir die ajax-submit Komponente in unserer Anwendung an sehr vielen Stellen im Einsatz. Bisher hat\nsie sich als robust und einfach bewährt. Jeder im Team hat verstanden wie man es einsetzt und wie es funktioniert. Wir\nbrauchen keine Runtime a la ReactJS, wir müssen Hooks nicht verstehen, wir benötigen kein komplexes Build Setup. Wir\nmüssen nicht überlegen wie wir vue Komponenten integrieren und wir müssen uns keine Gedanken bzgl Client Side only\nFunktionalität machen.",[18,710,711],{},"Kurz gesagt: Wir bauen unser Frontend ohne modernes JavaScript Framework und sind (trotzdem) glücklich.",[18,713,714],{},"Zugegeben, die Progressive Enhancement Denkweise ist herausfordernd. Daran zu denken und zu überlegen, wie Anforderungen\nohne JavaScript gelöst werden können, hat unsere Industrie vielleicht verlernt? In der Vergangenheit haben mich\nKollegen, die überwiegend im Backend unterwegs sind gefragt, wie man denn heutzutage ein Frontend baut. Nehme man da\nAngular oder React? Über Anforderungen war man sich da aber noch nicht bewusst… Es war zumindest nicht die Einleitung\nzur Technologie Frage.",[716,717,719],"h3",{"id":718},"herausforderungen-die-kommen-könnten","Herausforderungen die kommen (könnten)",[82,721,722],{},[85,723,724],{},[211,725,726],{},"Progressive Enhancement Denkweise",[18,728,729],{},"Sobald unsere Anwendung einen gewissen Charakter moderner Single Page Applications erreicht hat, wird das natürlich der\nDefault werden (im Geiste). Hier gilt es weiterhin an die Basis zu denken und nicht sofort an JavaScript only Lösungen.",[82,731,732],{},[85,733,734],{},[211,735,736],{},"History Handling",[18,738,739,740,745],{},"Vor und Zurück nach bestimmten Aktionen ist bisher keine Anforderung. Sollte diese Anforderung kommen ist das aber auch\nkein Hexenwerk. Nach JavaScript Aktionen die URL mit\nder ",[24,741,744],{"href":742,"rel":743},"https://developer.mozilla.org/en-US/docs/Web/API/History",[28],"history API"," ändern ist im Bereich des Möglichen 😉",[82,747,748],{},[85,749,750],{},[211,751,752],{},"State",[18,754,755,756,761],{},"Nach bestimmten Aktionen den State an mehreren Stellen im Browser aktualisieren. Hier muss denke ich abewägt werden, ob\nBibiliotheken eine Daseinsberechtigung bekommen, oder\nob ",[24,757,760],{"href":758,"rel":759},"https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent",[28],"Custom Events"," ausreichen.",[763,764,765],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":141,"searchDepth":277,"depth":277,"links":767},[768,769,770,771],{"id":76,"depth":277,"text":77},{"id":123,"depth":277,"text":124},{"id":199,"depth":277,"text":190},{"id":704,"depth":277,"text":705,"children":772},[773],{"id":718,"depth":305,"text":719},[775,776],"developer-blog","synyx-blog","2020-06-23T11:20:03","Mit einigen Jahren JavaScript und Reactjs Erfahrung durfte ich Ende letzten Jahres (November 2019) Teil eines neuen\\nTeams und eines neuen Projektes werden. Das Projekt ist ein Traumprojekt jeden Entwicklers. Ein grüne Wiese Projekt mit\\n“freier” Technologiewahl. “Frei” in Form von man darf sich die Zeit für eine Risikoanalyse nehmen und moderne Tools und\\nFrameworks evaluieren.","md","https://synyx.de/blog/frameworkless-frontend-und-trotzdem-gluecklich/",{},"/blog/frameworkless-frontend-und-trotzdem-gluecklich",{"title":7,"description":20},"frameworkless-frontend-und-trotzdem-gluecklich","blog/frameworkless-frontend-und-trotzdem-gluecklich",[787,415,788],"development","progressive-enhancement","Mit einigen Jahren JavaScript und Reactjs Erfahrung durfte ich Ende letzten Jahres (November 2019) Teil eines neuen Teams und eines neuen Projektes werden. Das Projekt ist ein Traumprojekt jeden Entwicklers. Ein grüne Wiese Projekt mit 'freier' Technologiewahl. 'Frei' in Form von man darf sich die Zeit für eine Risikoanalyse nehmen und moderne Tools und Frameworks evaluieren.","JGt7bZJ_gokf64kVf7XrDHMaEJ2JdAYkb3HTHT7LZEw",[792,795,798,801,804,807,810,813,816,819,822,825,828,831,834,837,840,843,846,849,852,855,857,860,863,866,869,871,874,877,880,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,1000,1003,1006,1009,1012,1015,1018,1021,1024,1027,1030,1033,1036,1039,1042,1045,1048,1051,1054,1057,1060,1063,1066,1069,1072,1075,1078,1081,1084,1086,1089,1092,1095,1098,1100,1103,1106,1109,1112,1115,1118,1121,1123,1126,1129,1132,1135,1138,1141,1144,1147,1150,1153,1156,1159,1162,1165,1168,1171,1174,1176,1179,1182,1185,1188,1191,1194,1197,1200,1203,1206,1209],{"slug":793,"name":794},"abel","Jennifer Abel",{"slug":796,"name":797},"allmendinger","Otto Allmendinger",{"slug":799,"name":800},"antony","Ben Antony",{"slug":802,"name":803},"arrasz","Joachim Arrasz",{"slug":805,"name":806},"bauer","David Bauer",{"slug":808,"name":809},"bechtold","Janine Bechtold",{"slug":811,"name":812},"boersig","Jasmin Börsig",{"slug":814,"name":815},"buch","Fabian Buch",{"slug":817,"name":818},"buchloh","Aljona Buchloh",{"slug":820,"name":821},"burgard","Julia Burgard",{"slug":823,"name":824},"caspar-schwedes","Caspar Schwedes",{"slug":826,"name":827},"christina-schmitt","Christina Schmitt",{"slug":829,"name":830},"clausen","Michael Clausen",{"slug":832,"name":833},"contargo_poetzsch","Thomas Pötzsch",{"slug":835,"name":836},"damrath","Sebastian Damrath",{"slug":838,"name":839},"daniel","Markus Daniel",{"slug":841,"name":842},"dasch","Julia Dasch",{"slug":844,"name":845},"denman","Joffrey Denman",{"slug":847,"name":848},"dfuchs","Daniel Fuchs",{"slug":850,"name":851},"dobler","Max Dobler",{"slug":853,"name":854},"dobriakov","Vladimir Dobriakov",{"slug":856,"name":856},"dreiqbik",{"slug":858,"name":859},"dschaefer","Denise Schäfer",{"slug":861,"name":862},"dschneider","Dominik Schneider",{"slug":864,"name":865},"duerlich","Isabell Duerlich",{"slug":867,"name":868},"dutkowski","Bernd Dutkowski",{"slug":870,"name":870},"eifler",{"slug":872,"name":873},"essig","Tim Essig",{"slug":875,"name":876},"ferstl","Maximilian Ferstl",{"slug":878,"name":879},"fey","Prisca Fey",{"slug":881,"name":882},"frank","Leonard Frank",{"slug":884,"name":885},"franke","Arnold Franke",{"slug":887,"name":888},"frischer","Nicolette Rudmann",{"slug":890,"name":891},"fuchs","Petra Fuchs",{"slug":893,"name":894},"gari","Sarah Gari",{"slug":896,"name":897},"gast","Gast",{"slug":899,"name":900},"graf","Johannes Graf",{"slug":902,"name":903},"grammlich","Daniela Grammlich",{"slug":905,"name":906},"guthardt","Sabrina Guthardt",{"slug":908,"name":909},"haeussler","Johannes Häussler",{"slug":911,"name":912},"hammann","Daniel Hammann",{"slug":914,"name":915},"heetel","Julian Heetel",{"slug":917,"name":918},"heft","Florian Heft",{"slug":920,"name":921},"heib","Sebastian Heib",{"slug":923,"name":924},"heisler","Ida Heisler",{"slug":926,"name":927},"helm","Patrick Helm",{"slug":929,"name":930},"herbold","Michael Herbold",{"slug":932,"name":933},"hofmann","Peter Hofmann",{"slug":935,"name":936},"hopf","Florian Hopf",{"slug":938,"name":939},"jaud","Alina Jaud",{"slug":941,"name":942},"jayasinghe","Robin De Silva Jayasinghe",{"slug":944,"name":945},"jbuch","Jonathan Buch",{"slug":947,"name":948},"junghanss","Gitta Junghanß",{"slug":950,"name":951},"kadyietska","Khrystyna Kadyietska",{"slug":953,"name":954},"kannegiesser","Marc Kannegiesser",{"slug":956,"name":957},"karoly","Robert Károly",{"slug":959,"name":960},"karrasz","Katja Arrasz-Schepanski",{"slug":962,"name":963},"kaufmann","Florian Kaufmann",{"slug":965,"name":966},"kesler","Mike Kesler",{"slug":968,"name":969},"kirchgaessner","Bettina Kirchgäßner",{"slug":971,"name":972},"klem","Yannic Klem",{"slug":974,"name":975},"klenk","Timo Klenk",{"slug":977,"name":978},"knell","Tobias Knell",{"slug":980,"name":981},"knoll","Anna-Lena Knoll",{"slug":983,"name":984},"knorre","Matthias Knorre",{"slug":986,"name":987},"koenig","Melanie König",{"slug":989,"name":990},"kraft","Thomas Kraft",{"slug":992,"name":993},"krupicka","Florian Krupicka",{"slug":995,"name":996},"kuehn","Christian Kühn",{"slug":998,"name":999},"lange","Christian Lange",{"slug":1001,"name":1002},"larrasz","Luca Arrasz",{"slug":1004,"name":1005},"leist","Sascha Leist",{"slug":1007,"name":1008},"lihs","Michael Lihs",{"slug":1010,"name":1011},"linsin","David Linsin",{"slug":1013,"name":1014},"maniyar","Christian Maniyar",{"slug":1016,"name":1017},"martin","Björnie",{"slug":1019,"name":1020},"martin-koch","Martin Koch",{"slug":1022,"name":1023},"matt","Tobias Matt",{"slug":1025,"name":1026},"mennerich","Christian Mennerich",{"slug":1028,"name":1029},"menz","Alexander Menz",{"slug":1031,"name":1032},"meseck","Frederick Meseck",{"slug":1034,"name":1035},"messner","Oliver Messner",{"slug":1037,"name":1038},"michael-ploed","Michael Plöd",{"slug":1040,"name":1041},"mies","Marius Mies",{"slug":1043,"name":1044},"mihai","Alina Mihai",{"slug":1046,"name":1047},"moeller","Jörg Möller",{"slug":1049,"name":1050},"mohr","Rebecca Mohr",{"slug":1052,"name":1053},"moretti","David Moretti",{"slug":1055,"name":1056},"mueller","Sven Müller",{"slug":1058,"name":1059},"muessig","Alexander Müssig",{"slug":1061,"name":1062},"neupokoev","Grigory Neupokoev",{"slug":1064,"name":1065},"nussbaecher","Carmen Nussbächer",{"slug":1067,"name":1068},"ochs","Pascal Ochs",{"slug":1070,"name":1071},"oelhoff","Jan Oelhoff",{"slug":1073,"name":1074},"oengel","Yasin Öngel",{"slug":1076,"name":1077},"oezsoy","Enis Özsoy",{"slug":1079,"name":1080},"posch","Maya Posch",{"slug":1082,"name":1083},"ralfmueller","Ralf Müller",{"slug":1085,"name":1085},"redakteur",{"slug":1087,"name":1088},"reich","Michael Reich",{"slug":1090,"name":1091},"reinhard","Karl-Ludwig Reinhard",{"slug":1093,"name":1094},"rmueller","Rebecca Müller",{"slug":1096,"name":1097},"rosum","Jan Rosum",{"slug":1099,"name":1099},"rueckert",{"slug":1101,"name":1102},"ruessel","Sascha Rüssel",{"slug":1104,"name":1105},"sauter","Moritz Sauter",{"slug":1107,"name":1108},"schaefer","Julian Schäfer",{"slug":1110,"name":1111},"scherer","Petra Scherer",{"slug":1113,"name":1114},"schlicht","Anne Schlicht",{"slug":1116,"name":1117},"schmidt","Jürgen Schmidt",{"slug":1119,"name":1120},"schneider","Tobias Schneider",{"slug":9,"name":1122},"Benjamin Seber",{"slug":1124,"name":1125},"sommer","Marc Sommer",{"slug":1127,"name":1128},"speaker-fels","Jakob Fels",{"slug":1130,"name":1131},"speaker-gierke","Oliver Gierke",{"slug":1133,"name":1134},"speaker-krupa","Malte Krupa",{"slug":1136,"name":1137},"speaker-mader","Jochen Mader",{"slug":1139,"name":1140},"speaker-meusel","Tim Meusel",{"slug":1142,"name":1143},"speaker-milke","Oliver Milke",{"slug":1145,"name":1146},"speaker-paluch","Mark Paluch",{"slug":1148,"name":1149},"speaker-schad","Jörg Schad",{"slug":1151,"name":1152},"speaker-schalanda","Jochen Schalanda",{"slug":1154,"name":1155},"speaker-schauder","Jens Schauder",{"slug":1157,"name":1158},"speaker-unterstein","Johannes Unterstein",{"slug":1160,"name":1161},"speaker-wolff","Eberhard Wolff",{"slug":1163,"name":1164},"speaker-zoerner","Stefan Zörner",{"slug":1166,"name":1167},"stefan-belger","Stefan Belger",{"slug":1169,"name":1170},"steinegger","Roland Steinegger",{"slug":1172,"name":1173},"stern","sternchen synyx",{"slug":1175,"name":1175},"synyx",{"slug":1177,"name":1178},"szulc","Mateusz Szulc",{"slug":1180,"name":1181},"tamara","Tamara Tunczinger",{"slug":1183,"name":1184},"theuer","Tobias Theuer",{"slug":1186,"name":1187},"thieme","Sandra Thieme",{"slug":1189,"name":1190},"thies-clasen","Marudor",{"slug":1192,"name":1193},"toernstroem","Olle Törnström",{"slug":1195,"name":1196},"ullinger","Max Ullinger",{"slug":1198,"name":1199},"ulrich","Stephan Ulrich",{"slug":1201,"name":1202},"wagner","Stefan Wagner",{"slug":1204,"name":1205},"weigel","Andreas Weigel",{"slug":1207,"name":1208},"werner","Fabian Werner",{"slug":1210,"name":1211},"wolke","Sören Wolke",["Reactive",1213],{"$scookieConsent":1214,"$ssite-config":1216},{"functional":1215,"analytics":1215},false,{"_priority":1217,"env":1221,"name":1222,"url":1223},{"name":1218,"env":1219,"url":1220},-10,-15,0,"production","nuxt-app","https://synyx.de",["Set"],["ShallowReactive",1226],{"category-progressive-enhancement":-1,"authors":-1},"/blog/tags/progressive-enhancement"]