Danh sách câu hỏi của đề

Câu hỏi: FER202 Phát triển web Front-End với React – Bộ ôn tập cuối kỳ số 2

50 câu trắc nghiệm kèm lời giải của môn FER202 - Phát triển web Front-End với React, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
Afunction App() { return (<div><Header /><MainContent /><Footer /></div>); }
Bfunction App() { return (<div><Header /><Footer /><MainContent /></div>); }
Cfunction App() { return (<div><MainContent /><Header /><Footer /></div>); }
Dfunction App() { return (<div><Footer /><Header /><MainContent /></div>); }
Lời giải

Đáp án đúng: "function App() {

Lời giải
return (<div><Header /><MainContent /><Footer /></div>);

}". Composition (kết hợp) nghĩa là dựng component lớn bằng cách ghép các component nhỏ làm con của nó; bố cục trang thông thường đọc từ trên xuống nên App phải render Header trước, rồi MainContent ở giữa, cuối cùng là Footer, và JSX hiển thị các con đúng theo thứ tự chúng được viết trong thẻ div. Cả bốn đoạn mã đều hợp lệ về cú pháp và đều là composition, chỉ khác nhau ở thứ tự: đoạn chứa "

Lời giải
<Header />
<Footer />
<MainContent />

" đặt chân trang lên trước nội dung chính; đoạn chứa "

Lời giải
<div>
  <MainContent />
  <Header />

" đẩy nội dung chính lên trên cả đầu trang; đoạn chứa "

Lời giải
<div>
  <Footer />
  <Header />

" đưa chân trang lên vị trí đầu tiên. Ba bố cục đó vẫn chạy được nhưng sai yêu cầu đầu trang, nội dung chính rồi chân trang.

