Next.js đã trở thành một framework được khuyến nghị hàng đầu cho việc phát triển ứng dụng React mới. Với khả năng đơn giản hóa các công việc lặp đi lặp lại, Next.js giúp các nhà phát triển tập trung vào việc viết mã thay vì phải xử lý những công việc nhàm chán. Nhờ vào các tính năng tối ưu hóa hiệu suất và hỗ trợ SEO tốt, nhiều dự án hiện nay trong React đều khuyên dùng Next.js, đặc biệt là cho những ứng dụng quy mô lớn.

Mặc dù Next.js mang lại nhiều lợi ích, nhưng việc nắm vững các khái niệm trong framework này có thể gây khó khăn cho những người mới bắt đầu. Một trong những khía cạnh quan trọng nhưng thường bị bỏ qua chính là Styling.

Note

Tại Sao Styling Quan Trọng?

Styling có vai trò thiết yếu trong việc định hình cách mà người dùng tương tác với ứng dụng. Một thiết kế tốt có thể nâng cao trải nghiệm người dùng, trong khi một thiết kế kém có thể làm giảm sự hấp dẫn và tính khả dụng của ứng dụng. Hơn nữa, việc lựa chọn phương pháp styling phù hợp giúp tổ chức mã nguồn một cách hợp lý, dễ bảo trì và mở rộng trong tương lai. Nhờ vào các phương pháp styling, bạn có thể giảm thiểu xung đột mã và cải thiện tốc độ phát triển.

Next.js hỗ trợ nhiều phương pháp styling khác nhau, từ những phương pháp truyền thống đến các công nghệ hiện đại. Cùng tôi tìm hiểu các phương pháp phổ biến mà chúng ta có thể áp dụng trong ứng dụng Next.js của mình, cùng với các ví dụ cụ thể nhé!

1. Sử dụng Global CSS

1.1. Giới thiệu:

Global CSS (CSS toàn cục) trong phát triển web là một phương pháp áp dụng các quy tắc CSS cho toàn bộ ứng dụng hoặc trang web. Khi định nghĩa một quy tắc CSS trong một file global CSS, các quy tắc này có thể ảnh hưởng đến tất cả các phần tử HTML trên toàn bộ ứng dụng mà không cần phải áp dụng CSS riêng cho từng thành phần (component).

Để sử dụng Global CSS, các quy tắc được định nghĩa sẽ có hiệu lực trên tất cả các trang và component. Điều này có thể được thực hiện bằng cách thêm một file .css vào dự án và nhập nó vào nơi cần thiết, thường là ở đầu file HTML hoặc ở tệp cấp cao nhất của ứng dụng (ví dụ: trong Next.js, thường sẽ được import vào tệp _app.js).

1.2. Ví dụ:

import '../styles/global.css';

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

export default MyApp;
pages/_app.js
body {
  font-family: Arial, sans-serif;
  background-color: #f0f0f0;
  color: #333;
}
styles/global.css

1.3. Ưu điểm:

  • Dễ thiết lập và sử dụng cho các kiểu chung.
  • Tối ưu cho các thiết lập cơ bản như typography và màu sắc nền.

1.4. Nhược điểm:

  • Không hỗ trợ scoped styles, dễ dẫn đến xung đột tên lớp.
  • Quá trình bảo trì có thể phức tạp khi ứng dụng mở rộng.

1.5 Lời khuyên:

Phù hợp cho các ứng dụng nhỏ hoặc khi cần thiết lập nhanh chóng các kiểu chung.

2. Sử dụng SASS/SCSS

2.1. Giới thiệu:

SASS (Syntactically Awesome Stylesheets) là một preprocessor CSS, cung cấp cú pháp mở rộng cho CSS, giúp việc viết mã CSS trở nên mạnh mẽ, dễ quản lý và có tổ chức hơn. SCSS (Sassy CSS) là một cú pháp của SASS nhưng gần giống với CSS truyền thống hơn. Cả SASS và SCSS đều bổ sung các tính năng mạnh mẽ như biến, lồng ghép, mixin, kế thừa,… giúp tăng hiệu quả khi phát triển giao diện.

SASS và SCSS được sử dụng rộng rãi trong các dự án lớn, nơi CSS thông thường trở nên khó quản lý. SCSS là phiên bản cú pháp gần với CSS hơn và phổ biến hơn vì nó dễ chuyển đổi từ CSS truyền thống.

