Trong bài viết này, ITviec sẽ cung cấp những câu hỏi phỏng vấn Front End dành cho Front End Developer, Web Developer,… với đầy đủ các kiến thức: HTML, CSS, JavaScript, Framework, Thư viện Frontend,… Dù bạn là người mới hay là người đã có kinh nghiệm, những câu hỏi phỏng vấn Front End kèm theo câu trả lời chi tiết sau đây đều rất cần thiết và có thể giúp bạn ghi điểm với nhà tuyển dụng.

Đọc bài viết để hiểu rõ hơn:

  • Frontend là gì? Frontend Developer là gì?
  • Câu hỏi phỏng vấn Front end về HTML và CSS
  • Câu hỏi phỏng vấn Front end về JavaScript
  • Câu hỏi phỏng vấn Front end về Framework và thư viện
  • Câu hỏi phỏng vấn Front end về quy trình lập trình và công cụ

Frontend là gì? Frontend Developer là gì?

Lập trình Frontend là tạo ra giao diện người dùng (UI) của các trang web. Nó liên quan đến việc hiển thị dữ liệu do backend gửi lên theo một định dạng tương tác và dễ đọc. Một lập trình viên Frontend – Frontend Developer là người làm việc với Designer và Backend Developer để tạo ra UI của một trang web. 

Các lập trình viên Frontend sử dụng các ngôn ngữ lập trình và framework để tạo ra những gì người dùng trải nghiệm trong trình duyệt, đảm bảo trải nghiệm người dùng tuyệt vời.

Trước khi đi chi tiết vào danh sách các câu hỏi phỏng vấn Front end phổ biến nhất, bạn có thể “ôn tập” với các bài viết sau đây:

Câu hỏi phỏng vấn Front end về HTML và CSS

Thẻ meta trong HTML là gì?

Thẻ <meta> là những dòng mã nhỏ được đặt trong phần <head> của một trang HTML.

Chúng đóng vai trò như những “dấu hiệu” cung cấp thông tin về trang web cho các công cụ tìm kiếm (Google, Bing) và trình duyệt. Nhờ đó, các công cụ này có thể hiểu rõ hơn về nội dung của trang, từ đó xếp hạng trang web tốt hơn trong kết quả tìm kiếm và hiển thị trang một cách phù hợp trên các thiết bị khác nhau.

Các thành phần ngữ nghĩa trong HTML là gì?

Các phần tử ngữ nghĩa trong HTML là các phần tử chứa ý nghĩa của nội dung và cấu trúc của tài liệu HTML. Những phần tử này chứa nội dung có liên quan đến tên của chúng hoặc phản ánh tên của chúng.

Ví dụ: Những thẻ bố cục trang như Header (Đầu trang), Main (Nội dung chính), Section (Phần), Article (Bài viết), Aside (Bên lề), Footer (Chân trang),… ngoài ra còn những thẻ cho nội dung trang như figure (hình ảnh, biểu đồ), time (thời gian), details (thẻ chi tiết có thể mở rộng nội dung), summary (tóm tắt cho nội dung),…

Bạn hiểu như thế nào về các thuộc tính id và class trong HTML?

Một id là một định danh duy nhất, nghĩa là trong một trang HTML, mỗi id chỉ được sử dụng một lần. Trong khi đó, một class là một định danh có thể được áp dụng cho nhiều phần tử. Điều này có nghĩa là bạn có thể gán cùng một class cho nhiều phần tử khác nhau.

Thông thường, một id sẽ được sử dụng khi cần định địa chỉ một phần tử duy nhất thông qua CSS hoặc JavaScript. Ngược lại, bạn sẽ muốn sử dụng một class khi cần định địa chỉ một nhóm các phần tử DOM.

Ví dụ:

<h1 id="heading1">Đây là tiêu đề chính</h1>

<p class="paragraph">Đây là một đoạn văn bản.</p>

<p class="paragraph">Đây là một đoạn văn bản khác cùng class.</p>

Trong ví dụ trên:

  • Phần tử <h1> có id là “heading1” và sẽ được định dạng riêng biệt.
  • Cả hai phần tử <p> đều có class là “paragraph” và sẽ được định dạng giống nhau.

Phân biệt giữa div và span?

Thẻ div và span là hai thẻ thường được sử dụng để nhóm các phần tử HTML lại với nhau, tuy nhiên chúng có những đặc điểm và cách sử dụng khác nhau.

DIV SPAN
Được sử dụng để tách các phần tử là block-line, ngắt dòng trước và sau nó. Được sử dụng để nhóm các phần tử nội tuyến trong tài liệu HTML.
Chứa các thuộc tính chung cho các phần tử cụ thể trong tài liệu HTML. Bao gồm các thuộc tính nhất định, toàn cục và sự kiện.
Đôi khi thẻ para <P> được sử dụng cho phần bên trong của thẻ <div>. Thẻ <span> được sử dụng để sử dụng kiểu CSS cho một số từ nhất định với bộ phông chữ đã chọn.
Trong thẻ div, chúng ta sử dụng đường viền có chiều rộng chiều cao với các pixel màu được chỉ định để làm nổi bật phần giao diện của tài liệu. Trong thẻ span, chúng ta sử dụng mã màu được chỉ định để mô tả tài liệu giao diện người dùng.

