Tối ưu hóa tốc độ tải ảnh toàn diện cho website

tối ưu hóa tốc độ tải ảnh

Trong bài viết này mình hướng đến mục tiêu tối đa hóa tốc độ tải ảnh tốt nhất có thể được. Đây là việc không thể không làm khi muốn tăng tốc website. Các trang sử dụng WordPress sẽ được hưởng lợi nhiều nhất, tuy nhiên các trang web sử dụng CMS khác cũng có thể thấy có ích vì bộ khung lý thuyết vẫn giống hệt nhau, chỉ công cụ là khác.

Tại sao tối ưu tốc độ tải ảnh lại quan trọng?

Ảnh chiếm phần lớn dung lượng của trang web, với mức độ dao động tùy từng website, và từng trang cụ thể trong chính website đó, và có thể lên đến 60 – 70% dung lượng toàn trang.

Ảnh trên web ở nhiều vị trí khác nhau, không chỉ ảnh minh họa cho bài viết chính, ảnh còn có các vai trò và ở các vị trí thường gặp khác như:

  • logo của trang web
  • banner của trang web
  • ảnh nền (background)
  • avatar của người bình luận
  • icon
  • vân vân

Tất cả những ảnh này đều làm gia tăng dung lượng và tăng số lượng kết nối, và hệ quả là làm tăng thời gian tải trang.

Những trang thương mại điện tử cũng thường sử dụng nhiều ảnh có dung lượng lớn do phải đáp ứng nhu cầu người mua xem được ảnh có chất lượng cao ở nhiều góc nhìn khác nhau.

Vậy làm thế nào để tối ưu tốc độ tải ảnh?

Để tối ưu hóa tốc độ tải ảnh, hiện các biện pháp sau được đồng thời sử dụng:

Sử dụng định dạng ảnh thích hợp

Có nhiều định dạng ảnh như jpg, png, gif và svg, vân vân. Trong đó phổ biến nhất là jpg và png. Ảnh trên website có nhiều kiểu, nhưng tựu trung lại có thể phân làm hai là ảnh thực và ảnh nhân tạo. Ảnh thực nói nôm na là các ảnh bạn chụp bằng máy ảnh hay điện thoại, còn ảnh nhân tạo tức là các ảnh được tạo từ máy tính như là các icon, ảnh chụp màn hình. Nhìn chung ảnh thực lưu dưới định dạng jpg thì tiết kiệm dung lượng hơn nhiều so với các định dạng khác, còn các ảnh do máy tính tạo các định dạng khác thường tốt hơn.

Ảnh JPG (61KB, chưa nén)Ảnh PNG (347KB, chưa nén)
ảnh mèo JPGảnh mèo PNG

P/S: Nếu chẳng may bạn có ảnh không đúng định dạng làm cho ảnh có dung lượng lớn bất thường, có nhiều công cụ online giúp bạn chuyển đổi định dạng. Chỉ cần tra cụm từ khóa kiểu như “convert png to jpg” (chuyển ảnh png sang jpg).

Có thể bạn quan tâm: Dịch vụ SEO Smash của Đức Anh Plus, chuyên tối ưu cho website WordPress: Báo cáo các lỗi SEO cơ bản, kết hợp với Tăng tốc web. Bạn có thể mua riêng dịch vụ tăng tốc (gói Speed) hoặc mua riêng báo cáo lỗi SEO (gói Report) nếu muốn. Bạn tìm hiểu thêm ở liên kết này

Up ảnh đúng kích cỡ

Sử dụng ảnh đúng kích cỡ là một trong các biện pháp giúp tăng tốc đơn giản nhất mà lại vô cùng hiệu quả. Giống như câu tục ngữ “giết gà dùng dao mổ trâu” ý chỉ những việc đơn giản nhưng lại huy động nguồn lực quá lớn, có nhiều người có thói quen up các ảnh lớn lên trang, trong khi kích thước ảnh thực sự sử dụng lại nhỏ hơn nhiều. Chẳng hạn giao diện chỉ cần ảnh 800px nhưng lại up ảnh có kích cỡ lên đến 2000px. Tuy rằng có những trường hợp ngoại lệ thì bạn vẫn phải sử dụng ảnh kích cỡ lớn, thí dụ như ảnh sản phẩm để người mua hàng click vào xem cho rõ, nhưng trong phần lớn trường hợp thì không cần như vậy. Chỉ cần giảm một nửa kích cỡ ảnh, dung lượng có thể giảm đi đến bốn lần. 2 ảnh bên dưới giống nhau, nhưng kích cỡ khác nhau làm dung lượng chênh lệch rất lớn.