2.2. Ví dụ:

Cài đặt: npm install sass

$primary-color: #0070f3;

body {
  font-family: Arial, sans-serif;
  color: $primary-color;

  a {
    color: $primary-color;
    text-decoration: none;

    &:hover {
      text-decoration: underline;
    }
  }
}
styles/global.scss

2.3. Ưu điểm:

  • Tổ chức mã tốt hơn nhờ vào khả năng chia nhỏ thành nhiều tệp.
  • Tính năng nâng cao giúp tái sử dụng mã hiệu quả.

2.4. Nhược điểm:

  • Cần biên dịch, có thể làm chậm quá trình phát triển.
  • Có thể phức tạp hơn cho những người mới.

2.5. Lời khuyên:

Phù hợp cho các ứng dụng nhỏ hoặc khi cần thiết lập nhanh chóng các kiểu chung.

3. Sử dụng Component-Level SASS/SCSS

3.1. Giới thiệu:

Component-Level SASS/SCSS là phương pháp tổ chức và sử dụng SASS/SCSS ở cấp độ từng thành phần (component) trong các dự án front-end hiện đại, đặc biệt khi sử dụng các framework như NexJS, Angular, hay Vue. Thay vì viết tất cả các mã CSS/SASS vào một file chung, chúng ta có thể chia nhỏ SASS/SCSS cho từng component riêng lẻ. Điều này giúp mã trở nên rõ ràng, dễ bảo trì và dễ dàng quản lý hơn.

3.2. Ví dụ:

$btn-bg-color: blue;

.btn {
  background-color: $btn-bg-color;
  color: white;
  padding: 10px;
  border: none;
  border-radius: 5px;

  &:hover {
    background-color: darken($btn-bg-color, 10%);
  }
}
styles/Button.module.scss
import styles from './Button.module.scss';

const Button = () => {
  return <button className={styles.btn}>Click me</button>;
};

export default Button;
components/Button.js

3.3. Ưu điểm:

  • Scoped styles giúp giảm xung đột.
  • Có thể tận dụng tính năng của SASS cho từng component.

3.4. Nhược điểm:

Quản lý nhiều tệp có thể trở nên khó khăn.

3.5. Lời khuyên:

Phù hợp cho các ứng dụng lớn với nhiều component độc lập, giúp dễ dàng bảo trì.

4. Component Level CSS (CSS Modules)

4.1. Giới thiệu:

CSS Modules là một phương pháp dùng để áp dụng và quản lý CSS trong các dự án phát triển web, đặc biệt là các dự án sử dụng JavaScript frameworks. CSS Modules cung cấp tính năng scoping (phạm vi) cho các style, nghĩa là các lớp CSS (class) được định nghĩa trong file CSS sẽ chỉ áp dụng cho một component cụ thể, tránh xung đột với các lớp khác trong dự án.

4.2. Ví dụ:

.btn {
  background-color: blue;
  color: white;
  padding: 10px;
  border-radius: 5px;
}
styles/Button.module.css

4.3. Ưu điểm:

  • Giảm xung đột và dễ dàng quản lý.
  • Tái sử dụng styles cho các component khác mà không lo về xung đột.

4.4. Nhược điểm

Không hỗ trợ các tính năng nâng cao như SASS.

4.5. Lời khuyên:

Phù hợp cho các ứng dụng lớn với nhiều component độc lập, giúp dễ dàng bảo trì.

5. Styled-Components

5.1. Giới thiệu:

Styled-Components là một thư viện phổ biến trong React và các framework JavaScript khác, cho phép bạn viết CSS trực tiếp trong các file JavaScript như các thành phần của component. Styled-Components giúp tạo ra các component được styling động, dễ quản lý, và có phạm vi cụ thể cho từng component.
Styled-Components tạo ra một thẻ <style> trong đầu trang HTML và gán các class CSS duy nhất cho mỗi thành phần, bảo đảm rằng các style chỉ áp dụng cho thành phần đó.

5.2. Ví dụ:

Cài đặt: npm install styled-components

import styled from 'styled-components';

const Button = styled.button`
  background-color: blue;
  color: white;
  padding: 10px;
  border-radius: 5px;

  &:hover {
    background-color: darkblue;
  }
`;

export default Button;
components/Button.js

5.3. Ưu điểm:

  • Tính năng động, dễ dàng thay đổi kiểu dựa trên props.
  • Tích hợp dễ dàng với React.