Đọc thêm: Thẻ div trong HTML: Định nghĩa và Tổng hợp cách sử dụng

Doctype có chức năng gì?

Khai báo kiểu tài liệu HTML hay còn gọi là DOCTYPE (Document Type Declaration) là dòng mã đầu tiên bắt buộc trong mỗi tài liệu HTML hoặc XHTML.

Khai báo DOCTYPE hướng dẫn trình duyệt về phiên bản HTML mà trang đang sử dụng, giúp đảm bảo trang web được phân tích và hiển thị nhất quán trên các trình duyệt khác nhau.

Sự khác biệt giữa thẻ (tags) và thuộc tính (attributes) trong HTML là gì?

Các thẻ (tags) xác định các phần tử trên trang và bao quanh nội dung bên trong (nếu có), thường bao gồm thẻ mở và thẻ đóng. Có một số thẻ tự đóng ví dụ như <img />. Thuộc tính (attributes) là cặp giá trị đi kèm với các thẻ và được khai báo trong thẻ mở. Các thuộc tính phổ biến bao gồm id (phải là duy nhất để xác định một phần tử trên trang), class và style. 

Ví dụ:

<p style=“color:blue;”>Đây là một đoạn văn</p>.

Trong đó, “p” là thẻ, còn “style” là thuộc tính.

Đọc thêm: Tổng hợp 70+ các thẻ trong HTML thông dụng

“Box model” CSS là gì và các thành phần bố cục tạo nên nó?

CSS box model là khái niệm mô tả cấu trúc hình chữ nhật của các phần tử trong DOM, được dùng để xác định bố cục của các phần tử trên trang web. Mô hình này bao gồm các lớp sau:

  • Content: Phần bên trong cùng, nơi chứa nội dung như văn bản và hình ảnh.
  • Padding: Khoảng trống giữa nội dung và đường viền.
  • Border: Đường viền bao quanh phần padding của phần tử.
  • Margin: Khoảng cách bên ngoài đường viền, tách phần tử ra khỏi các phần tử khác.

Ảnh minh hoạ

Việc kiểm soát từng lớp này một cách độc lập giúp bạn tùy chỉnh giao diện và khoảng cách của từng phần tử trong giao diện người dùng. Box model CSS được sử dụng để định hình bố cục trang bằng cách điều chỉnh các thuộc tính bao quanh nội dung của phần tử, bao gồm các giá trị của margin, border, và padding ở các phía.

Bộ chọn CSS cụ thể là gì và nó hoạt động như thế nào?

CSS cung cấp nhiều bộ chọn (selector) khác nhau để chọn các phần tử HTML và tạo kiểu cho chúng theo yêu cầu. Các bộ chọn CSS bao gồm bộ chọn phần tử (element selector), bộ chọn lớp (class selector) và bộ chọn ID (ID selector).

Cách hoạt động của từng bộ chọn CSS như sau:

  • Bộ chọn phần tử (Element selector): Chọn trực tiếp bằng cách sử dụng tên của phần tử.
  • Bộ chọn ID (ID selector): Định nghĩa thuộc tính ID và chọn bằng cách sử dụng ký hiệu # trước giá trị của thuộc tính ID.
  • Bộ chọn lớp (Class selector): Định nghĩa thuộc tính lớp và chọn bằng cách sử dụng ký hiệu . trước giá trị của thuộc tính lớp.
  • Bộ chọn toàn cầu (Universal Selector): Chọn bằng ký hiệu *.
  • Bộ chọn thuộc tính (Attribute Selector): Chọn các phần tử dựa trên giá trị của thuộc tính. Ví dụ: input[type=”text”]{}.
  • Bộ chọn con trực tiếp (Direct Child Selector): Chọn phần tử bằng bất kỳ bộ chọn nào trên đây và sử dụng ký hiệu > để chọn con trực tiếp. Ví dụ: parent > child{}.
  • Bộ chọn giả (Pseudo Selectors): Các bộ chọn như :hover, :nth-child(), ::after, ::before,…

Sự khác nhau giữa margin và padding là gì?

Sự khác biệt chính giữa padding và margin là margin ảnh hưởng đến khoảng cách xung quanh một phần tử, trong khi padding kiểm soát khoảng cách bên trong phần tử. Như vậy, nếu muốn thay đổi vị trí của một phần tử so với bố cục trang hoặc thiết lập khoảng cách giữa các phần tử liền kề, bạn nên sử dụng margin. Ngược lại, nếu muốn thay đổi vị trí của nội dung bên trong đường viền của phần tử, bạn nên thiết lập padding.

Bảng bên dưới có thể giúp bạn hình dung rõ ràng hơn sự khác nhau giữa Margin và Padding.

