lucavallin
Published on

Modern Frontend Development: A Tooling Overview for Engineers Revisiting the Field

avatar
Name
Luca Cavallin

In the world of frontend development, several of tools and frameworks are available to build efficient, scalable, and interactive web applications. If you've been away from frontend development for a while, you might find the current landscape quite different from what you remember. This blog post will guide you through some of the most popular and effective technologies in modern frontend development, offering insights into their functionalities, advantages, and drawbacks. Additionally, I will include brief code examples to give you a taste of how these tools are used in practice.

The tools I included are the ones I decided to use (after a long investigation) for verto.sh, a web application I built to help developers find a new open-source project to contribute to. I hope this post will help you get up to speed with the latest frontend technologies - as someone who has been away from frontend development for a while, I know how overwhelming it can be to catch up with the latest trends.

Next.js

Next.js is a React-based framework that has gained popularity for its server-side rendering capabilities and efficient static site generation. One of its major strengths is the ease of creating SEO-friendly web pages that load quickly and improve user experience.

Pros:

  • Offers improved SEO and fast rendering.
  • Features like automatic code splitting make it efficient for complex applications.

Cons:

  • The larger bundle size may not be ideal for very simple projects.

Example: Creating a simple Next.js page:

import React from 'react';

export default function HomePage() {
  return <div>Welcome to my Next.js app!</div>;
}

React

React, developed by Facebook, remains a cornerstone in building interactive user interfaces. Its component-based architecture allows for reusable UI components, making it a favorite among developers for both its efficiency and flexibility.

Pros:

  • A large community and a rich ecosystem of libraries and tools.
  • Reusable components enhance development speed and maintainability.

Cons:

  • JSX can be a learning curve for newcomers.

Example: A simple React component:

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

Tailwind CSS

Tailwind CSS is a utility-first CSS framework that encourages a different approach to styling web applications. Instead of writing custom CSS, developers can use predefined classes directly in their HTML.

Pros:

  • Highly customizable and perfect for responsive design.
  • Can lead to smaller CSS file sizes.

Cons:

  • The utility-first approach can be unconventional for those used to traditional CSS.

Example: Styling with Tailwind CSS:

<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  Button
</button>

Framer Motion

Framer Motion is a library designed to add easy-to-implement animations to React applications. It offers a wide range of animation and gesture features, which can greatly enhance the user experience of your application.

Pros:

  • Simplifies the process of adding complex animations.
  • Provides powerful features like gesture animations.

Cons:

  • It might be excessive for simple projects or transitions.

Example: Animating a component with Framer Motion:

import { motion } from 'framer-motion';

export default function MyComponent() {
  return <motion.div animate={{ scale: 2 }}>Hello World</motion.div>;
}

TypeScript

TypeScript extends JavaScript by adding static types. Developed and maintained by Microsoft, it's been widely adopted for its ability to improve the maintainability and scalability of large codebases.

Pros:

  • Enhances code quality and readability.
  • Early detection of bugs and errors.

Cons:

  • Has a learning curve, especially for developers not familiar with static typing.

Example: Defining a TypeScript interface:

interface User {
  name: string;
  age: number;
}

const user: User = {
  name: 'Alice',
  age: 25,
};

GraphQL

GraphQL is a powerful query language for your API, offering a more efficient, powerful, and flexible alternative to REST.

Pros:

  • It allows clients to request exactly the data they need, reducing over-fetching.
  • Strong type system which can help validate queries.

Cons:

  • The initial learning curve and setup can be more complex than traditional REST APIs.

Example: A simple GraphQL query:

{
  user(id: "1") {
    name
    email
  }
}

In this example, the client specifies exactly what information is needed, which can greatly optimize data transfer, especially in applications with complex data requirements.

Jest

Jest is a delightful JavaScript testing framework, known for its simplicity and integration with React and other modern JavaScript frameworks.

Pros:

  • Minimal configuration is required to get started.
  • Offers a robust set of features like snapshot testing and test coverage.

Cons:

  • Advanced mocking and testing scenarios might require additional setup.

Example: Writing a simple test with Jest:

test('adds 1 + 2 to equal 3', () => {
  expect(1 + 2).toBe(3);
});

This example demonstrates a basic Jest test, validating that our arithmetic operation performs as expected. Jest makes it straightforward to write and manage tests, ensuring your codebase remains reliable and bug-free.

Cypress

Cypress is a next-generation front-end testing tool built for the modern web. It’s a more developer-friendly tool for writing end-to-end tests.

Pros:

  • Tests are run in a real browser, providing more accurate results.
  • Offers a rich, interactive test runner that makes debugging easier.

Cons:

  • Can be slower for large test suites and is more resource-intensive.

Example: Basic Cypress test for a login page:

describe('Login Test', () => {
  it('successfully logs in', () => {
    cy.visit('/login');
    cy.get('input[name=username]').type('user');
    cy.get('input[name=password]').type('password');
    cy.get('form').submit();
    cy.url().should('include', '/dashboard');
  });
});

In this example, Cypress is used to simulate a user logging into a web application, demonstrating its power in creating realistic, user-like interactions for testing your applications thoroughly.

Prettier & ESLint

In the less-than-straightforward world of frontend development, it's super important to keep your code clean and consistent. That's where Prettier and ESLint come in. Think of Prettier as your personal stylist for code, tidying up your code's look so you can focus on the nuts and bolts of functionality. Then there's ESLint – it's like having a wise mentor who points out mistakes and keeps you on the right path, ensuring your JavaScript and JSX are top-notch. When you blend Prettier and ESLint in your toolkit, it's like having a dynamic duo that keeps your code looking good and working great, saving you heaps of time in code reviews and debugging. They're pretty much lifesavers in the frontend dev world!

Summary

On our tour of modern frontend development, we've discovered a cool mix of tools that make building awesome web apps a breeze. React and Next.js are the backbone, giving life to our user interfaces. Tailwind CSS and Framer Motion spice things up with style and animations. TypeScript keeps everything tight and tidy, while GraphQL is a great choice for modern data fetching. For testing, Jest and Cypress are our go-to for making sure everything works like a charm. Prettier and ESLint help keep our code looking sharp. Together, these tools are your ticket to top-notch, state-of-the-art web development in 2023.