5.4. Nhược điểm:

  • Kích thước tệp lớn hơn do cần thêm thư viện.
  • Cần thời gian để tối ưu hóa hiệu suất.

5.5. Lời khuyên:

Thích hợp cho các ứng dụng cần tính linh hoạt và khả năng mở rộng cao.

6. Styled JSX

6.1. Giới thiệu:

Styled JSX là một thư viện CSS-in-JS được tích hợp sẵn trong framework Next.js, cho phép bạn viết CSS theo kiểu phạm vi cụ thể (scoped CSS) cho từng component trong ứng dụng React. Với Styled JSX, bạn có thể viết CSS trong các component và nó sẽ chỉ áp dụng cho component đó, giúp tránh xung đột với các phần khác của trang web.

6.2. Ví dụ:

const Button = () => {
  return (
    <>
      <button>Click me</button>
      <style jsx>{`
        button {
          background-color: blue;
          color: white;
          padding: 10px;
          border-radius: 5px;
        }
        button:hover {
          background-color: darkblue;
        }
      `}</style>
    </>
  );
};

export default Button;
components/Button.js

6.3. Ưu điểm:

  • Dễ dàng sử dụng với Next.js.
  • Styles được scoped tự động.

6.4. Nhược điểm

  • Khó khăn hơn khi cần chia sẻ styles giữa các component.

6.5. Lời khuyên:

Tốt cho các component nhỏ hoặc khi bạn cần nhanh chóng tạo ra các thành phần mà không cần quản lý nhiều tệp CSS.

7. Emotion

7.1. Giới thiệu:

Emotion là một thư viện CSS-in-JS mạnh mẽ dành cho React, NextJS và JavaScript. Cho phép bạn viết CSS trực tiếp trong JavaScript bằng cách sử dụng cú pháp CSS hoặc JavaScript. Nó hỗ trợ style động và có hiệu suất cao, giúp phát triển ứng dụng linh hoạt và dễ bảo trì hơn.

7.2. Ví dụ:

Cài đặt: npm install @emotion/react @emotion/styled

import { css } from '@emotion/react';

const Button = () => {
  return (
    <button
      css={css`
        background-color: blue;
        color: white;
        padding: 10px;
        border-radius: 5px;

        &:hover {
          background-color: darkblue;
        }
      `}
    >
      Click me
    </button>
  );
};

export default Button;
demo.js

7.3. Ưu điểm:

  • Linh hoạt và mạnh mẽ: Hỗ trợ theming và các kiểu động.
  • Tối ưu hóa hiệu suất: Emotion tự động loại bỏ CSS không sử dụng, giúp giảm kích thước tệp.

7.4. Nhược điểm

  • Kích thước tệp lớn hơn: Cần thêm thư viện, có thể làm tăng kích thước tệp.
  • Khó khăn trong việc học: Một số người mới có thể thấy Emotion phức tạp hơn.

Tổng kết

Việc lựa chọn phương pháp styling nào trong Next.js phụ thuộc vào nhiều yếu tố, bao gồm quy mô dự án, đội ngũ phát triển, và yêu cầu cụ thể của ứng dụng. Mỗi phương pháp đều có ưu và nhược điểm riêng, và việc hiểu rõ chúng sẽ giúp chúng ta đưa ra quyết định sáng suốt.

Tip

Global CSS phù hợp cho các ứng dụng nhỏ, nhưng có thể gây ra xung đột khi ứng dụng mở rộng.
SASS/SCSS mang lại tính năng nâng cao và tổ chức mã tốt, nhưng có thể phức tạp cho người mới.
CSS ModulesComponent-Level SASS cung cấp khả năng scoped styles, giúp giảm xung đột.
Styled-ComponentsEmotion là những giải pháp CSS-in-JS mạnh mẽ, phù hợp cho các ứng dụng hiện đại cần tính linh hoạt cao.

Hãy thử nghiệm với các phương pháp khác nhau để tìm ra cách tiếp cận phù hợp nhất cho dự án của bạn. Việc nắm bắt các khái niệm này không chỉ giúp bạn cải thiện quy trình phát triển mà còn nâng cao trải nghiệm người dùng trong ứng dụng. Chọn Next.js, bạn đang bước vào một thế giới đầy tiềm năng cho các ứng dụng React hiện đại. Hãy theo dõi và chờ đón các bài viết tiếp theo của tôi nhé!