Margin Padding
Là khoảng cách bên ngoài của một phần tử trên trang.  Xác định khoảng cách xung quanh nội dung bên trong một phần tử web.
Kiểm soát khoảng cách giữa các phần tử riêng biệt trên trang.  Thiết lập khoảng cách giữa nội dung và đường viền của phần tử chứa nó.
Có thể đặt margin thành auto, áp dụng cho tất cả các phần tử.  Không thể thiết lập tự động cho các thuộc tính padding trong CSS.
Có thể nhận giá trị âm để chồng lấn các phần tử.  Không thể nhận giá trị âm.
Không bị ảnh hưởng bởi kiểu dáng của các phần tử khác. Có thể kế thừa kiểu dáng của các phần tử khác.
Ảnh hưởng đến các phần tử liền kề.  Không ảnh hưởng đến các phần tử khác.

Bộ tiền xử lý CSS là gì? Bạn có thể kể tên một số bộ tiền xử lý phổ biến không?

Bộ tiền xử lý CSS (CSS Preprocessor) là công cụ cho phép viết code CSS với cú pháp mở rộng và các tính năng bổ sung mà CSS thông thường không có như biến, vòng lặp, hàm, kế thừa và các toán tử. Sau đó, code này sẽ được biên dịch thành CSS thuần để trình duyệt có thể hiểu và sử dụng. 

Mỗi bộ tiền xử lý có đặc điểm riêng phù hợp với các nhu cầu khác nhau trong lập trình web. Một số bộ tiền xử lý CSS phổ biến gồm:

  • SASS/SCSS: Hỗ trợ cú pháp giống CSS tiêu chuẩn (SCSS) và cú pháp dựa trên thụt lề (SASS).
  • LESS: Có cú pháp khá giống với CSS, tích hợp tốt với JavaScript.
  • Stylus: Cung cấp cú pháp linh hoạt và ngắn gọn, cho phép bỏ qua dấu ngoặc và dấu chấm phẩy.

Sự khác biệt giữa các phần tử inline, inline-block và block là gì?

Trong CSS, sự khác biệt giữa các phần tử inline, inline-block và block nằm ở cách chúng được hiển thị trên trang web:

  • Inline: Các phần tử inline không có chiều rộng hoặc chiều cao cụ thể. Chúng không bắt đầu trên một dòng mới và chỉ chiếm không gian cần thiết dựa trên nội dung của chúng. Ví dụ: <span>, <a>.
  • Inline-block: Tương tự như phần tử inline, các phần tử DOM này không bắt đầu trên một dòng mới, tuy nhiên, bạn có thể đặt chiều rộng và chiều cao cho chúng. Ví dụ: <img>.
  • Block: Các phần tử block bắt đầu trên một dòng mới, mặc định chiếm toàn bộ chiều rộng có sẵn. Bạn có thể đặt chiều rộng và chiều cao cho chúng. Ví dụ: <div>, <p>.

Câu hỏi phỏng vấn Front end về JavaScript

JavaScript là gì?

JavaScript là ngôn ngữ kịch bản cấp cao và có kiểu dữ liệu động. Ngôn ngữ này được sử dụng để thêm các thành phần và hiệu ứng động vào tài liệu HTML, giúp trang web trở nên tương tác và thu hút hơn. 

JavaScript có thể được ứng dụng ở cả phía giao diện người dùng (frontend) và phía máy chủ (backend). Hiện nay có rất nhiều framework và thư viện JavaScript phổ biến hỗ trợ lập trình Frontend, chẳng hạn ReactJS, Vue.js, AngularJS, Next.js,… Trong đó, Node.js là framework JavaScript nổi bật được sử dụng cho phát triển backend.

Có bao nhiêu kiểu dữ liệu trong JavaScript?

JavaScript có tám kiểu dữ liệu chính, được chia thành hai loại: kiểu dữ liệu nguyên thủy (primitive) và kiểu dữ liệu tham chiếu (reference).

Trong JavaScript, có 8 kiểu dữ liệu chính: String, Number, Boolean, Undefined, Null, Symbol, BigInt, Object. 

  • String: Dùng để biểu diễn chuỗi văn bản. Ví dụ: “Hello, World!”.
  • Number: Dùng để biểu diễn các số, bao gồm cả số nguyên và số thực. Ví dụ: 42, 3.14.
  • Boolean: Chỉ có hai giá trị là true và false, thường được sử dụng trong các biểu thức điều kiện.
  • Undefined: Một biến chưa được gán giá trị sẽ có kiểu dữ liệu là undefined.
  • Null: Biểu thị cho một giá trị “trống” hoặc “không tồn tại”. Kiểu dữ liệu này được định nghĩa bằng từ khóa null.
  • Symbol: Một kiểu dữ liệu đặc biệt dùng để tạo ra các giá trị duy nhất không thể thay thế, được giới thiệu trong ECMAScript 6.
  • BigInt: Dùng để biểu diễn các số nguyên rất lớn, lớn hơn giới hạn của kiểu Number. Được giới thiệu trong ECMAScript 2020.
  • Object: Đây là kiểu dữ liệu phức tạp, cho phép lưu trữ nhiều giá trị và các kiểu dữ liệu khác nhau dưới dạng cặp khóa-giá trị. Ví dụ: { name: “Alice”, age: 30 }.

