001Entry
Angular là gì và nên dùng khi nào?
Angular là framework front-end dựa trên TypeScript để xây dựng ứng dụng web có cấu trúc rõ ràng. Nó hợp khi sản phẩm có nhiều màn hình, form, phân quyền, routing, gọi API và cần maintain lâu dài bởi nhiều người.
Điểm mạnh của Angular không chỉ là render UI. Nó đi kèm router, HttpClient, forms, dependency injection, testing utilities và CLI, nên team ít phải tự ráp quá nhiều mảnh rời.
002Entry
Angular khác AngularJS như thế nào?
AngularJS là dòng 1.x, dựa nhiều vào scope, controller và digest cycle. Angular hiện đại là bản viết lại, dùng TypeScript, component tree, dependency injection rõ ràng và build tooling tốt hơn.
Khi phỏng vấn, câu trả lời tốt nên nói thêm về migration: AngularJS thường là legacy, còn Angular hiện đại ưu tiên standalone component, signals, strict typing và SSR/hydration.
003Entry
TypeScript đem lại lợi ích gì cho Angular?
TypeScript giúp phát hiện lỗi sớm bằng kiểu dữ liệu, interface, generic và strict mode. Với Angular, lợi ích này rất rõ ở input/output, service contract, reactive form, route data và response từ API.
Nói đơn giản: TypeScript làm code dễ refactor hơn. Khi đổi model hoặc API, compiler sẽ chỉ ra nhiều chỗ cần sửa trước khi lỗi tới production.
004Entry
Component trong Angular gồm những phần nào?
Một component thường gồm class TypeScript, template HTML, style và metadata trong decorator hoặc API tương đương. Class giữ state và hành vi, template hiển thị UI, style giới hạn phần trình bày.
Một component tốt nên có trách nhiệm rõ. Ví dụ `UserCardComponent` hiển thị user, không nên ôm luôn logic gọi API, phân quyền và xử lý cache phức tạp.
005Entry
Template trong Angular dùng để làm gì?
Template là nơi mô tả UI bằng HTML cộng thêm cú pháp Angular như binding, event, control flow, pipe và projection. Template nên đọc được như giao diện, không phải nơi nhồi business logic.
Nếu biểu thức trong template bắt đầu dài và khó hiểu, nên đưa logic sang computed signal, method đơn giản, pipe hoặc property đã chuẩn hóa trong component.
006Entry
Directive là gì?
Directive là cách Angular gắn thêm hành vi vào element hoặc thay đổi cấu trúc DOM. Component cũng là một loại directive có template riêng.
Có hai nhóm hay gặp: attribute directive như đổi style/hành vi của element, và structural directive như tạo/xóa block giao diện. Với Angular mới, nhiều nhu cầu structural đã được thay bằng control flow `@if`, `@for`, `@switch`.
007Entry
Service là gì?
Service là class chứa logic dùng chung: gọi API, format dữ liệu, quản lý state, kiểm tra quyền, logging hoặc tích hợp browser API. Component dùng service để nhẹ hơn và dễ test hơn.
Không phải logic nào cũng đưa vào service. Nếu logic chỉ phục vụ view nhỏ và không tái sử dụng, giữ trong component vẫn ổn.
008Entry
Dependency Injection giải quyết vấn đề gì?
Dependency Injection giúp class nhận dependency từ Angular injector thay vì tự tạo bằng `new`. Nhờ vậy code dễ test, dễ thay implementation và dễ kiểm soát scope.
Ví dụ component cần `UserApi`, trong test ta có thể thay bằng mock. Trong production Angular cung cấp instance thật theo provider đã khai báo.
009Junior
Standalone component là gì?
Standalone component là component tự khai báo dependency trong `imports` và không cần được khai báo trong NgModule. Đây là hướng mặc định của Angular hiện đại.
Nó làm feature nhỏ gọn hơn: route có thể lazy load trực tiếp component, test setup bớt vòng vèo, và dependency của component nhìn thấy ngay tại chỗ.
@Component({
standalone: true,
selector: 'app-user-card',
imports: [DatePipe],
template: '<p>{{ user.createdAt | date }}</p>'
})
export class UserCardComponent {
user = { createdAt: new Date() };
}
011Junior
Metadata trong Angular là gì?
Metadata là thông tin Angular dùng để hiểu class nên hoạt động ra sao: selector, template, imports, providers, changeDetection, host binding... Nó biến một class TypeScript bình thường thành component, directive, pipe hoặc injectable.
Metadata càng rõ thì component càng dễ đọc. Ví dụ nhìn vào `imports` của standalone component, ta biết ngay template có thể dùng directive/pipe nào.
012Junior
Angular CLI dùng để làm gì?
Angular CLI giúp tạo project, generate component/service/route, chạy dev server, build production, test và update version. Giá trị lớn nhất là chuẩn hóa workflow cho cả team.
Với dự án lớn, CLI còn giúp giữ cấu hình build nhất quán, dùng schematic/migration khi nâng version và giảm rủi ro cấu hình thủ công.
013Junior
AOT và JIT khác nhau thế nào?
JIT biên dịch template khi chạy app, thường phù hợp cho development cũ. AOT biên dịch trước trong quá trình build, giúp phát hiện lỗi template sớm và production chạy nhẹ hơn.
Trong Angular hiện đại, production nên dùng AOT. Khi phỏng vấn, đừng chỉ nói “AOT nhanh hơn”; hãy nói thêm nó giúp type-check template và giảm việc biên dịch ở runtime.
014Junior
Ivy là gì?
Ivy là compiler và runtime engine hiện đại của Angular. Nó giúp build output tối ưu hơn, template type checking tốt hơn, hỗ trợ locality và là nền cho nhiều API mới.
Thông thường không cần dùng Ivy internal API. Senior nên hiểu Ivy để giải thích build, tree shaking, debug stack và migration từ View Engine, nhưng code app nên bám public API.
015Junior
Angular package version nên hiểu thế nào?
Angular dùng semantic versioning: major có thể có thay đổi lớn, minor thêm tính năng tương thích ngược, patch sửa lỗi. Angular core và CLI nên cùng major version.
Theo tài liệu Angular chính thức, Angular phát hành major khoảng mỗi 6 tháng và các major thường được hỗ trợ khoảng 18 tháng. Vì vậy chiến lược update đều đặn quan trọng hơn chờ nhiều năm rồi nhảy version.
016Junior
Strict mode trong Angular có đáng bật không?
Có. Strict mode giúp template type checking, TypeScript strictness và cấu hình build chặt hơn. Nó làm code ban đầu hơi khó tính, nhưng giảm lỗi âm thầm.
Với project mới nên bật strict từ đầu. Với project cũ, nên bật từng phần, sửa theo feature để tránh một PR khổng lồ khó review.
017Middle
Angular application bootstrapping diễn ra như thế nào?
Bootstrapping là quá trình Angular khởi động app, tạo injector gốc, đăng ký provider và render root component. Với standalone app, điểm vào thường là `bootstrapApplication`.
Điều đáng chú ý là provider cấp app nằm ở đây: router, HttpClient, animations, hydration, error handler hoặc config toàn cục.
bootstrapApplication(AppComponent, {
providers: [
provideRouter(routes),
provideHttpClient(withInterceptors([authInterceptor]))
]
});
020Middle
Khi nào nên dùng InjectionToken?
Dùng `InjectionToken` khi dependency không phải class cụ thể, ví dụ config object, base URL, feature flag hoặc interface abstraction.
Nó giúp code rõ contract hơn và test dễ hơn. Thay vì import hằng số khắp nơi, ta inject token và có thể override trong test hoặc theo môi trường.
export const API_URL = new InjectionToken<string>('API_URL');
bootstrapApplication(AppComponent, {
providers: [{ provide: API_URL, useValue: 'https://api.example.com' }]
});