Mở trang câu hỏi này →
AUse a functional component with the map method
BUse a class component with componentDidMount
CUse a higher-order component
DUse a lifecycle method to fetch data
Lời giải
Đáp án đúng: "Use a functional component with the map method". Component chỉ hiển thị một danh sách nhận qua props thì không cần state hay phương thức vòng đời: một function component nhận props.items rồi gọi items.map để biến mỗi phần tử thành một thẻ li có key riêng, React dùng key đó để đối chiếu khi danh sách thay đổi. "Use a class component with componentDidMount" thừa: componentDidMount dùng cho tác vụ phụ sau lần gắn đầu tiên như gọi API, trong khi dữ liệu ở đây đã có sẵn trong props. "Use a higher-order component" là kỹ thuật bọc component để tái dùng logic chung, ví dụ kiểm tra đăng nhập, không phải cách hiển thị một danh sách. "Use a lifecycle method to fetch data" sai yêu cầu vì dữ liệu được truyền qua props chứ không phải tải về từ máy chủ.
Mở trang câu hỏi này →
Đề bài
const [isOpen, setIsOpen] = useState(false);
const [buttonText, setButtonText] = useState(isOpen ? "se" : "Open");
function toggle() {
  setIsOpen(!isOpen);
  setButtonText(isOpen ? "Open" : "se");
}
AThe code above is fine as it is.
BRemove buttonText from state and calculate it dynamically in the render method based on isOpen.
CKeep both isOpen and buttonText in state but update them separately.
DUse useEffect to sync buttonText with isOpen.
Lời giải
Đáp án đúng: "Remove buttonText from state and calculate it dynamically in the render method based on isOpen.". buttonText hoàn toàn suy ra được từ isOpen, nên giữ nó thành state riêng là hai nguồn sự thật cho cùng một thông tin. Lần theo toggle: setIsOpen(!isOpen) chưa đổi isOpen ngay, trong lần gọi này isOpen vẫn là giá trị cũ, nên setButtonText phải cố tình đảo điều kiện mới ra đúng chữ; chỉ cần sửa một chỗ mà quên chỗ kia, hay cập nhật isOpen từ nơi khác, là chữ trên nút lệch với trạng thái. Nguyên tắc của React là không lưu thứ tính được từ state khác: bỏ buttonText khỏi state và tính chữ của nút từ isOpen bằng toán tử ba ngôi ngay trong thân component. "The code above is fine as it is." sai vì đoạn mã chạy được nhưng dư state và dễ mâu thuẫn. "Keep both isOpen and buttonText in state but update them separately." chính là cách đang gây rủi ro lệch nhau. "Use useEffect to sync buttonText with isOpen." chạy được nhưng thêm một lần render thừa và một khoảnh khắc hai state lệch nhau; tài liệu React khuyên tránh effect chỉ để đồng bộ state suy diễn.
Mở trang câu hỏi này →
AHooks allow React to maintain internal state without classes
BHooks simplify sharing functionality between components
CHooks remove the need for functional components
DHooks only support stateful components
Lời giải
Đáp án đúng: "Hooks allow React to maintain internal state without classes". Trước React 16.8, chỉ class component mới có state và phương thức vòng đời; Hooks như useState, useEffect cho phép function component tự giữ state nội bộ và xử lý side effect (tác dụng phụ) mà không phải viết class, không phải dùng this hay bind, đây là động lực chính khiến Hooks ra đời. "Hooks simplify sharing functionality between components" là một lợi ích có thật nhờ custom hook, nhưng nó là hệ quả của việc đưa state vào hàm, còn câu hỏi hỏi lợi thế chủ yếu nên việc giữ state mà không cần class mới là cốt lõi. "Hooks remove the need for functional components" sai ngược lại, Hooks chỉ chạy được bên trong function component hoặc custom hook. "Hooks only support stateful components" sai vì component dùng Hooks có thể không có state, chẳng hạn chỉ dùng useContext hay useEffect.
Mở trang câu hỏi này →
AResets the state
BHandles unknown actions
CThrows an error for unknown actions
DReturns the current state
Lời giải
Đáp án đúng gồm ba ý: "Handles unknown actions", "Throws an error for unknown actions" và "Returns the current state". Reducer thường dùng switch theo action.type, và nhánh default là nơi rơi vào khi gặp action không thuộc các case đã viết, tức là nó xử lý action không nhận ra. Cách xử lý thì có hai lối đều được dạy: trong Redux, nhánh default trả lại state hiện tại vì mọi reducer đều nhận mọi action được dispatch, kể cả action dành cho reducer khác, nên phải để state nguyên vẹn; còn ví dụ useReducer trong tài liệu React lại viết nhánh default ném lỗi kiểu Unknown action để phát hiện sớm action gõ sai. Hai lối này loại trừ nhau trong cùng một reducer, viết theo lối nào là tuỳ chỗ dùng, nhưng cả hai đều là hành vi đúng của nhánh default. "Resets the state" sai vì đưa state về giá trị ban đầu mỗi khi gặp action lạ sẽ xoá sạch dữ liệu người dùng vừa tạo, chẳng hạn khi một reducer khác đang xử lý action đó.
Mở trang câu hỏi này →
AIt defines the project's dependencies and scripts
BIt contains the source code of the project
CIt configures the Node.js environment
DIt manages the project's build process
Lời giải
Đáp án đúng: "It defines the project's dependencies and scripts". Tệp package.json là bản kê khai của dự án Node.js: nó ghi tên, phiên bản, danh sách gói phụ thuộc trong dependencies và devDependencies để npm hay yarn biết cần cài gì, cùng mục scripts định nghĩa các lệnh như start, dev, build, test chạy bằng npm run. "It contains the source code of the project" sai vì mã nguồn nằm trong các tệp JavaScript như thư mục src, package.json chỉ là tệp cấu hình dạng JSON. "It configures the Node.js environment" sai vì môi trường chạy như biến môi trường hay phiên bản Node được đặt qua tệp .env, nvm hoặc hệ thống; trường engines chỉ khai báo phiên bản mong muốn chứ không cấu hình môi trường. "It manages the project's build process" sai vì package.json chỉ khai báo lệnh build trong scripts; việc đóng gói và biên dịch thực sự do công cụ như Vite hoặc webpack đảm nhận.
Mở trang câu hỏi này →
AIt is mainly designed for handling backend logic and database management
BReact helps build interactive user interfaces, especially for SPAs.
CReact primarily functions as a server-side rendering engine for web applications.
DIt is mainly a mobile development framework and not suitable for web applications.
Lời giải
Đáp án đúng: "React helps build interactive user interfaces, especially for SPAs.". React là thư viện JavaScript để xây dựng giao diện người dùng từ các component, mỗi component mô tả giao diện theo state và React tự cập nhật DOM khi state đổi; mô hình này rất hợp với ứng dụng một trang (single-page application, SPA), nơi trang không tải lại mà giao diện thay đổi liên tục theo thao tác người dùng. Phương án "It is mainly designed for handling backend logic and database management" sai vì React chạy ở tầng giao diện, còn logic máy chủ và cơ sở dữ liệu thuộc backend như Node.js với Express. Phương án "React primarily functions as a server-side rendering engine for web applications." nhầm khả năng phụ với vai trò chính: React có thể render phía máy chủ qua framework như Next.js, nhưng mục đích chính vẫn là dựng giao diện tương tác. Phương án "It is mainly a mobile development framework and not suitable for web applications." đảo ngược sự thật: React ra đời cho web, còn mobile là React Native, một dự án riêng.
Mở trang câu hỏi này →
AComponent-Based
BVirtual DOM
CLarge Community
DServer-Side Rendering
Lời giải
Đáp án đúng: "Server-Side Rendering". Câu hỏi tìm thứ không phải tính năng của React, và cần nói thẳng chỗ tranh cãi: React có hỗ trợ render phía máy chủ qua react-dom/server (renderToString, renderToPipeableStream) và qua framework như Next.js, nhưng đó là khả năng dựng thêm, cần máy chủ Node và cấu hình riêng, không phải tính năng cốt lõi mặc định của thư viện như component hay Virtual DOM; vì vậy đây là phương án được chọn. "Component-Based" là tính năng nền tảng: giao diện được chia thành component tái sử dụng. "Virtual DOM" cũng là cốt lõi: React dựng cây ảo trong bộ nhớ, so sánh (diffing) rồi chỉ cập nhật phần DOM thật thay đổi. "Large Community" đúng ra là ưu điểm của hệ sinh thái chứ không phải tính năng kỹ thuật, nên dễ bị chọn nhầm; nhưng nó thường được kể như một đặc điểm nổi bật của React, nên không phải đáp án.
Mở trang câu hỏi này →
ABy using the if statement
BBy using the for loop
CBy using the ternary operator {condition ? trueContent : falseContent}
DBy using the switch statement
Lời giải
Đáp án đúng: "By using the ternary operator {condition ? trueContent : falseContent}". Bên trong JSX, cặp ngoặc nhọn chỉ nhận biểu thức JavaScript (expression), tức thứ trả về một giá trị, chứ không nhận câu lệnh (statement). Toán tử ba ngôi là biểu thức nên đặt thẳng trong JSX được: điều kiện đúng thì trả về nhánh thứ nhất, sai thì trả về nhánh thứ hai; tương tự có thể dùng toán tử && khi chỉ cần một nhánh. "By using the if statement" sai vì if là câu lệnh, không viết được giữa JSX; nó chỉ dùng ở phần thân hàm phía trên return để chọn JSX nào trả về. "By using the for loop" là câu lệnh lặp, không dùng để chọn hiển thị theo điều kiện và cũng không đặt được trong JSX; muốn lặp danh sách thì dùng map. "By using the switch statement" cũng là câu lệnh nên không đặt trực tiếp trong JSX, chỉ dùng bên ngoài return hoặc tách thành hàm riêng.
Mở trang câu hỏi này →
Amap()
BforEach()
Creduce()
Dfilter()
Lời giải
Đáp án đúng: "map()". Cần nói thẳng: cả bốn phương thức map(), forEach(), reduce() và filter() đều có từ ES5 chứ không phải tính năng mới của ES6, nên việc gắn câu hỏi với ES6 là không chính xác; ES6 chỉ làm chúng gọn hơn khi đi cùng arrow function. Trong bối cảnh React, map() là phương thức tiêu biểu nhất để biến đổi mảng: nó gọi hàm cho từng phần tử và trả về một mảng MỚI cùng độ dài, ví dụ biến mảng dữ liệu thành mảng phần tử JSX khi render danh sách, nên đây là đáp án được chọn; tuy vậy có tài liệu ôn tập lại chấm reduce() vì nó là phương thức tổng quát nhất. "reduce()" gộp cả mảng về một giá trị duy nhất (tổng, đối tượng, mảng khác), mạnh nhưng không phải cách biến đổi mảng thông dụng nhất. "forEach()" chỉ duyệt để tạo side effect và luôn trả về undefined, không sinh mảng mới. "filter()" chỉ giữ lại phần tử thỏa điều kiện, không biến đổi giá trị từng phần tử.
Mở trang câu hỏi này →
AYou must always wrap JSX in a single root element
BYou can use multiple root elements without any wrapping
CJSX tags can be self-closing only for non-void elements
DJSX does not support attributes like className
Lời giải