Ngoài ra, JavaScript cũng hỗ trợ các kiểu dữ liệu phức hợp như mảng (Array), hàm (Function), Date, RegExp,…

Có những cách nào để tạo đối tượng trong JavaScript?

Các đối tượng trong JavaScript có thể được tạo theo nhiều cách khác nhau. Sau đây là một số cách thường gặp nhất:

Sử dụng Cú pháp Đối tượng (Object Literal)

let obj = {}

Sử dụng Hàm Khởi tạo (Construction Function)

function Student(name, class) {

    this.name = name;

    this.class = class;

}

let obj = new Student("Neha", 8);

Sử dụng Phương thức Object.create()

const obj = Object.create(prototype);

Sử dụng Lớp (Class)

class Student {    

    constructor(name, class) {

        this.name = name;    

        this.class = class;

    }

}

let obj = new Student("Neha", 8);

Sử dụng Hàm Khởi tạo Object

let obj = new Object();

obj.name = "Neha";

Sự khác nhau giữa == và === trong JavaScript là gì?

Toán tử == được biết đến là toán tử so sánh bằng hai trong JavaScript, trong khi === là toán tử so sánh bằng ba.

Cả hai toán tử này đều là các toán tử so sánh và được sử dụng để so sánh giá trị của các toán hạng.

Tuy nhiên, toán tử == chỉ kiểm tra giá trị của các toán hạng và trả về true nếu các giá trị giống nhau. Ngược lại, toán tử === không chỉ kiểm tra giá trị của các toán hạng mà còn kiểm tra kiểu dữ liệu của chúng. Nó chỉ trả về true nếu cả giá trị và kiểu của các toán hạng giống nhau.

Bạn hiểu như thế nào về biến trong JavaScript? Sự khác biệt giữa var, let, và const là gì?

Trong JavaScript, biến là một khái niệm cho phép lập trình viên lưu trữ dữ liệu mà có thể được truy cập và thay đổi trong suốt chương trình. Có ba cách chính để khai báo biến là var, let và const.

Kiểu biến Phạm vi Hoisting Cập nhật
var Phạm vi toàn cục hoặc phạm vi hàm. 

– Nếu biến được khai báo bên ngoài một hàm, nó có thể được truy cập từ bất kỳ đâu trong chương trình.

– Nếu được khai báo trong một hàm, nó chỉ có thể được truy cập trong hàm đó

Được hoisted lên đầu phạm vi của nó. Điều này có nghĩa là bạn có thể sử dụng biến trước khi khai báo mà không gặp lỗi. Giá trị của biến var có thể được thay đổi sau khi đã khai báo.
let Phạm vi khối (block scope). 

Điều này có nghĩa là biến khai báo bằng let chỉ có thể được truy cập trong khối code (ví dụ: trong {}) nơi nó được khai báo.

Bị hoisted, nhưng không thể sử dụng trước khi khai báo (gọi là “temporal dead zone”). Giá trị của biến let có thể thay đổi sau khi khai báo.
const Phạm vi khối (block scope).  Bị hoisted, nhưng không thể sử dụng trước khi khai báo. Được sử dụng để khai báo các biến không thể thay đổi (constant).

Tuy nhiên, nếu giá trị là một đối tượng hoặc mảng, bạn vẫn có thể thay đổi các thuộc tính hoặc phần tử bên trong đối tượng/mảng đó.

Virtual DOM hoạt động như thế nào và ưu điểm của nó là gì?

Mô hình DOM – Document Object Model là một API cho các tài liệu web. Nó đại diện cho cấu trúc của một trang web HTML dưới dạng một cây các nút, trong đó mỗi nút tương ứng với một phần của tài liệu.

Cách mà virtual DOM hoạt động như sau: Hình ảnh minh họa

Toàn bộ giao diện người dùng (UI) được sao chép vào một cấu trúc trong bộ nhớ được gọi là “virtual DOM”, đây là một phiên bản nhẹ của DOM thực tế. Khi trạng thái thay đổi và UI cần được cập nhật, một virtual DOM mới được tạo ra với trạng thái đã cập nhật. Sau đó, một phép so sánh (diff) được thực hiện giữa virtual DOM mới và phiên bản trước đó.

Hệ thống sẽ tính toán số lượng thay đổi tối thiểu cần thiết để đạt được trạng thái mới và áp dụng những thay đổi đó. Chỉ những nút cần được cập nhật mới được tác động, điều này giúp giảm thiểu việc thao tác trực tiếp với DOM thực.

