Thursday, June 4, 2009

Tối ưu hoá Blog - Blogspot


Như đã biết ở 2 entry "Hiện trạng chung dịch vụ internet tại Việt Nam" và "Tồi tệ dịch vụ internet tại Việt Nam" thì tốc độ mạng ở VN khá là cùi bắp. Để có tốc độ tốt hơn, bạn phải chi tiền ở mức hàng triệu đồng và con số đó là quá cao so với thu nhập trung bình của một người VN. Vì vậy, lượng người dùng chủ yếu ở tốc độ dưới 3Mbps nhưng đó chỉ là tốc độ theo phương diện hợp đồng, tốc độ thực thì không được như thế. Nếu có kiện cáo thì cũng chỉ nhận được câu... "Tuỳ thời điểm và trang truy cập thôi anh/chị ạ!". Khi nào ISP kí kết đảm bảo tốc độ tối thiểu thì khi đó dân tình chúng ta may ra mới nắm đằng cán (hiện giờ là nắm đằng lưỡi >"<).

Mà cũng lạ ở chỗ, đôi khi chúng ta thấy tốc độ download khá tốt nhưng khi lướt web thì tốc độ lại rất tệ. Nếu nói do server lưu trữ web có vấn đề thì cũng không hẳn vì thử nhờ 1 người bạn (tốc độ mạng và ISP như nhau) kiểm tra thì được báo lại rằng... nó vù vù. Do chương trình antivirus chăng? Nếu do nó thì sao mọi khi không bị giờ lại bị? Đau đầu thật...

Theo thống kê ở Mĩ, người dùng chỉ kiên nhẫn trong vòng 4 giây cho một trang web.

Tính toán theo lý thuyết: Cứ cho rằng tốc độ internet trung bình là 8 Mbps thì với gói cước thấp nhất mà tôi đang dùng hiện giờ là ~ 1.5 Mbps chỉ đạt 1/4.

Ghi ra giấy: 8 Mbps - 4 giây => (8/4) = 2 Mbps - (2x4) = 16 giây

Vậy: Tốc độ tải trang nên dưới 20 giây.

(Phần hướng dẫn sử dụng hình thì lời dẫn trước rồi hình ở dưới)


Trước tiên, chúng ta sẽ kiểm tra tốc độ tải trang hiện tại của bạn. Ở đây, tôi dùng trình duyệt web Firefox.

Bước 1: Tắt hết các cửa sổ của Firefox, dùng Ccleaner (mục Cleaner, tick chọn hết toàn bộ ô check trong 2 tab Windows, Applications nhưng trừ ra ô Wipe Free Space) để dọn sạch máy.

Bước 2: Mở lại Firefox, không vào blog của bạn mà vào trang StopWatch của Numion, gõ link blog bạn vào khung URL rồi click nút Start StopWatch, chờ kết quả. Đó sẽ là kết quả lần đầu của bạn (thường thì lần đầu luôn lâu hơn các lần sau), bấm Back để quay lại và làm lại một lần nữa để có kết quả lần 2 (lần 3 trở lên thì tuỳ bạn).

Tiếp theo, chúng ta sẽ tiến hành tối ưu hoá blog. Nền blog tôi dùng ở đây là BlogSpot của Google.
Bước 1: Sao lưu template phòng hờ bất trắc và phải giữ bản lưu này cho tới khi chắc chắn sự sửa đổi không gây ra lỗi gì cả, Dashboard > Layout > Edit HTML > Download Full Template

Bước 2: Tối ưu CSS
- Theo tôi biết thì 1 kí tự = 1 Byte (không định dạng), cả dấu cách (space bar trên bàn phím) cũng được tính 1 cách = 1 Byte. Vì vậy, hãy giảm thiểu những kí tự không cần thiết trong CSS và thu gọn CSS lại. Tôi hay dùng trang CleanCSS để tối ưu CSS cho blog của mình.

- Cách dùng trang CleanCSS khá đơn giản.
Chỉnh Options như hình là được

Options-CleanCSS

Mục Compression (code layout) có 5 mức độ là: Highest, High, Standard, Low và Custom. Tuỳ nhu cầu mà bạn sử dụng, nếu đoạn CSS nào bạn chắc chắn là rất ít phải sửa chữa, thay đổi thì có thể dùng mức High hoặc Highest. Còn không thì cứ để Standard.

Compress Level


Ví dụ đoạn code CSS chưa được tối ưu là:
.footer {

background:#333322;

color:#EED;

padding:10px 10px 10px 10px;

}

.footer .left {

width:64%;

}

.footer .right {

text-align:right;

width:35%;

}

.footer a {

color:#FFFFF;

text-decoration:none;

}

.footer a:hover {

text-decoration:none;

color:silver;

}

Khung Messages cho ta biết nó đã thao tác những gì (sửa, lược bỏ,...) trên đoạn CSS


Messages CleanCSS


Kết quả cuối cùng, đoạn CSS đã được tối ưu hoá. Dòng Input, Output và Compression Ratio cho ta biết nó đã giúp ta tiết kiệm được bao nhiêu Bytes vô ích!

Result CleanCSS



Ví dụ trên, tôi chỉ mới để mức Standard, nếu đưa lên Hight hoặc Hightest thì càng tiết kiệm được nhiều hơn (ở mức High, Highest thì CSS sẽ không được dễ nhìn cho lắm ^^).

Lưu ý: Nên thao tác cho từng đoạn nhỏ CSS thôi. Không nên làm một lèo vì nó có thể khiến trang bị lỗi.
Bước 3: Tối ưu JavaScript (JS)

- Với BlogSpot thì theo tôi, đặt hẳn JS trong source là tốt nhất. Nó giúp cho blog load nhanh hơn khi bạn câu link JS từ host khác. Tuy nhiên, việc làm này có thể khiến cho source rất dài cùng một vài vấn đề khác (vấn đề gì thì còn tuỳ thuộc vào nhiều thứ).

- Thứ tự JS trong source cũng rất quan trọng. Vd:
Có 2 đoạn code JS là A và B (liên quan nhau). Nếu đặt A trước B thì chạy nhưng khi ngược lại B trước A thì không chạy.

Có 1 đoạn code JS, đặt ở trước tag </head> thì chạy nhưng khi đưa xuống trước </body> thì không chạy.
...
- Hãy cố gắng tập trung tất cả code JS về cuối source (tức là trên </body>) và hạn chế ở code JS ở khoảng giữa <head></head>
- Nếu bạn dùng framework như Prototype, Scriptaculous, Mootools, JQuery,... thì hãy nén nó lại trước khi đưa vào source. Điều đó giúp bạn tiết kiệm được rất nhiều Byte vô ích.
- Trang JavaScript Compressor sẽ giúp bạn nén JS. Cách dùng cũng rất đơn giản, bạn chỉ việc copy - paste đoạn JS vào khung (nếu đoạn JS dài bạn cần chờ 1 lúc vì có thể quá trình nạp code khiến trình duyệt web của bạn bị đứng). Sau đó, bạn chỉ tick chọn JSMin hoặc Packer rồi click Compressor Rate It. Packer nén tốt hơn JSMin nhưng những kí tự nó sinh ra có khi khiến bạn khó hiểu và sẽ có vài trường hợp nén JSMin chạy được còn Packer thì không.

Một đoạn code JS chưa nén:

Object.extend(Object, {

inspect: function(object) {

try {

if (Object.isUndefined(object)) return 'undefined';

if (object === null) return 'null';

return object.inspect ? object.inspect() : String(object);

} catch (e) {

if (e instanceof RangeError) return '...';

throw e;

}

},

và đã nén ở mức JSMin, Packed

Object.extend(Object,{inspect:function(object){try{if(Object.isUndefined(object))return'undefined';if(object===null)return'null';return object.inspect?object.inspect():String(object);}catch(e){if(e instanceof RangeError)return'...';throw e;}},

Object.extend(Object,{inspect:function(a){try{if(Object.isUndefined(a))return'undefined';if(a===null)return'null';return a.inspect?a.inspect():String(a)}catch(e){if(e instanceof RangeError)return'...';throw e;}},
- Có trường hợp "không nén" thì code chạy được và ngược lại. Hoặc, một số đoạn code JS không thực thi được hay hiển thị tốt trên BlogSpot.
- Nên demo tại máy (nếu có thể) trước khi đưa vào blog. Chủ yếu của việc demo là xét xem có thể nén được không? Nén mức nào thì hợp lý và vị trí đặt code ở đâu?
- Có khả năng, khi để nhiều đoạn JS trong cùng 1 source với nhau như thế sẽ sinh ra lỗi xung đột. Khi đó, cần phải lưu đoạn code JS nào có dung lượng nhỏ hơn ra host ngoài rồi câu link vào.
Bước 4: Tối ưu source (nói chung)
- Hãy chú thích thật rõ ràng (chú thích rõ chứ không dư thừa) những đoạn code (CSS, JS,...) trong source để sau này dễ dàng tìm kiếm, thay đổi hay tối ưu.
Một loại chú thích dư thừa (loại chú thích này chỉ thích hợp khi hướng dẫn cho người đọc hiểu công dụng và khi áp dụng vào thực tế thì nó không còn cần thiết nữa)

j
/* Calendar
----------------------------------------------- */
/* The calendar Table */
table#bcalendar {border:1px solid #000;border-top:0; margin:0px 0 0px; width:100%;}
/* The Cells in the Calendar */
table#bcalendar tbody tr td {text-align:center;padding:2px;border:1px outset black;}
/* Links in Calendar */
table#bcalendar tbody tr td a {font-weight:bold; color:#fff;}

Nên tối ưu nó thành dạng sau:

/* -------------------------- Calendar */

table#bcalendar{border:1px solid #000;border-top:0;margin:0;width:100%;}

table#bcalendar tbody tr td{border:1px outset #000;padding:2px;text-align:center;}

table#bcalendar tbody tr td a{color:#fff;font-weight:700;}

Những thứ được thay đổi (giúp bạn giảm từ 0.381KB xuống còn 0.214KB, tức tiết kiệm được 43.8%) là

Đổi "0px" thành "0"

Đổi "0 0 0" thành "0"

Đổi "black" thành "#000"

Đổi "bold" thành "700"

Lược bỏ các chú thích

- Hãy chịu khó vào Dashboard > Layout > Edit HTML > tick Expand Widget Templates rồi kéo xuống phần <body></body> và dò từ từ để xoá bỏ những dòng cách không cần thiết cho đến khi hết thì thôi. Nguyên nhân là vì tôi đã từng xem source code cho 1 vài bạn và nhận ra rằng trong phần <body></body> có không ít chỗ giữa dòng này với dòng kia cách nhau tới hơn 2 dòng. Nếu cần phân biệt đoạn này với đoạn kia thì chỉ cần cách nhau 1 dòng là đủ. Còn giữa các thuộc tính, đôi khi không cần bất kì khoảng cách nào.

Quá dư (cách nhau tới 2 dòng)

</b:if></b:if>

</dd>

<dd class='comment-footer'>

</dd>

Hoặc (các thuộc tính cách nhau 1 cách)

<span style='color: blue; font-weight: bold;'>

Nên thu gọn lại sẽ hay hơn (giảm số dòng và khoảng cách dư)

</b:if></b:if>

</dd>
<dd class='comment-footer'>

</dd>
<span style='color:blue;font-weight:bold;'>


- Đưa các đoạn code JS vào sát lề trái của khung chứa source.

Đoạn code này bị cách lề trái một khoảng

function bcLoadStatus(){

cls = document.getElementById('calLoadingStatus');

img = document.createElement('img');

img.src = bcLoadingImage;

img.style.verticalAlign = 'middle';

cls.appendChild(img);

txt = document.createTextNode(bcLoadingMessage);

cls.appendChild(txt);

}

Xử lý nó

function bcLoadStatus(){

cls = document.getElementById('calLoadingStatus');

img = document.createElement('img');

img.src = bcLoadingImage;

img.style.verticalAlign = 'middle';

cls.appendChild(img);

txt = document.createTextNode(bcLoadingMessage);

cls.appendChild(txt);

}

- Gom những cái có thể ở một dòng lại với nhau.

Các thuộc tính của ul.menunew .menulienket:hover dư sức nằm trên một dòng

ul.menunew .menulienket:hover {

background:#3FF;

color:#000;

width:100px;

}

Sau khi gom lại (quá gọn)

ul.menunew .menulienket:hover{background:#3FF;color:#000;width:100px;}

Hoặc ở code JS (ở JS thì cẩn thận tí, sai một chút cũng khiến cả đoạn không chạy được)

if (act) {

if (objActive.tagName == 'A') {

objActive.style.color = clrOrg;

clearInterval(TimerID);

act = 0;

}

}

}

Chỉ thu gọn ở mấy cái {}

if (act) {if (objActive.tagName == 'A') {

objActive.style.color = clrOrg;

clearInterval(TimerID);

act = 0;}}}

Thu gọn xịn hơn, ta được (có thể dùng Javascript Compressor ở mức JSMin)

if(act){if(objActive.tagName=='A'){objActive.style.color=clrOrg;clearInterval(TimerID);act=0;}}}

Bước 5: Tối ưu Page Elements (thành phần trang)

- Hạn chế dùng quá nhiều gadget trong blog vì điều đó khiến cho blog chậm đi. Nếu có thể hãy để những gì liên quan nhau trong một gadget.

- Không dùng nhiều widget ngoài hoặc thuộc nhiều trang khác nhau.

- Không ẩn các gadget liên quan chức năng blog vì như vậy sẽ tạo sự khó chịu cho người dùng lúc cần tới nó (Vd: Phải quay lại trang chủ mới thấy được shoutbox).

- Hạn chế dùng table lồng table và không dùng frame lồng frame.

- Không lưu các file có liên quan tới cấu trúc trang trên nhiều host khác nhau để giữ được sự ổn định cho toàn blog.

- Những gì chỉ cần hiển thị khi xem một bài viết thì hãy đặt nó vào đoạn code sau:

<b:if cond='data:blog.pageType == "item"'>

Nội dung

</b:if>

- Hạn chế các đoạn JS không cần thiết như: Cấm chuột phải, hiệu ứng trỏ chuột (đồng hồ, dòng chữ bay lượn,...),...

- Hạn chế các hiệu ứng dùng flash trên blog.

- Tránh lạm dụng các biểu tượng cảm xúc.

- Nếu bạn nghĩ cách tốt nhất để xử lý hình ảnh trên blog bạn là nén ảnh tối đa hoặc dùng ảnh kích thước nhỏ thì đó là một sai lầm. Chẳng thích thú gì khi nhìn một tấm ảnh có chất lượng kém (màu không thật, gãy, mờ,...) hay có size tí xíu. Bạn nên có một phần mềm xử lý ảnh nho nhỏ trong máy để tiện cho việc xử lý (các chương trình xử lý ảnh luôn tốt hơn các trang xử lý ảnh trực tuyến). Hãy thử thay đổi giữa các định dạng ảnh JPEG, GIF, PNG để chọn ra định dạng tối ưu nhất (dung lượng, chất lượng và kích thước). Trong trường hợp bạn cần phải giữ nguyên kích thước ảnh lớn (Vd: 1024x768 px) thì bạn có thể dùng thêm một ảnh thumbnail (hình nhỏ) cho ảnh gốc.

Đoạn code HTML cho 2 ảnh gốc và thumbnail, khi click vào ảnh thumbnail nó sẽ trả ra ảnh gốc.

<a href="link ảnh gốc"><img src="link thumbnail"/></a>

Eo! Trước mắt là nhớ được có nhiêu đó nên viết cho anh em nhiêu đó. Từ từ nhớ thêm được gì thì tôi sẽ bổ sung vào sau.






























Tối ưu hoá Blog - BlogspotSocialTwist Tell-a-Friend


Đang tải xin vui lòng chờ...

0 comments:

Post a Comment

[▼/▲] Chèn biểu tượng vui danghienIT
:)) ;)) ;;) :D ;) :p :(( :) :( :X =(( :-o :-/ :-* :| 8-} :)] ~x( :-t b-( :-L x( =))

/

Chuyên mục

Tool box

Liên kết

Trao đổi Liên kết
Loading Logos...
Bookmark and Share
 

Copyright 2009 All Rights Reserved iupro theme by Dang Quang Hien