Giảm thiểu tập tin và làm xáo trộn tên lớp CSS

Tram Ho

Thi thoảng trong lúc rảnh dỗi, có khi nào bạn thử F12 lên để xem mấy website nổi tiếng họ đang thiết kế các thẻ html như thế nào, hay thử nghịch xem mấy file js trên các product xem họ code như thế nào không ?

Ví dụ như khi F12 lên xem các thẻ element của google. Có ai thắc mắc như mình là tại sao các thẻ class name nó được định nghĩa không theo một quy tắc nào không =))

Hay là khi soi các file js của các trang web bạn thường thấy các function định nghĩa rất linh tinh

Tẩt nhiên là phải có lí do cả chứ nhìn vào class name kia mà debug code thì có mà toang …

Lý do

Đối với các ứng dụng hiện đại ngoài việc ứng dụng chạy được còn phải quan tâm đến nhiều yếu tố như tốc độ, bảo mật, tránh sao chép ý tưởng …

Việc minify các file js, css hay obfuscate các class name sẽ có những ưu điểm sau.

  • Giảm kích thước của các file js đó đi, giúp client load những file đó nhanh hơn
  • Giấu đi các source code, tránh ăn cắp ý tưởng
  • Tránh việc sử dụng các extension can thiệp vào UI
  • ….

Minify

Cách hoạt động

Minify là một kĩ thuật sử dụng tool npm nào đó như uglify-js, minifier, babel-minify để tối giản code của bạn.

Cách tối giản thì có rất nhiều phương pháp như rút ngắn tên biến, tên hàm còn a, b, Cloại bỏ các dấu xuống dòng, khoảng trắng, index

Hoặc đơn giản là convert logic sau

Như chúng ta có thể thấy chữ true tốn đến 4 kí tự, trong khi !0 chỉ tốn có 2 kí tự.

Đôi khi mình cũng thắc mắc là có khi nào khi minify cách function bị trùng tên ???

Thực ra là đôi khi bạn thấy có vẻ các function có tên giống nhau thế thôi nhưng được đặt ở các scope khác nhau nên không bị ảnh hưởng.

Bạn có thể test việc minify thông qua một số trang online, ví dụ như Uglify JS. Ta test một đoạn code đơn giản sau đây.

Sau khi được minify thì đã tiết kiệm được 68% kích thước

Khi nào nên minify

Thực tế thì chúng ta chỉ minify trên production, mình từng thấy vài bạn chạy npm run production trên local (faceplam) …

Vì đơn giản là cải thiện kích thước file ở local không giải quyết được vấn để của ứng dụng, đôi khi nó lại là con dao hai lưỡi, khi minify chúng ta sẽ khó debug code hơn.

Để chứng minh việc minify giúp giảm kích thước file chúng ta có thể test như sau, ví dụ ở đây mình sử dụng Laravel + webpack.

Khi run npm run dev(Không minify)

Khi run npm run production(Apply minify)

Các bạn có thấy sự khác biệt chưa, nhớ sử dụng minify nhé

Obfuscate CSS class names

Trước khi đi vào cách hoạt động chúng ta có công thức đơn giản sau

Obfuscated CSS class names == Giảm kích thước file == Giảm thời gian để truyền trải qua mạng.

Đã bao giờ bạn từng thiết kế một button với class name như sau

<button class=”button button-color-red button–active”>title</button>

Việc Obfuscate có thể giúp các class name của bạn được tối giản hơn. Giảm thiểu kí tự cũng như tránh sự can thiệp của các extension.

Modules CSS giải quyết vấn đề đóng gói trong css, giúp định nghĩa lại các class name bao gồm các tên class-name, scopce, hàm băm ngẫu nhiên. Các class name có thể được định nghĩa bằng thuộc tính localIdentName. Ví dụ như [name]___[local]___[hash:base64:5]

Đi vào ví dụ thực tế khi ta sử dụng CSS modules với ReactWebpack.

Button.css

Button.js

webpack.config.js / loaders section

  • Thuộc tính modules báo cho webpack biết rằng cần phải obfuscated các class name. Bạn cũng nên đặt thuộc tính là false trong quá trình phát triển để dễ dàng debug.
  • Thuộc tính localIdentName quy định định dạng của class name sau khi được obfuscation. Như ví dụ trên chúng ta sẽ quy định class name gồm 4 kí tự, được endcode bằng sha1.

Tadaaaaaaaaaaaa, đây là thành quả.

Tổng kết

Như vậy là mình vừa giới thiệu 2 cách đơn giản để minifyobfuscate các file css, jshtml. Đối với các ông lớn như Google, Facebook họ luôn áp dụng các phương pháp này để cải thiện sản phẩm của mình.
Hay đơn giản như Chatwork cũng mới áp dụng kĩ thuật obfuscate css làm cho việc cách extension như Chat++ khó can thiệp vào UI hơn.

Cảm ơn các bạn đã theo dõi bài viết, nếu bài viết hữu ích nhớ cho mình một upvotetheo dõi để mình ra nhiều bài viết chất lượng hơn nhé.

Tham khảo: How to obfuscate CSS class names with React and Webpack

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo