Cách mình giảm build time Angular 50% chỉ bằng 1 thay đổi đơn giản
Bài viết chia sẻ kinh nghiệm thực tế về cách migrate Angular project từ browser builder sang application builder, giúp giảm build time từ 52 phút xuống 26 phút (giảm 50%). Chỉ cần sửa vài dòng trong angular.json, không cần thay đổi code hay dependencies. Đặc biệt hiệu quả cho hotfix khẩn cấp và deploy thường xuyên, giúp tăng năng suất developer và độ hài lòng của team. Bài viết bao gồm hướng dẫn chi tiết từng bước, giải thích kỹ thuật, và best practices để tối ưu build time đến mức tối đa.
Bạn có từng rơi vào tình huống này không? Chạy lệnh ng build --configuration production rồi... đi uống cà phê, ăn trưa, rồi quay lại mà build vẫn chưa xong? 😅
Đó chính xác là vấn đề mà mình đã gặp phải với một Angular project lớn. Mỗi lần build production mất 52 phút - đúng là một cơn ác mộng cho developer, đặc biệt khi cần hotfix khẩn cấp! Nhưng giờ đây, sau một thay đổi đơn giản, build time đã giảm xuống còn 26 phút - tiết kiệm được đúng 50% thời gian!
Hãy cùng mình xem cách làm thế nào nhé! 🚀
Câu chuyện bắt đầu: Khi build time là nỗi ám ảnh
Dự án mình đang làm là một webapp enterprise được code bằng Angular 18, với quy mô khá lớn: hàng trăm components, hàng ngàn files, và nhiều features phức tạp. Mọi thứ đều ổn cho đến khi... build production.
Vấn đề thực tế - Đặc biệt nghiêm trọng với hotfix
Mỗi lần build, mình phải chờ 52 phút. Đúng vậy - gần 1 giờ đồng hồ cho mỗi lần deploy! 😱

Điều này gây ra những hệ quả rất nghiêm trọng, đặc biệt trong các tình huống:
🔥 Hotfix khẩn cấp - Tình huống tồi tệ nhất:
- 🚨 Bug production cần fix ngay → Build mất 52 phút → Khách hàng phải chờ → Stress level tăng vọt!
- 💼 Độ hài lòng của các bên giảm: Product owner, stakeholders phải chờ quá lâu để fix một bug đơn giản
- 😰 Áp lực cao: Developer phải ngồi đợi build trong khi khách hàng đang gặp vấn đề
📊 Ảnh hưởng hàng ngày:
- 🕐 Developer frustration: Mỗi lần deploy là một bài test kiên nhẫn. Bạn fix bug, commit, push, rồi... chờ. Chờ mãi không thấy kết quả.
- 🐌 CI/CD pipeline chậm chạp: Build chạy trên CI server cũng mất gần 1 tiếng, làm chậm toàn bộ release cycle.
- 💸 Chi phí tăng cao: Với cloud CI/CD, thời gian build lâu = tiền bị đốt nhiều hơn.
- 😫 Năng suất giảm: Thay vì code tiếp, mình phải ngồi đợi build xong.
"Phải làm gì đó thôi!" - mình nghĩ vậy và bắt đầu tìm hiểu.
Bước ngoặt: Phát hiện Application Builder
Sau một thời gian research và đọc documentation, mình phát hiện ra rằng từ Angular 17+, Angular team đã giới thiệu một builder mới tên là Application Builder - được thiết kế để thay thế cho Browser Builder cũ kỹ.
Browser Builder vs Application Builder: Cuộc chiến giữa cũ và mới
Để hiểu rõ hơn, mình sẽ giải thích sự khác biệt giữa hai builder này:
Browser Builder (bạn cũ) - @angular-devkit/build-angular:browser:
- 👴 Builder "ông nội" đã có từ những ngày đầu của Angular
- 📦 Dựa trên Webpack với nhiều plugin và loader phức tạp
- 🐢 Build process nhiều bước, không được tối ưu tốt
- ⏳ Chậm, đặc biệt với project lớn
Application Builder (người mới) - @angular-devkit/build-angular:application:
- 🚀 Builder mới được thiết kế lại từ đầu (từ Angular 17+)
- ⚡ Sử dụng công nghệ hiện đại: esbuild (viết bằng Go, siêu nhanh!), Vite-like architecture
- 🎯 Build process được tối ưu, ít bước xử lý hơn
- 💾 Caching thông minh hơn - rebuild chỉ build phần thay đổi
- ✂️ Tree-shaking và code splitting hiệu quả hơn nhiều
Hành trình migrate: Chỉ cần sửa vài dòng code!
Sau khi quyết định migrate, mình bắt đầu thực hiện. Và tin vui là... nó đơn giản hơn mình nghĩ rất nhiều!
Chỉ cần sửa file angular.json - không cần thay đổi code, không cần migrate dependencies phức tạp. Đúng là một cú hích (quick win) đáng giá! 🎯
Bước 1: Thay đổi Builder
Đầu tiên, mở file angular.json và tìm phần architect.build. Đây là những gì bạn cần thay đổi:
Trước khi migrate (Browser Builder):
{
"projects": {
"your-project-name": {
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"main": "projects/your-project/src/main.ts",
"polyfills": "projects/your-project/src/polyfills.ts"
}
}
}
}
}
}
Sau khi migrate (Application Builder):
{
"projects": {
"your-project-name": {
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:application",
"options": {
"browser": "projects/your-project/src/main.ts",
"polyfills": [
"projects/your-project/src/polyfills.ts"
]
}
}
}
}
}
}
Những thay đổi chính:
- ✅
builder: Đổi từbrowser→application - ✅
main→browser: Tên option thay đổi (nhưng vẫn trỏ đến cùng file) - ✅
polyfills: Từ string đơn → array (cho phép thêm nhiều polyfills sau này)