Đáp án đúng: "You must always wrap JSX in a single root element". Mỗi biểu thức JSX được biên dịch thành một lời gọi hàm tạo phần tử, mà một hàm hay câu return chỉ trả về được một giá trị, nên các phần tử cùng cấp phải nằm trong một phần tử gốc; khi không muốn thêm thẻ div thừa vào DOM thì dùng Fragment, viết gọn là <> và </>. "You can use multiple root elements without any wrapping" sai vì đó chính là điều JSX không cho phép, trả về hai thẻ liền nhau mà không bọc sẽ báo lỗi biên dịch. "JSX tags can be self-closing only for non-void elements" sai vì trong JSX mọi thẻ đều có thể tự đóng, và các thẻ rỗng (void element) như img, br, input còn bắt buộc phải tự đóng, ví dụ <img />. "JSX does not support attributes like className" sai vì className chính là thuộc tính JSX dùng thay cho class của HTML, do class là từ khoá dành riêng trong JavaScript.

Mở trang câu hỏi này →
ABy using npm or yarn to install the package.
BBy downloading the React-Bootstrap files from a website.
CBy copying and pasting the React-Bootstrap code into your project.
DBy using a CDN link to include React-Bootstrap in your HTML file.
Lời giải
Đáp án đúng: "By using npm or yarn to install the package.". React-Bootstrap được phát hành dưới dạng gói trên npm, nên cách chuẩn là chạy lệnh cài react-bootstrap cùng bootstrap bằng npm hoặc yarn, sau đó import tệp CSS của Bootstrap và import từng component như Button, Container ở nơi cần dùng; trình quản lý gói ghi phiên bản vào package.json và tự lo các gói phụ thuộc. "By downloading the React-Bootstrap files from a website." sai vì tải tay không quản lý được phiên bản, khó cập nhật và không tích hợp với công cụ build. "By copying and pasting the React-Bootstrap code into your project." sai vì chép mã thư viện vào dự án biến nó thành mã tự duy trì, mất đường nâng cấp và dễ thiếu phụ thuộc. "By using a CDN link to include React-Bootstrap in your HTML file." sai vì nhúng qua CDN chỉ hợp với trang thử nghiệm không dùng bundler; trong một dự án ReactJS dựng bằng npm, đó không phải cách cài thư viện vào dự án.
Mở trang câu hỏi này →
A<Row> <Container> <Col xs={6}>2 of 3 (wider)</Col> </Container> </Row>
B<Row> <Container> <Column>1 of 3</Column></Container> </Row>
C<Container> <Row> <Col xs={6}>2 of 3 (wider)</Col> </Row> </Container>
D<Container> <Column> <Row xs={6}>2 of 3 (wider)</Row> </Column> </Container>
Lời giải