Sử dụng virtual DOM mang lại những lợi ích liên quan đến hiệu suất, nền tảng và tính nhất quán:

  • Tối ưu hóa hiệu suất: Bằng cách chỉ cập nhật các nút cụ thể trong DOM thực, kỹ thuật này giảm số lượng cập nhật, tái định hình và vẽ lại trên giao diện người dùng, ảnh hưởng trực tiếp đến hiệu suất của ứng dụng.
  • Đa nền tảng: Virtual DOM cung cấp một lớp trừu tượng giữa ứng dụng và API thực tế mà render giao diện người dùng. Điều này có nghĩa là ứng dụng có thể được chuyển đổi sang các nền tảng khác miễn là có một triển khai virtual DOM cho nền tảng đó.
  • Tính nhất quán: Kỹ thuật này giữ cho giao diện người dùng đồng bộ với trạng thái nội bộ, giảm thiểu lỗi và sự không nhất quán.

Hàm là gì trong JavaScript và bạn có thể định nghĩa một hàm như thế nào?

Hàm là một trong những khối xây dựng cơ bản trong JavaScript. Một hàm tương tự như một quy trình — một tập hợp các câu lệnh thực hiện một nhiệm vụ hoặc tính toán một giá trị. Tuy nhiên, để một quy trình đủ điều kiện trở thành hàm, nó cần nhận một số đầu vào và trả về một đầu ra, trong đó có một mối quan hệ rõ ràng giữa đầu vào và đầu ra.

Thành phần của một hàm:

  • Tên hàm: Là một định danh duy nhất để gọi hàm.
  • Tham số: Là các giá trị được truyền vào hàm khi gọi hàm.
  • Thân hàm: Là nơi chứa các câu lệnh thực hiện nhiệm vụ của hàm.
  • Giá trị trả về: Là kết quả mà hàm trả về. Nếu không có câu lệnh return, hàm sẽ trả về undefined.

Ví dụ:

function tenHam(thamSo1, thamSo2, ...) {

    // Thân hàm: các câu lệnh thực hiện nhiệm vụ

    return giaTriTraVe; // Tùy chọn

}

Kết xuất phía máy chủ là gì và khi nào bạn có thể sử dụng nó?

Kết xuất phía máy chủ (Server side rendering – SSR) là một kỹ thuật trong đó máy chủ web tạo ra nội dung HTML của một trang web và gửi nó đến client (thường là trình duyệt web) dưới dạng một tài liệu được render đầy đủ. 

Có một số trường hợp sử dụng lý tưởng cho SSR:

  • Các trang web giàu nội dung: Các trang tin tức, blog,…
  • Các ứng dụng nặng về SEO: Khi sự thành công của ứng dụng web phụ thuộc vào SEO, phương pháp này có thể cải thiện hiệu suất của trang web (và nhờ đó, hiệu suất SEO).
  • Các ứng dụng web tiến bộ: Khi ứng dụng cần kết xuất nhanh để cung cấp trải nghiệm người dùng nhanh và hiệu suất, ứng dụng có thể được kết xuất ban đầu trên máy chủ, sau đó được “hydrated” trên máy khách cho các tích hợp tiếp theo.

Vòng lặp sự kiện trong JavaScript hoạt động như thế nào?

Vòng lặp sự kiện (Event Loop) là một khái niệm cốt lõi trong JavaScript, cho phép thực thi code bất đồng bộ. Hình minh họa

Cách hoạt động của vòng lặp sự kiện trong JavaScript như sau:

  • Ngăn xếp gọi hàm (Call Stack): JavaScript thực thi code trên một luồng duy nhất bằng cách sử dụng ngăn xếp gọi hàm, nơi các cuộc gọi hàm được thêm vào và thực thi lần lượt. Khi một hàm kết thúc, nó được xóa khỏi ngăn xếp.
  • Các cuộc gọi bất đồng bộ (Async calls): Đối với các hoạt động bất đồng bộ, JavaScript sử dụng các Web API do trình duyệt cung cấp. Các hoạt động này được chuyển khỏi ngăn xếp gọi hàm và được xử lý riêng biệt.
  • Hàng đợi nhiệm vụ (Task Queue): Khi một cuộc gọi bất đồng bộ hoàn thành, hàm callback được đưa vào hàng đợi nhiệm vụ.
  • Vòng lặp sự kiện: Vòng lặp sự kiện liên tục kiểm tra ngăn xếp gọi hàm và hàng đợi nhiệm vụ. Nếu ngăn xếp gọi hàm trống, nó lấy nhiệm vụ đầu tiên từ hàng đợi và đẩy nó vào ngăn xếp gọi hàm để thực thi. Chu kỳ này lặp lại vô hạn.

Câu hỏi phỏng vấn Front end về Framework và Thư viện

Có những Framework Frontend nào thường được sử dụng?

