monorepo/docs/internal/decisions/initial-technology-selection.md
2024-07-06 11:58:08 -05:00

3.2 KiB

Initial Technology Selection

The technology selected in this project were largely based on my own personal usage and experience. Feel free to drop or replace technologies where you see fit. I tried to keep things it a minimum so there wasn't a lot to consider.

Docker

Docker is a powerful containerization technology that allows you to encapsulate all your dependencies into a single isolated unit. I've been leveraging Docker in development environments since 2014 and have had huge success with making developer environments, richer and easier to work with through containers. Docker makes it easy to encapsulate tools into a single location, removing the need to manage complicated local provisioning scripts that spans various operating systems.

NodeJS

According to IEEE, JavaScript was the 5th most popular programming language used in projects beating out languages like C#, Go, and many others. When it comes to jobs, it's the 4th most popular language that organizations hire for, and is the 3rd when it comes to trending libraries.

A large number of projects are built using JavaScript or one of its variants (e.g TypeScript). Many projects feature "progressive web apps" or "single page applications" to provide a richer client side experience.

In the early days of mobile application programming, writing iOS and Android applications came with a lot of challenge and cost. Companies typically had two teams, building out native experiences for both platforms. As a result, features would often drift between the different types of devices. Through systems like Apache Cordova, JavaScript made its way to mobile devices. While it initially came at a fairly high performance cost, Cordova enabled JavaScript developers to write mobile applications without needing to learn a new programming language. Over time, the community has improved the performance of these types of applications by leveraging new technologies and capabilities.

Eventually, tools like Electron and Tauri brought JavaScript to the desktop. Now, Windows, OSX, and Linux desktop applications could be written using the

Outside it's use in projects, NodeJS and NPM include a large number of useful utility packages, such as prettier and concurrently which makes it great for formatting and linting common file formats (such as javascript, css/less/sass, html, json, graphql, markdown, and yaml). As a result, I often like having NPM at the root to be able to manage the versions of these tools in the repository itself.

PNPM

When working with multiple, large NodeJS code bases, multi-package management becomes a necessity. LernaJS was an early multiple package management solution. While a great initial solution, it lacked a lot features that came with future solutions such as PNPM. PNPM not only makes it easy to manage monorepos while also improving the storage of dependencies in the local file system.