0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Tạo Template trong Node.js Bằng Handlebars: Tạo Nội Dung Động Đơn Giản và Linh Hoạt

Đăng vào 1 tháng trước

• 4 phút đọc

Chủ đề:

Node.js

Tạo Template Trong Node.js Với Handlebars

Khi bạn xây dựng một ứng dụng web, việc gửi thư điện tử chào mừng cá nhân hóa cho người dùng mới là rất cần thiết. Nếu bạn trực tiếp nhúng nội dung email trong mã JavaScript, phương pháp này có thể đủ tốt cho các ứng dụng nhỏ, nhưng khi bạn mở rộng quy mô, nó trở nên không hiệu quả.

Handlebars, một công cụ tạo template (templating engine), là giải pháp lý tưởng để giúp bạn:

  • Tạo template có thể tái sử dụng
  • Chèn dữ liệu động vào nội dung
  • Giữ cho mã nguồn sạch sẽ và dễ bảo trì

Trong bài viết này, bạn sẽ tìm hiểu cách sử dụng Handlebars trong Node.js để tạo ra các template, giúp bạn tạo nội dung HTML hoặc văn bản động trở nên đơn giản và linh hoạt hơn.

Cài Đặt Handlebars Trong Node.js

Để bắt đầu sử dụng Handlebars trong Node.js, bạn cần tích hợp nó vào dự án của mình. Hãy làm theo các bước sau:

1. Cài Đặt Handlebars

Mở terminal và chạy lệnh sau để thêm Handlebars vào dự án:

Copy
npm install handlebars

Sau khi cài đặt, bạn đã sẵn sàng để tạo và render template động trong Node.js.

2. Cấu Trúc Dự Án Cơ Bản

Tạo một cấu trúc thư mục đơn giản như sau để làm việc với Handlebars:

Copy
project/
├── templates/
│   └── welcome.hbs
├── index.js
└── package.json

Thư mục templates/ sẽ chứa các tệp Handlebars (.hbs), còn file index.js sẽ đảm nhiệm logic để render template.

Tạo Template Đầu Tiên

Handlebars sử dụng các tệp văn bản với phần mở rộng .hbs, trong đó chứa các biểu thức động (placeholders) được định dạng bằng dấu ngoặc kép {{ }}.

1. Định Nghĩa Template

Bạn tạo file templates/welcome.hbs với nội dung sau:

Copy
<h1>Chào Mừng, {{name}}!</h1>
<p>Cảm ơn bạn đã gia nhập chúng tôi vào {{date}}.</p>

Trong Handlebars, {{name}}{{date}} là các placeholders. Khi template được render, chúng sẽ được thay thế bằng dữ liệu thực tế mà bạn cung cấp.

2. Render Template Trong Node.js

Tiếp theo, bạn sẽ sử dụng Node.js để tải và render template Handlebars. Thêm đoạn mã sau vào file index.js:

Copy
import fs from 'fs';
import handlebars from 'handlebars';

const templateString = fs.readFileSync('./templates/welcome.hbs', 'utf8');
const template = handlebars.compile(templateString);

const data = {
  name: 'Alex',
  date: '24 tháng 2 năm 2025'
};

const output = template(data);
console.log(output);

Chạy lệnh này với node index.js và bạn sẽ thấy:

Copy
<h1>Chào Mừng, Alex!</h1>
<p>Cảm ơn bạn đã gia nhập chúng tôi vào 24 tháng 2 năm 2025.</p>

Hàm compile của Handlebars giúp chuyển template thành một hàm có thể tái sử dụng. Khi bạn truyền vào một đối tượng dữ liệu, nó sẽ thay thế các placeholder ({{ }}) bằng giá trị thực tế.

Làm Việc Với Helpers và Logic Trong Handlebars

Handlebars không chỉ hỗ trợ thay thế dữ liệu đơn giản mà còn cho phép bạn sử dụng logic thông qua các helpers. Bạn có thể sử dụng helpers có sẵn hoặc tự định nghĩa như sau:

1. Sử Dụng Helpers Có Sẵn