Ảnh nhỏ (109KB – chiều rộng 640px)Ảnh lớn (409KB – chiều rộng 1280px)
ảnh nhỏ nhẹ hơnảnh lớn

Với ảnh kích cỡ tối ưu chỉ có dung lượng 21KB (chưa nén) – chiều rộng 300px:

ảnh kích cỡ tối ưu

Nén ảnh

Các ảnh jpg, png, gif, vân vân được nén để giảm dung lượng ảnh. Có hai kiểu nén là nén không mất chất lượngcó mất chất lượng. Nén mất chất lượng giảm được nhiều dung lượng hơn nhưng cái giá phải trả là chất lượng ảnh bị suy giảm. Trong phần lớn trường hợp tôi khuyên các bạn chỉ sử dụng biện pháp nén ảnh không mất chất lượng để đảm bảo tính thẩm mỹ, và tránh trường hợp “lỡ tay”. Trong trường hợp bạn thích siêu nén, hãy thử nghiệm ngẫu nhiên vài chục bức ảnh để tìm được điểm cân bằng giữa chất lượng suy giảm và dung lượng tiết kiệm được. Ngoài ra khi sử dụng các kiểu nén mất chất lượng nên tìm các plugin có khả năng backup để có thể khôi phục lại ảnh gốc khi cần.

Sử dụng ảnh WebP

Ảnh WebP là định dạng ảnh mới do Google phát triển từ quãng năm 2011, đây là định dạng ảnh có khả năng tiết kiệm dung lượng tốt nhất hiện nay với khả năng nén tối hơn các phương pháp hiện có đến 20 – 30%. Tuy nhiên nhược điểm là không sử dụng được trên một số trình duyệt không hỗ trợ, thí dụ như safari (trình duyệt của Apple; iphone thì rất phổ biến). Vấn đề này tôi sẽ đề cập chi tiết sau.

Ảnh JPG (58KB, đã nén)Ảnh WebP (37KB)
ảnh mèo JPGảnh mèo WebP

Tích hợp CDN

Mạng CDN giúp tải ảnh cho người dùng từ máy chủ gần nhất, qua đó làm giảm rất nhiều độ trễ. Ảnh lưu ở host gốc tại Hoa Kỳ có thể được tải qua CDN có PoP ngay tại Việt Nam. Tốc độ gia tăng rất đáng kể. CDN là một trong những cột trụ quan trọng nhất không chỉ cho việc tải ảnh, mà còn là các nội dung tĩnh khác như CSS và JS. Đóng góp của CDN trong việc tăng tốc độ website nói chung là rất quan trọng.

So sánh tốc độ tải ảnh khi không có CDN và có CDN:

Sử dụng Lazy load

Đây không phải là biện pháp tăng tốc độ ảnh về mặt bản chất, nó thực tế là việc ngăn không cho tải ảnh khi ảnh không nằm trong khung nhìn của người dùng (above the fold). Có rất nhiều trang phong phú ảnh, và ảnh không chỉ nằm trong màn hình đầu tiên mà còn có rất nhiều ảnh bên dưới. Khi đó lazy load làm một việc đó là trì hoàn tải các ảnh ở bên dưới đó (vì người dùng chưa kéo đến) và ưu tiên hiển thị nội dung thuộc màn hình đầu tiên mà thôi. Chỉ khi người xem kéo tới phần đó thì ảnh mới được tải.

Bạn có thể kiểm tra tính năng lazy load ở liên kết sau, nó có khoảng 50 ảnh, tải vẫn rất nhanh, vì nó chỉ tải các ảnh ban đầu trước, sau khi bạn kéo xuống nó mới tải các ảnh tiếp theo: https://chimcat.net/check-tinh-nang-lazy-load/

Hoặc bạn có thể xem video bên dưới…Có điểm cần lưu ý là Lazy load chỉ mượt trên mạng kết nối ổn định và dung lượng một bức ảnh không quá lớn (khoảng 100 KB/bức):

Nếu một trong hai điều kiện trên không đạt được, sẽ xảy ra hiện tượng “trễ”, tức là người dùng kéo đến phần có ảnh rồi mà ảnh vẫn chưa tải hết và tải rất chậm, có khả năng cao làm người dùng khó chịu.

Sử dụng cache phía trình duyệt để lưu ảnh

Có những ảnh lặp lại giữa các trang, thí dụ như ảnh logo, banner, ảnh nền, icon. Với những ảnh đó nếu thực hiện cache phía trình duyệt (hay còn gọi là lưu vào bộ nhớ đệm trình duyệt), thì kể từ lần xem sau, người dùng không phải tải các ảnh đó nữa, mà sử dụng ảnh lưu tại cache trình duyệt họ đang dùng. Thao tác thiết lập cache trình duyệt rất đơn giản, bạn xem trong link trên là thấy. Hầu hết các plugin cache của WordPress cũng tích hợp sẵn tính năng này bên trong.