Đáp án đúng: "

Lời giải
<Container> <Row> <Col xs={
  6
}
>2 of 3 (wider)</Col> </Row> </Container>

". Lưới của React-Bootstrap đi theo đúng thứ bậc của Bootstrap: Container ngoài cùng tạo khung căn lề và padding, Row bên trong tạo hàng flex và bù lề âm, rồi Col là ô cột nằm trong Row, chia hàng thành 12 phần; Col xs={6} chiếm sáu phần tức nửa hàng từ màn nhỏ nhất trở lên. Đoạn mã đúng giữ trọn thứ tự Container, Row, Col. Phương án có mảnh "(wider)</Col> </Container>" đảo ngược hai tầng ngoài, đặt Container trong Row nên cột không còn là con trực tiếp của hàng và lưới vỡ bố cục. Phương án "

Lời giải
<Row>
  <Container>
    <Column>1 of 3</Column>
  </Container>
</Row>

" vừa đảo tầng vừa dùng Column, một component không tồn tại trong React-Bootstrap (tên đúng là Col). Phương án có mảnh "

Lời giải
<Row xs={
  6
}
>2 of 3 (wider)</Row>

" đặt Row bên trong Column, sai cả tên component lẫn thứ bậc, và xs trên Row chỉ quy định số cột mỗi hàng chứ không đặt độ rộng ô như xs của Col.