Có nhiều framework frontend phổ biến được sử dụng để xây dựng giao diện người dùng, mỗi framework có những đặc điểm và lợi ích riêng.

  • React.js là một trong những framework nổi bật, được phát triển bởi Facebook. Với khả năng cập nhật giao diện người dùng nhanh chóng mà không ảnh hưởng đến hiệu suất, React đã cách mạng hóa việc tạo ra các ứng dụng tương tác như các ứng dụng một trang (SPA) và nền tảng thương mại điện tử. Điểm mạnh của React là việc sử dụng JSX, cho phép lập trình viên viết mã gần giống HTML trong JavaScript, cùng với Virtual DOM, giúp tăng tốc độ xử lý.
  • Angular, phát triển bởi Google, là một framework mạnh mẽ dựa trên TypeScript. Angular nổi bật với các tính năng như liên kết dữ liệu hai chiều và cấu trúc MVC, rất phù hợp cho việc xây dựng các ứng dụng quy mô lớn, phức tạp.
  • Vue.js là một lựa chọn nhẹ nhàng và dễ học hơn, phù hợp cho các dự án nhỏ và vừa. Với các tính năng như liên kết dữ liệu phản ứng và kiến trúc dựa trên thành phần, Vue giúp việc phát triển trở nên nhanh chóng và hiệu quả.

Ngoài ra, PreactSvelte cũng đang ngày càng được ưa chuộng. Preact cung cấp hiệu suất vượt trội với kích thước nhỏ hơn so với React, trong khi Svelte nổi bật với việc chuyển đổi thành vanilla JavaScript, giúp tối ưu hóa hiệu suất ứng dụng.

Đọc thêm: Top 10 Thư viện và Framework front end dùng nhiều nhất 2024

Có những thư viện Frontend nào thường được sử dụng?

Các thư viện frontend đóng vai trò quan trọng trong việc cải thiện giao diện người dùng (UI) và trải nghiệm người dùng (UX). Những thư viện này thường được viết bằng JavaScript, HTML và CSS, giúp lập trình viên đơn giản hóa các tác vụ phát triển.

  • jQuery là một trong những thư viện phổ biến nhất, được thiết kế để giảm bớt sự phức tạp khi thao tác với HTML, CSS và JavaScript. Với jQuery, lập trình viên có thể viết mã ngắn gọn và hiệu quả hơn, tiết kiệm thời gian trong quá trình phát triển.
  • Bootstrap, phát triển bởi Twitter, cung cấp một bộ công cụ phong phú cho việc tạo giao diện người dùng. Thư viện này bao gồm các thành phần, class CSS và JavaScript giúp việc thiết kế trang web trở nên nhanh chóng và linh hoạt, đặc biệt là trong việc phát triển các ứng dụng di động responsive.
  • Axios là một thư viện HTTP máy khách phổ biến, cho phép thực hiện các yêu cầu HTTP một cách dễ dàng từ JavaScript, thích hợp cho cả ứng dụng frontend và backend.

Ngoài ra, Material-UI cung cấp các thành phần UI cho React, giúp tạo ra giao diện hiện đại dựa trên nguyên tắc thiết kế Material Design của Google. Cuối cùng, Sass là một ngôn ngữ mở rộng của CSS, cung cấp nhiều tính năng giúp viết mã CSS dễ dàng và linh hoạt hơn, từ đó làm cho mã nguồn trở nên dễ quản lý và tái sử dụng. Và còn nhiều thư viện khác nữa.

So sánh sự khác biệt giữa các framework frontend: React.js, Angular.js, Vue.js

Framework React.js Angular.js Vue.js
Hiệu suất – Thích hợp cho các ứng dụng lớn.

– Chú trọng vào quản lý hiệu quả các cập nhật UI với virtual DOM.

– Lý tưởng cho các ứng dụng cấp doanh nghiệp.

– Được thiết kế để xử lý các dự án quy mô lớn với nhiều công cụ tích hợp sẵn.

– Thích hợp với các ứng dụng nhỏ.

– Thiết kế nhẹ và khả năng phản ứng nhanh.

Khả năng mở rộng Có khả năng mở rộng tốt nhờ vào kiến trúc dựa trên thành phần. Khả năng mở rộng tốt nhất nhờ vào framework toàn diện và các tính năng mạnh mẽ như kiểu dữ liệu mạnh và injection phụ thuộc. Linh hoạt và có thể mở rộng theo từng dự án.
Khả năng học tập Hỗ trợ phát triển nhanh nhờ cấu trúc thành phần và hệ sinh thái phong phú. Có phần khó học hơn và đòi hỏi code boilerplate nhiều hơn.  Lựa chọn lý tưởng khi cần thiết lập nhanh và dễ học.
Ưu điểm Có độ linh hoạt cao, hiệu suất tốt, có hệ sinh thái lớn và cộng đồng hỗ trợ mạnh mẽ. Toàn diện và có khả năng mở rộng, với các công cụ và tính năng tích hợp hỗ trợ các ứng dụng lớn, cấp doanh nghiệp. Dễ học và tích hợp, linh hoạt và có đường cong học tập nhẹ nhàng.
Nhược điểm Cần nhiều cấu hình và thiết lập hơn, việc quản lý trạng thái trong các ứng dụng lớn có thể trở nên phức tạp. Đường cong học tập dốc hơn và mã boilerplate nhiều hơn, có thể làm chậm quá trình phát triển ban đầu. Ít phù hợp hơn với các ứng dụng quy mô rất lớn do hệ sinh thái nhỏ hơn.

Làm thế nào để chọn một framework hoặc thư viện Frontend phù hợp với dự án?