Sử dụng ảnh Base64

Đây là kiểu mẹo vặt, vì nó giúp bạn tăng tốc chỉ chút xíu thôi. Ảnh Base64 cho phép bạn inline trực tiếp vào HTML chứ không còn dạng là link ảnh ngoài nữa, qua đó giảm số lượng kết nối. Cách làm bạn xem ở đây: https://chimcat.net/hinh-anh-ma-hoa-base64/. Thường áp dụng với icon, logo nhỏ, các ảnh có kích cỡ lớn không nên áp dụng vì kích thước ảnh tạo bằng Base64 sẽ lớn hơn nhiều và bất lợi này không bù đắp nổi lợi ích nhờ giảm được một (hoặc vài) kết nối.

Sử dụng ảnh avatar lưu tại host của bạn

Cũng là dạng mẹo vặt. Những trang WordPress có nhiều bình luận thì ảnh avatar có thể trở thành vấn đề, vì ảnh này đó có thể lưu tại máy chủ gravatar, nếu người đấy có đăng ký và gây gia tăng số lượng kết nối. Biện pháp khắc phục là sử dụng plugin chuyển ảnh về host, hoặc sử dụng chung ảnh giữa những người bình luận. Chỉ cần biểu tượng để cho thấy đó là khách bình luận, dĩ nhiên nếu làm vậy bạn phải hy sinh tính độc đáo của avatar ảnh chụp. Plugin có thể làm việc này là WP User Avatar.

Các plugin

  1. Với ảnh thừa kích cỡ, dung lượng ảnh tăng lên rất nhiều. Biện pháp tốt nhất là mỗi khi up ảnh bạn nên để ý xem ảnh mình up lên có kích cỡ là bao nhiêu. Ảnh không nên thừa cũng không nên thiếu. Hãy nghĩ nó như chuyện chọn trang phục vậy, dài hay ngắn thì đều bất tiện và xấu. Nhiều plugin nén ảnh của WordPress có tính năng resize ảnh, nó cho phép bạn chọn lựa kích cỡ ảnh tối đa, và khi nó quét trang web thấy bất kỳ ảnh nào lớn hơn kích cỡ tối đa thì nó sẽ chuyển về kích cỡ mà bạn cho phép. Ví dụ về tính năng resize ảnh của plugin Shortpixel, đây cũng là plugin nén ảnh mà tôi yêu thích:resize ảnh
  2. Plugin nén ảnh của WordPress có rất nhiều, trong link ở mục 1 tôi có trỏ đến bài viết đánh giá 5 plugin nén ảnh hay được dùng. Nhiều trong số này có phiên bản miễn phí hoặc có áp hạn chế, nói chung nếu trang bạn không cần tối ưu cao nhất thì các bản miễn phí cũng đủ dùng. Còn muốn chất lượng hơn bạn nên dùng bản có phí. Với những trang không dùng WordPress bạn vẫn có thể sử dụng nén ảnh tiện lợi bằng cách sử dụng API tích hợp vào website. Một cách nén ảnh khác cho bất cứ CMS nào là sử dụng phần mềm nén trước ngay tại máy tính rồi up lên trang sau. Các phần mềm như vậy có rất nhiều và có cả miễn phí (ví dụ phần mềm Caesium) lẫn trả phí.
  3. Ảnh WebP là biện pháp siêu nén, hiện không có cách thức nén ảnh nào tốt hơn nó cả. Tuy nhiên như đã nói ở trên việc một số trình duyệt không hỗ trợ làm cho thao tác tích hợp WebP vào website là một nhiệm vụ không mấy dễ dàng, nhất là khi kết hợp thêm với CDN cùng Cache. Để sử dụng WebP trên WordPress hiện mình biết ba plugin là ShortPixel, EWWW và WebP Express. Trong đó EWWW cho bạn giải pháp miễn phí (mặc dù nó cũng có gói tính phí), còn ShortPixel cần bỏ tiền ra mua (giá không cao, mình nghĩ phần lớn chủ trang sẽ chấp nhận được, chỉ vài USD là bạn nén được hàng chục ngàn bức ảnh), còn WebP Express là giải pháp trung gian… ShortPixel mình thấy tích hợp WebP vào website chuẩn hơn so với EWWW vì nó sử dụng thẻ <picture> chứ không phải thông qua chỉnh sửa .htaccess để đánh lừa MIME type. Hiện WebP được hỗ trợ trên Chrome, Opera ở cả phiên bản máy bàn và di động. Trên Firefox và Edge trên phiên bản desktop (chưa hỗ trợ di động). Còn Safari không có bất cứ hỗ trợ nào, do vậy nếu người dùng của bạn thiên về sử dụng Safari thì áp dụng WebP có thể không đem lại tác dụng nào đáng kể (hãy lưu ý đến mức độ phổ biến của iphone ở Việt Nam). Ở chiều ngược lại nếu người dùng của bạn dùng phần lớn trình duyệt tương thích WebP thì việc sử dụng nó sẽ đem lại lợi ích có ý nghĩa
  4. CDN giờ rất nhiều trang web áp dụng, nó dường như đã thành chuẩn phổ thông, và không chỉ dành cho các trang lớn. Hiện ở Việt Nam có nhiều nơi mở dịch vụ CDN như BizFly Cloud CDN hay KCDN. Các dịch vụ ngoài nước cũng có nhiều, một vài cái tên có thể kể đến như KeyCDN, MaxCDN, BunnyCDN…Tuy nhiên nhược điểm của dịch vụ nước ngoài là ít có PoP ở Việt Nam. Hiện tại bản thân mình dùng CDNSun, họ có 2 PoP ở Hà Nội và Sài Gòn. Các plugin để tích hợp CDN vào website có khá nhiều, và một số plugin cache tích hợp sẵn tính năng này. Nếu muốn plugin chuyên cho việc này, bạn có thể dùng CDN Enabler do KeyCDN phát triển, nó rất dễ dùng. Một lưu ý nhỏ khi dùng CDN sao cho tối ưu và tiết kiệm tiền là bạn nên kết hợp nó với nén ảnh và lazy load, ngoài ra để phòng rủi ro nên lựa chọn các PoP thích hợp và đặt giới hạn chi tiêu
  5. Lazy load là cách rẻ tiền nhất mà vô cùng hiệu quả trong việc tăng tốc website. Thực ra có 2 kiểu lazy load, một kiểu là khung nhìn kéo đến đâu thì tải ảnh đến đó, nó có ưu điểm là tiết kiệm băng thông, nhưng có nhược điểm là chỉ thích hợp với các kết nối ổn định. Do vậy kiểu này thường chỉ ổn trên desktop, còn mobile sử dụng 3G có thể không nên dùng. Kiểu lazy thứ hai được gọi đúng tên hơn là trì hoãn tải ảnh, phương pháp này ưu tiên tải nội dung thuộc màn hình đầu tiên trước, sau đó mới tải ảnh sau, ưu điểm là không bị ảnh hưởng bởi kiểu kết nối, nhưng cách này không tiết kiệm băng thông và hiện không có plugin hỗ trợ. Với kiểu đầu tiên bạn có thể sử a3 Lazy Load, Lazy Load by WP Rocket. Một số plugin cache cũng tích hợp sẵn tính năng này. A3 Lazy Load còn có khả năng lazy cả ảnh có định dạng WebP