Mở trang câu hỏi này →
AIt makes the container take up the entire width of the viewport.
BIt enables the container to display text.
CIt changes the container’s background color.
DIt makes the container fixed width.
Lời giải
Đáp án đúng: "It makes the container take up the entire width of the viewport.". Container mặc định của React-Bootstrap sinh lớp container có max-width cố định theo từng breakpoint (mốc kích thước màn hình) và căn giữa; thêm prop fluid thì đổi thành lớp container-fluid với width 100% ở mọi kích thước, còn fluid="md" cho phép rộng hết khổ tới mốc md. "It enables the container to display text." sai vì container nào cũng chứa được chữ, fluid chỉ thay đổi chiều rộng. "It changes the container’s background color." nhầm: màu nền đặt bằng lớp tiện ích như bg-light hoặc bg-dark, không liên quan tới fluid. "It makes the container fixed width." là hành vi của Container khi không có fluid, tức ngược hẳn với tác dụng của prop này.
Mở trang câu hỏi này →
AInline event handlers improve performance by reducing the number of function calls
BInline event handlers can lead to performance issues due to the creation of new functions on each render
CInline event handlers are the only way to handle events in React
DInline event handlers are more secure than named event handlers
Lời giải
Đáp án đúng: "Inline event handlers can lead to performance issues due to the creation of new functions on each render". Viết một hàm mũi tên ngay trong prop onClick nghĩa là mỗi lần component render, một hàm mới với tham chiếu mới được tạo ra. Bình thường chi phí này rất nhỏ, nhưng khi truyền hàm đó xuống component con bọc React.memo hay dùng làm phụ thuộc của useEffect, tham chiếu đổi mỗi lần sẽ phá ghi nhớ và gây render lại thừa; useCallback là cách giữ tham chiếu ổn định. Vì vậy phát biểu đúng là nó có thể gây vấn đề hiệu năng, chứ không phải luôn luôn. "Inline event handlers improve performance by reducing the number of function calls" sai vì viết inline không giảm lời gọi hàm mà còn tạo thêm hàm. "Inline event handlers are the only way to handle events in React" sai vì có thể truyền một hàm đặt tên như onClick={handleClick}. "Inline event handlers are more secure than named event handlers" sai vì hai cách chỉ khác cú pháp, không khác gì về bảo mật.
Mở trang câu hỏi này →
AProvides a consistent event interface across different browsers
BContains information necessary for event propagation
CReduces the need for garbage collection
DNormalizes browser inconsistencies
Lời giải
Đáp án đúng: "Reduces the need for garbage collection". Câu hỏi dạng phủ định nên phải chọn điều KHÔNG phải lợi ích của synthetic event (sự kiện tổng hợp). SyntheticEvent là lớp bọc của React quanh sự kiện gốc của trình duyệt, mục đích của nó là một giao diện thống nhất và hành vi nhất quán, không phải giảm tải cho bộ thu gom rác; React 16 trở về trước từng tái sử dụng đối tượng sự kiện (event pooling), nhưng từ React 17 cơ chế này bị bỏ vì không đem lại lợi ích đáng kể, nên giảm garbage collection không được tính là lợi ích của synthetic event. "Provides a consistent event interface across different browsers" là lợi ích thật: cùng các thuộc tính target, preventDefault, stopPropagation trên mọi trình duyệt. "Contains information necessary for event propagation" cũng đúng, đối tượng sự kiện mang target, currentTarget, eventPhase và cho phép stopPropagation để điều khiển lan truyền qua cây component. "Normalizes browser inconsistencies" đúng vì React chuẩn hoá các khác biệt như tên sự kiện hay cách đọc phím, nên đây cũng là lợi ích và không được chọn.
Mở trang câu hỏi này →
AIt manages state updates
BIt handles side effects
CIt returns the JSX that describes the UI
DIt fetches data from an API
Lời giải
Đáp án đúng: "It returns the JSX that describes the UI". Trong component dạng lớp, render là phương thức bắt buộc duy nhất; React gọi nó mỗi khi cần vẽ component và nó trả về JSX mô tả giao diện tương ứng với this.props và this.state hiện tại. render phải thuần (pure): cùng props và state thì trả cùng kết quả, không sửa state, không gọi API. "It manages state updates" sai vì cập nhật state làm qua this.setState, gọi trong hàm xử lý sự kiện hoặc phương thức vòng đời, còn gọi setState trong render sẽ gây vòng lặp render vô hạn. "It handles side effects" sai vì side effect như đăng ký sự kiện hay hẹn giờ được đặt trong componentDidMount và componentDidUpdate, ở component hàm là useEffect. "It fetches data from an API" sai vì lấy dữ liệu cũng là side effect, thường đặt trong componentDidMount; gọi API trong render sẽ gửi request ở mỗi lần render.
Mở trang câu hỏi này →
AIt provides a comprehensive set of pre-built components for rapid development
BIt enforces strict design patterns to maintain visual consistency.
CIt offers a huge list of utility CSS classes, providing more freedom for custom designs
DIt relies heavily on JavaScript for styling and layout management.
Lời giải
Đáp án đúng: "It offers a huge list of utility CSS classes, providing more freedom for custom designs". Tailwind CSS theo hướng utility-first: thay vì đưa ra nút, thẻ, thanh điều hướng dựng sẵn, nó cung cấp rất nhiều lớp tiện ích nhỏ, mỗi lớp làm một việc như đặt khoảng đệm, màu, cỡ chữ hay bố cục flex, rồi ta ghép chúng ngay trên phần tử để tạo giao diện riêng, nên tự do thiết kế hơn Bootstrap. "It provides a comprehensive set of pre-built components for rapid development" sai vì bộ component dựng sẵn chính là đặc trưng của Bootstrap, không phải của Tailwind. "It enforces strict design patterns to maintain visual consistency." sai vì Tailwind không áp đặt mẫu thiết kế; tính nhất quán đến từ thang giá trị trong tệp cấu hình mà ta tự chỉnh. "It relies heavily on JavaScript for styling and layout management." sai vì Tailwind sinh ra tệp CSS thuần lúc build, giao diện chạy hoàn toàn bằng CSS, không cần JavaScript để định kiểu hay bố cục.
Mở trang câu hỏi này →
39Next.js is primarily used for:4 lựa chọn
AStyling static websites
BCreating server-rendered or statically generated React applications
CManaging back-end databases
DHandling real-time communication
Lời giải
Đáp án đúng: "Creating server-rendered or statically generated React applications". Next.js là framework xây trên React, bổ sung những thứ React thuần không có sẵn: định tuyến theo tệp, render phía máy chủ (server-side rendering) ở mỗi request và sinh trang tĩnh (static site generation) lúc build, nhờ đó trang tải nhanh và thân thiện với công cụ tìm kiếm. Mục đích chính của nó vì vậy là dựng ứng dụng React được render trên server hoặc sinh sẵn thành trang tĩnh. Phương án "Styling static websites" sai vì Next.js không phải công cụ CSS; định kiểu trong đó dùng CSS Modules, Tailwind hay thư viện khác. Phương án "Managing back-end databases" sai vì Next.js có route API để viết logic server nhưng không quản lý cơ sở dữ liệu, việc đó thuộc hệ quản trị như PostgreSQL hay ORM. Phương án "Handling real-time communication" là vai trò của WebSocket hay thư viện như Socket.IO, không phải mục tiêu chính của Next.js.
Mở trang câu hỏi này →
AExplicit configuration in a central routes.json file.
BFile-system routing, where routes are determined by the structure of files
CDynamic route declarations using React Router
DServer-side API endpoints only
Lời giải
Đáp án đúng: "File-system routing, where routes are determined by the structure of files". Next.js định tuyến theo hệ thống tệp (file-system routing): với Pages Router, tệp pages/about.js trở thành đường dẫn /about; với App Router, mỗi thư mục trong app có tệp page.js là một route, thư mục đặt tên trong ngoặc vuông như [id] là đoạn động. "Explicit configuration in a central routes.json file." sai vì Next.js không đọc một tệp cấu hình tuyến trung tâm nào; muốn thêm trang chỉ cần thêm tệp. "Dynamic route declarations using React Router" là cách của ứng dụng React thuần dùng React Router, còn Next.js có bộ định tuyến riêng và tuyến động khai báo bằng tên tệp hoặc thư mục. "Server-side API endpoints only" sai vì API route chỉ là một loại route; các trang giao diện mới là phần chính, và cả hai đều được xác định bằng cấu trúc tệp.
Mở trang câu hỏi này →