Khi chọn framework hoặc thư viện hỗ trợ để lập trình frontend, bạn nên cân nhắc các yếu tố sau:

  • Đánh giá các chức năng tích hợp sẵn.
  • Kiểm tra tính tương thích với công nghệ hiện tại.
  • Ưu tiên các framework, thư viện có cộng đồng người dùng mạnh.
  • Đảm bảo hỗ trợ thiết kế đáp ứng (responsive design).
  • Lựa chọn các framework, thư viện có tài liệu và hướng dẫn chi tiết.

jQuery và JavaScript có gì khác nhau?

jQuery và JavaScript đều được sử dụng để phát triển web, nhưng chúng khác nhau về cách thức hoạt động và mục đích sử dụng:

JavaScript là một ngôn ngữ lập trình chính trong phát triển web, cho phép bạn điều khiển nội dung, thực hiện các phép tính, xử lý sự kiện và tạo ra các ứng dụng tương tác. JavaScript cung cấp nhiều API, nhưng việc xử lý DOM, sự kiện và AJAX trong JavaScript nguyên bản có thể phức tạp và dài dòng.

jQuery là một thư viện JavaScript được thiết kế để đơn giản hóa các thao tác trong JavaScript, đặc biệt là các tác vụ như thao tác với DOM, xử lý sự kiện, hiệu ứng và AJAX. Nó giúp mã ngắn gọn hơn và dễ đọc hơn. Thay vì viết nhiều dòng JavaScript để thực hiện một thao tác, bạn có thể chỉ cần vài dòng jQuery.

Tiêu chí JavaScript jQuery
Cách hoạt động JavaScript là sự kết hợp giữa ECMA Script và DOM (Document Object Model). jQuery sử dụng các tài nguyên mà JavaScript cung cấp. Nói cách khác, đây là một thư viện JavaScript nhẹ, chỉ có DOM.
Tần suất viết code JavaScript yêu cầu viết nhiều dòng code hơn vì lập trình viên phải tự viết code từ đầu. Với jQuery, lập trình viên viết ít code hơn so với JavaScript. Thay vào đó, chỉ cần nhập thư viện và sử dụng các hàm hoặc phương thức cụ thể trong thư viện.
Khả năng tương thích Cần viết thêm code hoặc điều chỉnh nhiều để đảm bảo khả năng tương thích đa trình duyệt. Có tính năng tích hợp sẵn, không cần phải viết thêm code hay điều chỉnh để code hoạt động trên các trình duyệt khác.
Khả năng sử dụng Phức tạp vì lập trình viên phải tự viết code cho kịch bản của mình, việc này tiêu tốn thời gian. Ngắn gọn hơn, không cần viết nhiều code vì các kịch bản đã tồn tại sẵn.
Khả năng xử lý của trình duyệt JavaScript thuần có thể nhanh hơn trong việc chọn/làm việc với DOM so với jQuery vì JavaScript được trình duyệt xử lý trực tiếp, giảm thiểu độ trễ mà jQuery có. jQuery nhanh với các trình duyệt và máy tính hiện đại, nhưng nó cần chuyển thành JavaScript để chạy trên trình duyệt.
Khả năng tạo animation Có thể tạo animation trong JavaScript bằng cách viết nhiều code, chủ yếu là thay đổi phong cách của trang HTML. Có thể thêm animation dễ dàng với ít code hơn.
Khả năng phụ thuộc Ngôn ngữ độc lập và có thể tồn tại riêng lẻ. Một thư viện của JavaScript, không thể tồn tại nếu không có JavaScript.

Câu hỏi phỏng vấn Front end về quy trình lập trình và công cụ

Bạn có thể gọi web service bằng những cách nào?

Bạn có thể gọi web service bằng nhiều cách khác nhau, bao gồm:

  • XMLHttpRequest: Phương pháp truyền thống để gọi web service trong JavaScript.
  • fetch: API hiện đại cho phép gửi yêu cầu và nhận phản hồi dễ dàng hơn.
  • Axios: Một thư viện mã nguồn mở phổ biến, cung cấp cú pháp ngắn gọn và hỗ trợ nhiều tính năng hữu ích.
  • jQuery (sử dụng $.ajax()): Phương pháp từ jQuery để thực hiện các yêu cầu AJAX một cách đơn giản.
  • WebSocket: Đây là một giao thức hai chiều, cho phép trao đổi dữ liệu theo thời gian thực giữa client và server. Nó có thể được sử dụng để gọi web service theo cách khác so với các phương pháp HTTP truyền thống.

Mỗi phương pháp đều có những ưu điểm riêng, giúp bạn linh hoạt lựa chọn theo nhu cầu và công nghệ đang sử dụng.

Git là gì? Tại sao Git quan trọng trong lập trình Frontend?

Phương pháp quản lý phiên bản (version control) giúp theo dõi và chỉnh sửa code của dự án. Git được xem là một phần mềm phổ biến dùng để quản lý code. Nếu code gặp sự cố, lập trình viên có thể sử dụng Git để quay lại phiên bản trước đó thay vì phải sửa lại toàn bộ bằng tay. Việc học Git cũng giúp lập trình viên cộng tác với các thành viên khác trong nhóm và thực hiện các thay đổi trên cùng một mã code từ nhiều địa điểm khác nhau. 

