41554 blogs · [ { "id": "01a087a0-a3c1-70b3-8260-78648e9f7842", "title": "Naming Things: Staying in Line with the System", "url": "https://markus.oberlehner.net/blog/naming-things-staying-in-line-with-the-system/", "published_at": "2020-03-08T05:20:20+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648ed25469", "title": "Naming Your Unit Tests: It Should vs. Given/When/Then", "url": "https://markus.oberlehner.net/blog/naming-your-unit-tests-it-should-vs-given-when-then/", "published_at": "2020-03-01T06:56:56+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648fc191e9", "title": "Weekly Recap: There is no Global State, Technical Debt and Writing Everything Twice", "url": "https://markus.oberlehner.net/blog/weekly-recap-there-is-no-global-state-technical-debt-and-writing-everything-twice/", "published_at": "2020-02-23T07:12:12+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864905b5fc1", "title": "Weekly Recap: Eleventy + Preact, Boring Technology and the Right Amount of Magic", "url": "https://markus.oberlehner.net/blog/weekly-recap-eleventy-preact-boring-technology-and-the-right-amount-of-magic/", "published_at": "2020-02-16T07:43:43+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786490d91b10", "title": "Weekly Recap: Atomic Commits, Legacy Code and Evil String Identifiers", "url": "https://markus.oberlehner.net/blog/weekly-recap-atomic-commits-legacy-code-and-evil-string-identifiers/", "published_at": "2020-02-09T05:44:44+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786491ca27b9", "title": "Vue.js Functional Base Components Powered by CSS Modules", "url": "https://markus.oberlehner.net/blog/vue-functional-base-components-powered-by-css-modules/", "published_at": "2020-02-02T06:29:29+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649213fa53", "title": "Weekly Recap: Data Sanitizing and Reducing Complexity up the Tree", "url": "https://markus.oberlehner.net/blog/weekly-recap-data-sanitizing-and-reducing-complexity-up-the-tree/", "published_at": "2020-01-26T06:18:18+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786492dc25df", "title": "Weekly Recap: Single Parameter Object and Craftsmanship vs. Engineering", "url": "https://markus.oberlehner.net/blog/weekly-recap-single-parameter-object-and-craftsmanship-vs-engineering/", "published_at": "2020-01-19T05:33:33+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786492e71ad8", "title": "Weekly Recap: Less Array.reduce(), SQL and JSON, Dunning-Kruger and Changing Your Mind", "url": "https://markus.oberlehner.net/blog/weekly-recap-less-reduce-sql-and-json-dunning-kruger-and-changing-your-mind/", "published_at": "2020-01-12T05:19:19+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864930bf8f9", "title": "Weekly Recap: Playing with State Machines, Complexity and Best Practices", "url": "https://markus.oberlehner.net/blog/weekly-recap-playing-with-state-machines-complexity-and-best-practices/", "published_at": "2020-01-05T06:48:48+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786493ce7340", "title": "Lazy Resolving Observable API Services with Vue.js", "url": "https://markus.oberlehner.net/blog/lazy-resolving-observable-api-services-with-vue/", "published_at": "2019-12-29T05:14:14+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864943479aa", "title": "Weekly Recap: Simple is Complicated", "url": "https://markus.oberlehner.net/blog/weekly-recap-simple-is-complicated/", "published_at": "2019-12-22T05:25:25+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786494af9b3e", "title": "Weekly Recap: Tight Coupling + Complexity = Errors", "url": "https://markus.oberlehner.net/blog/weekly-recap-tight-coupling-plus-complexity-equals-errors/", "published_at": "2019-12-15T04:50:50+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786494bcd7c4", "title": "Weekly Recap: TDD is dead", "url": "https://markus.oberlehner.net/blog/weekly-recap-tdd-is-dead/", "published_at": "2019-12-08T08:01:01+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786495161085", "title": "Vuex Data Model and Feature Module Strategy Part 2: Feature Modules", "url": "https://markus.oberlehner.net/blog/vuex-data-model-and-feature-module-strategy-feature-modules/", "published_at": "2019-12-01T03:28:28+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786495bc2129", "title": "Vuex Data Model and Feature Module Strategy Part 1: The Data Model Module", "url": "https://markus.oberlehner.net/blog/vuex-data-model-and-feature-module-strategy-data-model-module/", "published_at": "2019-11-24T05:25:25+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786496afdb25", "title": "Thoughts about Utility-First CSS Frameworks", "url": "https://markus.oberlehner.net/blog/thoughts-about-utility-first-css-frameworks/", "published_at": "2019-11-17T03:58:58+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786496bbf2fa", "title": "Reusable Functional Vue.js Components with Tailwind CSS", "url": "https://markus.oberlehner.net/blog/reusable-functional-vue-components-with-tailwind-css/", "published_at": "2019-11-10T03:01:01+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786496d26094", "title": "Setting up Tailwind CSS v2 with Vue.js", "url": "https://markus.oberlehner.net/blog/setting-up-tailwind-css-with-vue/", "published_at": "2019-11-03T04:38:38+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864973aff95", "title": "Simple Solution to Prevent Body Scrolling on iOS", "url": "https://markus.oberlehner.net/blog/simple-solution-to-prevent-body-scrolling-on-ios/", "published_at": "2019-10-30T14:06:06+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786497ea219c", "title": "Scrolling Shadows with Vue.js", "url": "https://markus.oberlehner.net/blog/scrolling-shadows-with-vue/", "published_at": "2019-10-27T05:44:44+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786498770bea", "title": "Popup Overlays with Vue Router and Portal Vue", "url": "https://markus.oberlehner.net/blog/popup-overlays-with-vue-router-and-portal-vue/", "published_at": "2019-10-20T03:42:42+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786498dd61a2", "title": "Dynamic Vue.js CRUD Applications", "url": "https://markus.oberlehner.net/blog/dynamic-vue-crud-applications/", "published_at": "2019-10-13T04:37:37+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786499dac881", "title": "Decouple Vue.js components from the Vuex Store", "url": "https://markus.oberlehner.net/blog/decouple-vue-components-from-the-vuex-store/", "published_at": "2019-10-06T02:39:39+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649a5c87be", "title": "Dependency Injection in Vue.js with Functional Component Factories", "url": "https://markus.oberlehner.net/blog/dependency-injection-in-vue-with-functional-component-factories/", "published_at": "2019-09-29T07:08:08+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649b265277", "title": "Generic Content Vuex Modules", "url": "https://markus.oberlehner.net/blog/generic-content-vuex-modules/", "published_at": "2019-09-22T04:32:32+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649b91f376", "title": "Make your Vuex State Flat: State Normalization with Vuex", "url": "https://markus.oberlehner.net/blog/make-your-vuex-state-flat-state-normalization-with-vuex/", "published_at": "2019-09-15T05:36:36+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649ba255a3", "title": "Controlling the LEGO Mindstorms NXT with Node.js Part 2: It's Moving", "url": "https://markus.oberlehner.net/blog/controlling-the-lego-mindstorms-nxt-with-nodejs-its-moving/", "published_at": "2019-09-08T06:22:22+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649c8ced8f", "title": "Controlling the LEGO Mindstorms NXT with Node.js Part 1: It's Alive", "url": "https://markus.oberlehner.net/blog/controlling-the-lego-mindstorms-nxt-with-nodejs-its-alive/", "published_at": "2019-09-01T07:09:09+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649cd0d628", "title": "Vue.js Powered Data Model and Query Builder", "url": "https://markus.oberlehner.net/blog/vue-powered-data-model-and-query-builder/", "published_at": "2019-08-25T05:45:45+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649db6102b", "title": "Separation of Concerns Re-Revisited", "url": "https://markus.oberlehner.net/blog/separation-of-concerns-re-revisited/", "published_at": "2019-08-18T08:47:47+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649e501dc7", "title": "Vue.js Single File Component Factory", "url": "https://markus.oberlehner.net/blog/vue-single-file-component-factory/", "published_at": "2019-08-11T04:52:52+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649ef4d79e", "title": "Implementing an Authentication Flow with Passport and Netlify Functions", "url": "https://markus.oberlehner.net/blog/implementing-an-authentication-flow-with-passport-and-netlify-functions/", "published_at": "2019-08-04T03:24:24+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78649f2b6e3b", "title": "Accessible Custom Vue.js Select Component Part 2: Advanced", "url": "https://markus.oberlehner.net/blog/accessible-custom-vue-form-select-component-simple-but-advanced/", "published_at": "2019-07-28T04:35:35+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a003bcff", "title": "Accessible Custom Vue.js Select Component Part 1: Simple but Experimental", "url": "https://markus.oberlehner.net/blog/accessible-custom-vue-form-select-component-simple-but-experimental/", "published_at": "2019-07-21T03:16:16+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a0abe65f", "title": "Building Vue.js UI Components With HTML Semantics in Mind", "url": "https://markus.oberlehner.net/blog/building-vue-ui-components-with-html-semantics-in-mind/", "published_at": "2019-07-14T03:09:09+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a12d3d34", "title": "Working With Functional Vue.js Components", "url": "https://markus.oberlehner.net/blog/working-with-functional-vue-components/", "published_at": "2019-07-07T04:25:25+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a1e23ef5", "title": "Multi Export Vue.js Single File Components With Proxy Exports", "url": "https://markus.oberlehner.net/blog/multi-export-vue-single-file-components-with-proxy-exports/", "published_at": "2019-06-30T04:17:17+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a23f7f3e", "title": "Styling HTML Tables: How to Apply Margin, Border and z-index on Table Elements", "url": "https://markus.oberlehner.net/blog/styling-html-tables-how-to-apply-margins-borders-and-z-index-on-table-elements/", "published_at": "2019-06-23T04:49:49+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a337c494", "title": "Use Fragments to Avoid Obsolete GraphQL Fields in Vue.js Applications", "url": "https://markus.oberlehner.net/blog/use-fragments-to-avoid-obsolete-graphql-fields-in-vue-applications/", "published_at": "2019-06-16T04:41:41+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a3de3e1f", "title": "Build Decoupled Vue.js Applications with Hooks", "url": "https://markus.oberlehner.net/blog/build-decoupled-vue-applications-with-hooks/", "published_at": "2019-06-09T04:42:42+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a47edc46", "title": "Observable REST API with Vue.js", "url": "https://markus.oberlehner.net/blog/observable-rest-api-with-vue/", "published_at": "2019-06-02T04:24:24+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a510a820", "title": "Implementing the Builder Pattern in Vue.js Part 2: Forms", "url": "https://markus.oberlehner.net/blog/implementing-the-builder-pattern-in-vue-forms/", "published_at": "2019-05-26T05:02:02+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a511da55", "title": "Implementing the Builder Pattern in Vue.js Part 1: Listings", "url": "https://markus.oberlehner.net/blog/implementing-the-builder-pattern-in-vue-listings/", "published_at": "2019-05-19T04:07:07+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a5940d99", "title": "The IoC Container Pattern with Vue.js", "url": "https://markus.oberlehner.net/blog/the-ioc-container-pattern-with-vue/", "published_at": "2019-05-05T06:45:45+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a61a2086", "title": "try...catch: The Right Way", "url": "https://markus.oberlehner.net/blog/try-catch-the-right-way/", "published_at": "2019-04-28T04:05:05+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a62e9889", "title": "Dependency Injection in Vue.js Applications", "url": "https://markus.oberlehner.net/blog/dependency-injection-in-vue-applications/", "published_at": "2019-04-21T04:23:23+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a7137aac", "title": "Distributed Vue.js Applications Part 2: Pushing Content and Component Updates to the Client", "url": "https://markus.oberlehner.net/blog/distributed-vue-applications-pushing-content-and-component-updates-to-the-client/", "published_at": "2019-04-14T08:38:38+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a7382c31", "title": "Distributed Vue.js Applications Part 1: Loading Components via HTTP", "url": "https://markus.oberlehner.net/blog/distributed-vue-applications-loading-components-via-http/", "published_at": "2019-04-07T05:34:34+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a7fc33b7", "title": "Using Docker to Run Visual Regression Tests with Jest and Puppeteer", "url": "https://markus.oberlehner.net/blog/using-docker-to-run-visual-regression-tests-with-jest-and-puppeteer/", "published_at": "2019-03-31T04:35:35+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a8df4136", "title": "Vue.js Error Handling with Renderless Components", "url": "https://markus.oberlehner.net/blog/vue-error-handling-with-renderless-components/", "published_at": "2019-03-24T03:24:24+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a9ae59b5", "title": "Visual Regression Tests for Vue.Js Applications with Jest and Puppeteer", "url": "https://markus.oberlehner.net/blog/visual-regression-tests-for-vue-applications-with-jest-and-puppeteer/", "published_at": "2019-03-17T04:08:08+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864a9ba82c8", "title": "Renderless Vue.js Lifecycle Hook Components", "url": "https://markus.oberlehner.net/blog/renderless-vue-lifecycle-hook-components/", "published_at": "2019-03-10T04:14:14+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aa595539", "title": "Integration Testing Vue.js Components With Jest and Puppeteer", "url": "https://markus.oberlehner.net/blog/integration-testing-vue-components-with-jest-and-puppeteer/", "published_at": "2019-03-03T03:57:57+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aa6ac380", "title": "Integration Testing Vue.js Container Components With Cypress", "url": "https://markus.oberlehner.net/blog/integration-testing-vue-container-components-with-cypress/", "published_at": "2019-02-24T04:11:11+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aad1f330", "title": "Container Components in Vue.js: Advanced Component Composition", "url": "https://markus.oberlehner.net/blog/advanced-vue-component-composition-with-container-components/", "published_at": "2019-02-17T09:20:20+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aad6dac3", "title": "Reusing Logic With Renderless Vue.js Frame Components", "url": "https://markus.oberlehner.net/blog/reusing-logic-with-renderless-vue-frame-components/", "published_at": "2019-02-10T04:18:18+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aadd52dc", "title": "Multi Export Vue.js Single File UI Components", "url": "https://markus.oberlehner.net/blog/multi-export-vue-single-file-ui-components/", "published_at": "2019-02-03T02:42:42+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864ab56df16", "title": "Magic Numbers in CSS: How to Identify and Fight Them", "url": "https://markus.oberlehner.net/blog/magic-numbers-in-css-how-to-identify-and-fight-them/", "published_at": "2019-01-27T03:36:36+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864ac0c1913", "title": "How to Use GraphQL with Vue Apollo Components and Netlify Functions", "url": "https://markus.oberlehner.net/blog/how-to-use-graphql-with-vue-apollo-components-and-netlify-functions/", "published_at": "2019-01-20T02:56:56+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864acfac9a7", "title": "How to Drastically Reduce Estimated Input Latency and Time to Interactive of SSR Vue.js Applications", "url": "https://markus.oberlehner.net/blog/how-to-drastically-reduce-estimated-input-latency-and-time-to-interactive-of-ssr-vue-applications/", "published_at": "2019-01-13T04:10:10+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864ad5babdd", "title": "Building a Renderless reCAPTCHA v3 Form Component with Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-renderless-recaptcha-v3-form-component-with-vue/", "published_at": "2019-01-06T05:04:04+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864ad8673be", "title": "Lazy Load Vue.js Components When They Become Visible", "url": "https://markus.oberlehner.net/blog/lazy-load-vue-components-when-they-become-visible/", "published_at": "2018-12-30T04:59:59+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864ae6daf15", "title": "Using the Google Maps API with Vue.js", "url": "https://markus.oberlehner.net/blog/using-the-google-maps-api-with-vue/", "published_at": "2018-12-23T04:29:29+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864aea3df23", "title": "abomination: a Concept for a Static HTML / Dynamic JavaScript Hybrid Application", "url": "https://markus.oberlehner.net/blog/abomination-a-concept-for-a-static-html-dynamic-javascript-hybrid-application/", "published_at": "2018-12-16T06:43:43+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864af3b6842", "title": "Variables in Design Systems", "url": "https://markus.oberlehner.net/blog/variables-in-design-systems/", "published_at": "2018-12-09T04:13:13+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864af999737", "title": "Using the Wrapper Factory Pattern for Vue.js Unit Testing", "url": "https://markus.oberlehner.net/blog/using-the-wrapper-factory-pattern-for-vue-unit-testing/", "published_at": "2018-12-02T04:04:04+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864afc10693", "title": "Building a Parallax Scrolling Effect Component with Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-parallax-scrolling-effect-component-with-vue/", "published_at": "2018-11-25T06:54:54+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b024e989", "title": "Building a Static Site with Storyblok and Gridsome", "url": "https://markus.oberlehner.net/blog/building-a-static-site-with-storyblok-and-gridsome/", "published_at": "2018-11-18T04:24:24+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b063d1c4", "title": "Building a Simple Content Slider with Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-simple-content-slider-with-vue/", "published_at": "2018-11-11T04:24:24+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b1417849", "title": "Skeleton Loading Animation with Vue.js", "url": "https://markus.oberlehner.net/blog/skeleton-loading-animation-with-vue/", "published_at": "2018-11-04T03:32:32+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b1b4abec", "title": "Using Location Data with Vue.js and Open Street Map", "url": "https://markus.oberlehner.net/blog/using-location-data-with-vue-and-open-street-map/", "published_at": "2018-10-28T04:28:28+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b1f16482", "title": "Creating PDF Invoices with Airtable, Vue.js and Puppeteer", "url": "https://markus.oberlehner.net/blog/creating-pdf-invoices-with-airtable-vue-and-puppeteer/", "published_at": "2018-10-21T04:41:41+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b261f3e6", "title": "Poor Man's Container Queries: Hide Content Based on the Width of Its Container", "url": "https://markus.oberlehner.net/blog/poor-mans-container-queries-hide-content-based-on-the-width-of-its-container/", "published_at": "2018-10-14T04:45:45+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b2df5b68", "title": "Thoughts About Design Systems and Naming Things", "url": "https://markus.oberlehner.net/blog/thoughts-about-design-systems-and-naming-things/", "published_at": "2018-10-07T04:42:42+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b3bf695f", "title": "How the BEM CSS Naming Scheme Can Improve Vue.js Component Architecture", "url": "https://markus.oberlehner.net/blog/how-the-bem-css-naming-scheme-can-improve-vue-component-architecture/", "published_at": "2018-09-30T10:21:21+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b3f9b4c5", "title": "Implementing a GDPR Consent Workflow with Vue.js", "url": "https://markus.oberlehner.net/blog/implementing-a-gdpr-consent-workflow-with-vue/", "published_at": "2018-09-23T06:56:56+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b42593ad", "title": "Using Cloudinary and Storyblok to Handle Assets for a Vue.js Application", "url": "https://markus.oberlehner.net/blog/using-cloudinary-and-storyblok-to-handle-assets-for-a-vue-application/", "published_at": "2018-09-14T04:51:51+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b4e893e4", "title": "Creating a Responsive Alternating Two Column Layout with Flexbox", "url": "https://markus.oberlehner.net/blog/creating-a-responsive-alternating-two-column-layout-with-flexbox/", "published_at": "2018-09-09T04:05:05+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b5bd1144", "title": "Using Docker to run BackstopJS Powered Visual Regression Tests", "url": "https://markus.oberlehner.net/blog/using-docker-to-run-backstopjs-powered-visual-regression-tests/", "published_at": "2018-09-02T04:11:11+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b66c7c35", "title": "Implementing a Simple Middleware with Vue Router", "url": "https://markus.oberlehner.net/blog/implementing-a-simple-middleware-with-vue-router/", "published_at": "2018-08-26T03:31:31+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b6cd3aea", "title": "Building a Simple Ken Burns Slider with Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-simple-ken-burns-slider-with-vue/", "published_at": "2018-08-19T03:08:08+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b7a669ec", "title": "Automatic SPA FTP Deploys with CircleCI", "url": "https://markus.oberlehner.net/blog/automatic-spa-ftp-deploys-with-circleci/", "published_at": "2018-08-12T04:00:00+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b8433911", "title": "Building a Serverless Comment System with Netlify Functions, Storyblok and Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-serverless-comment-system-with-netlify-functions-storyblok-and-vue/", "published_at": "2018-08-05T04:30:30+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b88d6629", "title": "Vue.js Responsive Image Lazy Loading", "url": "https://markus.oberlehner.net/blog/lazy-loading-responsive-images-with-vue/", "published_at": "2018-07-29T04:30:30+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b8a37b14", "title": "Building a Website with Vue.js, the Storyblok Visual Editor and Netlify", "url": "https://markus.oberlehner.net/blog/building-a-website-with-vue-the-storyblok-visual-editor-and-netlify/", "published_at": "2018-07-22T04:06:06+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b901ee20", "title": "Building a Custom Storyblok Field Type Plugin With Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-custom-storyblok-field-type-plugin-with-vue/", "published_at": "2018-07-15T04:41:41+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b912df46", "title": "Building a Pre-Rendered Website With Nuxt.js and Storyblok", "url": "https://markus.oberlehner.net/blog/building-a-pre-rendered-website-with-nuxt-and-storyblok/", "published_at": "2018-07-08T05:03:03+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864b9f53e6c", "title": "How to Pre-render Vue.js Powered Websites with webpack", "url": "https://markus.oberlehner.net/blog/how-to-pre-render-vue-powered-websites-with-webpack/", "published_at": "2018-07-01T04:18:18+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc4c4f332", "title": "Building Landing Pages with Vue.js and a Headless CMS", "url": "https://markus.oberlehner.net/blog/building-landing-pages-with-vue-and-a-headless-cms/", "published_at": "2018-06-24T04:52:52+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc544a432", "title": "Layouts with Vue.js - How to Create Dynamic Layout Components", "url": "https://markus.oberlehner.net/blog/dynamic-vue-layout-components/", "published_at": "2018-06-17T04:47:47+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc5c8191f", "title": "Vue Router Page Transitions with Fade, Slide and Zoom Effects", "url": "https://markus.oberlehner.net/blog/vue-router-page-transitions/", "published_at": "2018-06-10T08:15:15+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc6b5867e", "title": "Transition to Height Auto With Vue.js", "url": "https://markus.oberlehner.net/blog/transition-to-height-auto-with-vue/", "published_at": "2018-06-03T05:14:14+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc7b1908c", "title": "Should I Store This Data in Vuex – When Should I use Vuex?", "url": "https://markus.oberlehner.net/blog/should-i-store-this-data-in-vuex/", "published_at": "2018-05-27T08:33:33+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc7c7e74b", "title": "Building Renderless Components to Handle CRUD Operations in Vue.js", "url": "https://markus.oberlehner.net/blog/building-renderless-components-to-handle-crud-operations-in-vue/", "published_at": "2018-05-21T06:25:25+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc8870a86", "title": "Building Custom Multi-Option Form Components with Vue.js", "url": "https://markus.oberlehner.net/blog/building-custom-multi-option-form-components-with-vue/", "published_at": "2018-05-06T06:06:42+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc90e78d7", "title": "Replicating the Twitter Tweet Box with Vue.js", "url": "https://markus.oberlehner.net/blog/replicating-the-twitter-tweet-box-with-vue/", "published_at": "2018-04-29T11:32:32+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc9e601cc", "title": "Visual Regression Testing with Nightwatch.js and Cucumber.js", "url": "https://markus.oberlehner.net/blog/visual-regression-testing-with-nightwatch-and-cucumber/", "published_at": "2018-04-22T06:01:12+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbc9efd2e1", "title": "Building a Date Input Component with Vue.js", "url": "https://markus.oberlehner.net/blog/building-a-date-input-component-with-vue/", "published_at": "2018-04-15T08:42:42+00:00" }, { "id": "01a087a0-a3c2-7087-a0e2-78cbca823608", "title": "Crazy Powerful Nightwatch.js Cucumber Step Definitions", "url": "https://markus.oberlehner.net/blog/crazy-powerful-nightwatch-cucumber-step-definitions/", "published_at": "2018-04-08T08:06:31+00:00" } ] posts Claim your blog
Back to markus.oberlehner.net
Blog · corpus.blog/blogs/markus.oberlehner.net/posts

markus.oberlehner.net

markus.oberlehner.net

2020

2019

2018