React hiện nay là thư viện rất được ưa chuộng bởi các lập trình viên khi xây
dựng những ứng dụng web dạng một trang (Single Page Application) nhờ việc dễ
học, dễ viết và nhiều công cụ hỗ trợ. Tuy nhiên khi ứng dụng của bạn ngày càng
trở nên lớn hơn thì các vấn đề cũng xuất hiện nhiều hơn, nhất là việc liên
quan tới tối ưu hiệu năng cho ứng dụng. Trong bài viết này, mình sẽ cùng các
bạn tìm hiểu về Code-Splitting – một kỹ thuật để giúp “giảm” dung lượng file
bundle nhằm cải thiện thời gian load website và nâng cao hiệu năng ứng dụng
của bạn.
Bundle JS Files là gì?
Trước tiên bạn cần hiểu khái niệm bundle file trong React là gì. Thông thường
khi tạo ra một ứng dụng thì chúng ta sẽ viết source code của mình vào nhiều
files khác nhau, trong đó có chứa nhiều các modules và thư viện bên thứ 3
(3rd-party libs). Khi tiến hành build ứng dụng của bạn, React sẽ thực hiện
việc chuyển đổi rất nhiều file source code mà bạn viết trở thành 1 file lớn
hơn để sử dụng nó đưa cho các trình duyệt web khi load ứng dụng. Những file đó
được gọi là bundle.
href="https://blogger.googleusercontent.com/img/a/AVvXsEhQh3qTuDtXNDuijDklQKv9PKOG3MCOg7qBjSigSGFi2vefJbEEIgsu9XMnJ0NOU011-hjS8LYQcsyqch0uK5go5YlZKeGznqOnXBPr-JHiV5e0wXEkoCLBsqf4hURCOYnaMm_6z4uF500_9HLRk0EU37dxFUX83ovCblNHTAudx627maYWWyx6324KZZw"
style="margin-left: 1em; margin-right: 1em;"
> alt="bundle file"
data-original-height="637"
data-original-width="650"
height="627"
src="https://blogger.googleusercontent.com/img/a/AVvXsEhQh3qTuDtXNDuijDklQKv9PKOG3MCOg7qBjSigSGFi2vefJbEEIgsu9XMnJ0NOU011-hjS8LYQcsyqch0uK5go5YlZKeGznqOnXBPr-JHiV5e0wXEkoCLBsqf4hURCOYnaMm_6z4uF500_9HLRk0EU37dxFUX83ovCblNHTAudx627maYWWyx6324KZZw=w640-h627"
title="bundle file"
width="640"
/>
Ban đầu ứng dụng của bạn tạo ra những file bundle nhỏ, và việc trình
duyệt load chúng lên không thành vấn đề; sau một thời gian phát triển, với
việc import và sử dụng ngày càng nhiều các thư viện và module thì các files
bundle của bạn cũng ngày càng nặng thêm. Nếu không thực hiện tối ưu, kích
thước các file bundle có thể lên tới 40-50Mb là chuyện bình thường, điều đó
cũng đồng nghĩa với việc ứng dụng của bạn trở nên nặng nề khi load, user sẽ
cần chờ 1 khoảng thời gian khá lâu để có thể tương tác được với các phần tử
trên màn hình.
Vậy cách giải quyết cho vấn đề này là gì?
Code-Splitting là gì?
Rõ ràng để load một ứng dụng hay một màn hình cụ thể, ứng dụng của bạn không
cần phải “nạp” hết các module hay thư viện được import vào; vì thế để giải
quyết cho vấn đề bundle file size lớn, chúng ta cần một kỹ thuật để tách nó ra
thành 2 phần: phần cần thiết load để khởi động ứng dụng (hay màn hình) và phần
có thể load nạp vào sau khi ứng dụng đã được chạy. Và khi cần cần thiết load
để có thể khởi động ứng dụng càng nhỏ, thì thời gian tải ứng dụng của chúng ta
càng nhanh hơn. React đã cung cấp cho chúng ta tính năng này và gọi nó là
Code-Splitting.
href="https://blogger.googleusercontent.com/img/a/AVvXsEhL9EMCqtqMkRUkREDxwlIE-YA9wfvxmSnBeZuc1Y2afALp03VbLNfF79L7mxMFFKV0YCd0fqYUW3nFtg_DaWUhtfmC3lCaF4V0zduEpwWkURR00jBV73eQzKFafgK8t7Gst-fw4BRGeP33EqQ5zeZGk2F_ForYrURu4XqarHdP_XxeMcP74KkglpC4R9A"
style="margin-left: 1em; margin-right: 1em;"
> alt="Code-Splitting là gì"
data-original-height="359"
data-original-width="638"
height="360"
src="https://blogger.googleusercontent.com/img/a/AVvXsEhL9EMCqtqMkRUkREDxwlIE-YA9wfvxmSnBeZuc1Y2afALp03VbLNfF79L7mxMFFKV0YCd0fqYUW3nFtg_DaWUhtfmC3lCaF4V0zduEpwWkURR00jBV73eQzKFafgK8t7Gst-fw4BRGeP33EqQ5zeZGk2F_ForYrURu4XqarHdP_XxeMcP74KkglpC4R9A=w640-h360"
title="Code-Splitting là gì"
width="640"
/>
Có 3 kỹ thuật xử lý trong Code-Splitting thường được sử dụng, chúng ta cùng
lần lượt tìm hiểu và xem cách triển khai của chúng nhé.
Dynamic Import
Thông thường khi chúng ta cần import 1 module nào để sử dụng, câu lệnh import
sẽ được thực hiện như dưới đây:
style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"
>
style="line-height: 125%; margin: 0px;"
>import { add } from './math';
console.log(add(16, 26));
Đoạn khai báo trên sẽ import module math một cách đồng bộ – tức là sẽ import
vào luôn file bundle từ khởi tạo. Với Dynamic Import, chúng ta sẽ xử lý lại
đoạn code trên để chỉ import khi ứng dụng cần gọi đến phương thức add của
module math. Code sẽ được viết lại như sau:
style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"
>
style="line-height: 125%; margin: 0px;"
>import("./math").then(math => {
console.log(math.add(16, 26));
});