Handlebars cung cấp một số helpers tích hợp sẵn, chẳng hạn như:

  • if → Kiểm tra điều kiện
  • each → Lặp qua mảng
  • unless → Ngược lại của if

Ví dụ, để hiển thị danh sách sở thích nếu có, hãy cập nhật file templates/welcome.hbs:

Copy
<h1>Chào Mừng, {{name}}!</h1>
{{#if interests}}
  <p>Sở thích của bạn:</p>
  <ul>
    {{#each interests}}
      <li>{{this}}</li>
    {{/each}}
  </ul>
{{else}}
  <p>Chưa có sở thích nào được liệt kê.</p>
{{/if}}

Cập nhật file index.js để truyền danh sách sở thích:

Copy
const data = {
  name: 'Alex',
  interests: ['lập trình', 'đọc sách', 'đi bộ']
};

const output = template(data);
console.log(output);

Kết quả sẽ là:

Copy
<h1>Chào Mừng, Alex!</h1>
<p>Sở thích của bạn:</p>
<ul>
  <li>lập trình</li>
  <li>đọc sách</li>
  <li>đi bộ</li>
</ul>

Trong Handlebars, helper ifeach giúp bạn xử lý điều kiện và lặp qua danh sách một cách linh hoạt.

Tạo Custom Helper Trong Handlebars

Để mở rộng chức năng của template, bạn có thể tự tạo custom helper. Ví dụ, một helper để viết hoa chữ cái đầu tiên trong tên người dùng:

Copy
import fs from 'fs';
import handlebars from 'handlebars';

handlebars.registerHelper('capitalize', (str) => {
  return str.charAt(0).toUpperCase() + str.slice(1);
});

const templateString = fs.readFileSync('./templates/welcome.hbs', 'utf8');
const template = handlebars.compile(templateString);

const data = { name: 'alex' };
const output = template(data);
console.log(output);

Cập nhật file welcome.hbs để sử dụng custom helper:

Copy
<h1>Chào Mừng, {{capitalize name}}!</h1>

Kết quả sẽ là:

Copy
<h1>Chào Mừng, Alex!</h1>

Custom helpers giúp mở rộng tính năng của Handlebars, giữ cho template sạch sẽ và xử lý các định dạng phức tạp trong mã nguồn.

Tích Hợp Handlebars Với Express

Handlebars tích hợp rất tốt với Express.js, giúp bạn tạo ra các template phía server một cách dễ dàng.

1. Cài Đặt Express và Express-Handlebars

Chạy lệnh sau:

Copy
npm install express express-handlebars

Gói express-handlebars tích hợp Handlebars vào Express một cách dễ dàng.

2. Cấu Hình Express

Thiết lập máy chủ cơ bản trong file index.js:

Copy
import express from 'express';
import { engine } from 'express-handlebars';

const app = express();

app.engine('hbs', engine({ extname: '.hbs' }));
app.set('view engine', 'hbs');
app.set('views', './templates');

app.get('/', (req, res) => {
  res.render('welcome', { name: 'Alex' });
});

app.listen(3000, () => console.log('Server đang chạy trên cổng 3000'));

Đảm bảo bạn đã đặt file welcome.hbs trong thư mục templates. Truy cập vào http://localhost:3000, và bạn sẽ thấy template được hiển thị trực tiếp trên trình duyệt. Phương thức res.render sẽ biên dịch và gửi template cùng với dữ liệu cung cấp, giúp phát triển web trở nên đơn giản hơn.

Lưu ý: Đặt extname: '.hbs' trong tùy chọn của engine để khớp với phần mở rộng tệp của bạn, vì Express mặc định sử dụng .handlebars.

Kết Luận

Qua bài viết này, bạn đã thấy rằng Handlebars giúp bạn quản lý nội dung động một cách dễ dàng, từ việc tạo email chào mừng cho đến các trang HTML hoặc các nội dung văn bản khác. Nó cũng giúp việc duy trì và cập nhật nội dung trở nên thuận tiện hơn thông qua việc tách biệt template khỏi logic, khiến mã nguồn của bạn dễ đọc và bảo trì hơn.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào