Note: Most links on this post use the wayback machine to show how a site looked like at the time.

2015

This was when my journey on the web began as I learnt HTML, CSS, JS and PHP. To complete an university assignment of building an IMDB clone site, I used jQuery and Bootstrap. Binding click events with jQuery's $ global and having an entire component show up with only a few bootstrap classes added to the HTML felt amazing.

I used this IMDB clone to land a summer internship at a non-profit where I was introduced to the radical AngularJS. The two way data-binding was magic as were the built in directives for looping over collections (ng-repeat) and binding forms (ng-model). I remember that it was hard for me to understand the AngularJS concepts at first but I also remember how satisfying it felt when I figured it out and wrote my first custom directive to "heart" and "unheart" an item.

2016

I got swept up by the mobile app craze and started focusing on mobile apps. This was when I found React Native. Native like performance on multiple platforms while writing JS felt like it was too good to be true. But I gave it a shot and it was a pivotal choice since it introduced me to React. I really liked working with React so I made it my specialty.

2017

Thanks in part to the React Native app I built, I got myself a position at a software agency. My first task there was to work on an existing mobile app that was built with Ionic and AngularJS. Next we got a project for building a desktop application and I pushed to build the app with React and Electron since most of the devs at the agency were more familiar with web development. Having made a complete mess of managing the state in my React Native app, I also proposed using Redux and Immutable.js for handling the complex data structure the app needed.

Then I moved to a different city and a different agency where I was thrust into a web project built with React and NextJS with the rationale that a pure React app would not be good for SEO. It was the first and only time I found a use for React portals and I used it to build a wrapper around the Google Maps Javascript API since the react-google-maps package ran badly with a large (500+) number of pins. Around this time, GraphQL was catching on since its implementation in React with Apollo Client and Relay were much nicer to work with than using React lifecycle methods or Redux to fetch data from APIs. A senior dev at the agency was a big supporter of GraphQL so in the following React and React Native projects I worked on at the agency, I was pushed into using either Apollo or Relay along with a small package that he wrote which converted all the GraphQL queries into REST API calls since the backend devs were not willing to adopt GraphQL.

2018 - 2020

In late 2018, I started working at a hotel system company. In my first months there, I was tasked with refactoring Immutable.js out of the company's hotel booking web app since they were starting to build their own UI library and the conversions between the Immutable and plain JS structures in the UI library were heavy on the browser.

The company's main product was a hotel management SaaS that started out as an AngularJS app but then became a hodgepodge of AngularJS and React after AngularJS was discontinued and they starting switching to React. Now the engineering management was extremely conservative when it came to adopting anything new so I kept working with React and Redux in JS for most of my time in the company despite my colleagues attempts to adopt Typescript, GraphQL and more. In that time, React went through its largest change yet and introduced hooks which made functional components the standard instead of the class components that used to be the norm.

2020 - 2021

In early 2020, I started working at a PC gaming company where they wanted me to build PC game UIs with React. This was possible due to a UI middleware called Gameface that allowed HTML, CSS and JS to be rendered by a game engine. The UI team who had been working primarily with Scaleform before had chosen React because it was the most established way of building web apps but they were now running into performance issues since React performed badly and had memory leaks when the state was updated rapidly. So they started experimenting with Svelte and SolidJS which promised to be more performant.

Gameface only implemented a subset of the web standards and required the source to be loaded from disk so the company also used Chromium Embedded Framework for things like in-game events that needed to be kept secret from the players. These projects were historically developed by a different team in the company that used Vue and Vuex so I had to pick it up to extend several existing project. I found Vue easier to use than React with how it separated the logic from the template and didn't require immutability.

Towards the end of the 2021, I started building a small cross out calendar app and found that React Native development had become a lot easier with Expo. I also wanted the app to work in the browser, so I used react-native-web to create a web target. To keep backend development to a minimum, I went with Parse

2022

In late 2022, I started working on my own projects and to speed up development and iterate fast, I went with what I knew best which is React. While building my previous app, I found that Parse didn't fit in nicely with React. I was also annoyed by the how the app became a pile of loading spinners since it fetched everything from an API. So I started looking into offline first databases and found CouchDB which I started using with PouchDB. I also returned to React Router and found that it was nothing like the previous version of React Router that I used a few years ago.

Present (2023)

I'm starting to see more complaints about React's performance and developer experience. Many are recommending Vue.js or Svelte instead. There is also a strong movement to reduce client side JS with more being done on the server with "meta frameworks" like Next.js, Astro and Remix.

Conclusion

The way we work on Frontend has changed a lot over the last few years and it will continue to change as new frameworks, libraries and tools keep arriving. No matter how dominant or stable any framework / library / tool might seem, it will either change significantly or die out after a couple of years.

Prabashwara Seneviratne (bash)

Written by

Prabashwara Seneviratne (bash)

Lead frontend developer