Vấn đề khi tích hợp toàn bộ các kiểu tối ưu

Khi thử kết hợp tất cả các biện pháp tối ưu trên bạn sẽ sớm nhận ra vấn đề là chúng thường không tương thích nhau, nhất khi dùng CDN + plugin cache mà lại muốn dùng WebP. Nhưng CDN và Cache thì không thể bỏ được nếu muốn tối ưu tốt nhất nên trong phần này mình sẽ chỉ ra cách khắc phục.

  • Nếu muốn nén ảnh (jpg, png) + Lazy Load + CDN (không dùng WebP) thì giải pháp tốt nhất mà mình biết là dùng plugin WP-Rocket + ShortPixel, nhược điểm là cả hai thằng này đều có phí. Giải pháp miễn phí là WP Super Cache + EWWW + a3 Lazy Load
  • Nếu muốn nén ảnh (jpg, png) + WebP + Lazy Load (không dùng CDN vì lý do kinh tế) thì giải pháp tốt nhất là WP-Rocket (hoặc WP Super Cache) + ShortPixel + [a3 Lazy Load (hoặc Lazy Load by WP Rocket) – chỉ cần thiết khi dùng WP Super Cache vì WP-Rocket đã có sẵn tính năng Lazy Load]
  • Nếu muốn nén ảnh (jpg, png) + WebP + Lazy Load + CDN thì giải pháp tốt nhất là EWWW (hoặc ShortPixel) + CDN Enabler + Cache Enabler (dùng để tạo phiên bản cache dành riêng cho WebP) + a3 Lazy Load, cái này có ưu điểm là hầu hết các plugin đều miễn phí. Lựa chọn khác nếu bạn dùng cache phía máy chủ (chẳng hạn như Varnish cache) là ShortPixel + CDN Enabler

1 thought on “Tối ưu hóa tốc độ tải ảnh toàn diện cho website”

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top