Webpack là gì? Vai trò của webpack trong lập trình Frontend?

Webpack là một công cụ (module bundler) dùng để biên dịch và gộp tất cả các module JavaScript, CSS, hình ảnh, và các tài nguyên khác thành các tệp duy nhất, giúp giảm tải lượng yêu cầu HTTP từ trình duyệt khi tải trang. 

Webpack được sử dụng phổ biến trong lập trình frontend để tối ưu hóa ứng dụng và tăng hiệu suất thông qua các tính năng sau:

  • Tăng tốc độ phát triển: Khi thay đổi nhỏ trong JavaScript, Webpack không yêu cầu tải lại toàn bộ trang. Với các loader, CSS cũng có thể được cập nhật tương tự, giúp tiết kiệm thời gian và giảm thời gian tải khi gỡ lỗi.
  • Giảm xung đột biến toàn cục: Webpack cung cấp hệ thống module dựa trên ES6, trong đó mỗi file là một module riêng biệt và các biến sẽ chỉ có phạm vi cục bộ trong file đó, tránh ghi đè lên các biến toàn cục.
  • Chia tách mã nguồn: Webpack cho phép chia nhỏ mã thành các module riêng biệt và có thể tái sử dụng tính năng từ file này sang file khác, giúp quản lý mã dễ dàng hơn.
  • Minification: Webpack tối ưu hóa mã bằng cách loại bỏ khoảng trắng, xuống dòng, mã không cần thiết và rút ngắn tên biến, giúp giảm dung lượng file.
  • Hỗ trợ Feature Flagging: Với feature flagging, Webpack cho phép gửi mã đến các môi trường khác nhau trong quá trình kiểm thử tính năng, hỗ trợ tốt cho cả phát triển và kiểm thử.
  • Tree Shaking: Webpack loại bỏ mã không sử dụng khỏi bản build cuối, giúp giảm kích thước file bằng cách chỉ giữ lại những mã cần thiết cho sản phẩm.
  • Dynamic Imports: Với dynamic imports, Webpack có thể tải module không đồng bộ khi cần, giúp giảm thời gian tải trang ban đầu.
  • Code Analysis and Profiling: Webpack cung cấp các công cụ để phân tích và tối ưu hóa mã, giúp cải thiện hiệu suất và nâng cao trải nghiệm người dùng.

Một số kỹ thuật tối ưu hóa hiệu suất cho lập trình frontend là gì?

Các phương pháp tối ưu hóa hiệu suất web chủ yếu bao gồm:

  • Nén hình ảnh: Giảm kích thước file hình ảnh mà không làm giảm chất lượng.
  • Minify CSS và JavaScript: Loại bỏ các khoảng trắng, comment và các ký tự không cần thiết trong file CSS và JavaScript để giảm kích thước file.
  • Combine files: Kết hợp nhiều file nhỏ thành một file lớn để giảm số lượng yêu cầu HTTP.
  • Caching: Lưu trữ các file tĩnh (hình ảnh, CSS, JavaScript) trong bộ nhớ cache của trình duyệt để không phải tải lại mỗi khi người dùng truy cập trang.
  • Lazy loading: Chỉ tải các nội dung cần thiết khi người dùng cuộn đến vị trí đó.
  • Code splitting: Chia nhỏ các bundle JavaScript lớn thành các bundle nhỏ hơn để chỉ tải những gì cần thiết cho mỗi trang.
  • Server-side rendering: Render trang web ở phía máy chủ trước khi gửi đến trình duyệt.
  • CDN (Content Delivery Network): Sử dụng mạng phân phối nội dung để phân tán các file tĩnh trên nhiều máy chủ trên toàn cầu, giúp giảm thời gian tải.

Lazy loading là gì? Làm thế nào để thực hiện lazy loading trong JavaScript/ React/ Vue?

Lazy loading (tải chậm) là một kỹ thuật tối ưu hóa trong lập trình web, trong đó các tài nguyên như hình ảnh, video hoặc component chỉ được tải khi người dùng thực sự cần đến chúng, thay vì tải tất cả ngay từ đầu. 

Lazy loading thường sử dụng một kỹ thuật gọi là Intersection Observer API trong JavaScript để theo dõi khi nào một phần tử đi vào hoặc ra khỏi vùng nhìn thấy của người dùng (viewport). Khi phần tử sắp xuất hiện trong viewport, lazy loading sẽ bắt đầu tải nó.

  • Trong JavaScript thuần, lazy loading được áp dụng chủ yếu cho hình ảnh và video bằng cách dùng IntersectionObserver.
  • Trong React, có thể sử dụng tính năng React.lazy cùng với Suspense để lazy load các component. 
  • Trong Vue, có thể dùng tính năng dynamic import với Vue.component hoặc import() để thực hiện lazy load các component.

Tổng kết câu hỏi phỏng vấn Front End