Thứ Hai, 27 tháng 7, 2015

Tối ưu hóa để tăng tốc website MVC

Tối ưu hóa để tăng tốc website luôn là một vấn đề được các lập trình viên quan tâm tới bên cạnh việc tạo ra một website như ý. Hiện nay, có rất nhiều công cụ cũng như phương pháp từ đơn giản đến phức tạp nhất để tối ưu hóa website, đặc biệt là website ASP.Net MVC luôn được các lập trình viên cho là hơi "nặng" vì phải mang theo lượng lớn dll.

Tối ưu hóa để tăng tốc website ASP.Net MVC

Tôi xin giới thiệu một số phương pháp giúp chúng ta tối ưu hóa website ASP.Net MVC:

1. Nén mã CSS và Javascript
Trong ASP.Net MVC có cơ chế bundles (BundleConfig.cs), việc khai báo các file css và javascript trong file này giúp chúng ta nén các mã CSS và Javascript, từ đó giúp giảm thời gian tải trang.

2. Chuyển mã Javascript xuống cuối trang
Đây là một mẹo nhỏ rất hay tăng đáng kể tốc độ tải web. Người xem website không cần thiết phải chờ để tải hết toàn bộ mã javascript đặt ở đầu trang, cái họ cần nhìn thấy trước tiên là bố cụ trang (mã html và css) của bạn, sau đó mới đến các sự kiện phía client của javascript, vì vậy cách tối ưu nhất là hãy để chúng ở cuối trang web của bạn.

3. Chạy Release Mode
Chắc chắn là hệ thống web của bạn đang chạy trong chế độ “Release”


File file web.config:
?
1
2
3
4
<compilation debug="false" targetframework="4.0">
    <assemblies>
    </assemblies>
</compilation>
Tại sao chúng ta cần cái này: vì MVC sẽ không làm bất cứ View Look-up Caching  nếu bạn chạy ứng dụng trong chế độ Release Mode

4. Sử dụng duy nhất một View Engine Mặc định trong file global.asas.cs của chúng ta sẽ như thế này
?
1
2
3
4
5
6
protected void Application_Start()
{
   AreaRegistration.RegisterAllAreas();
   RegisterGlobalFilters(GlobalFilters.Filters);
   RegisterRoutes(RouteTable.Routes);
}
Mặc định hệ thống sẽ hỗ trợ hai engine: Razor và Aspx. Và không có lý do gì để ta phải trả phí cho cái mà ta không sử dụng, điều này sẽ làm hệ thống của chúng ta chậm, do đó chúng ta cần điều chỉnh lại, chỉ sử dụng một Engine duy nhất. Trong trường hợp này, tôi đang sử dụng Raror nên tôi sẽ add Raror Engine
?
1
2
3
4
5
6
7
8
protected void Application_Start()
{
   AreaRegistration.RegisterAllAreas();
   RegisterGlobalFilters(GlobalFilters.Filters);
   RegisterRoutes(RouteTable.Routes);
   ViewEngines.Engines.Clear();
   ViewEngines.Engines.Add(new RazorViewEngine());
}
5. Không chuyển giá trị null ViewModel đến View
Khi nào vấn đền này xảy ra
  • Bạn chuyển giá trị null ViewModel đến view dùng html helpers giống như View:
  • ?
    1
    2
    3
    4
    5
    @model PawLoyalty.ViewModels.Product  
           
    @{             
        @Html.TextBoxFor(m => m.ProductName);     
    }
  • Thường xảy ra khi Insert dữ liệu
Trong trường hợp nếu chúng ta truyền giá trị Null, thì hệ thống sẽ trả về NullReferenceException. Rõ ràng, nếu chúng ta xử lý tốt thì hệ thống sẽ không cần kiểm tra giá trị Null cho các giá trị khởi tạo, điều này gây nên sự lãng phí hệ thống
Ví dụ: khai báo này không tốt cho hệ thống
?
1
2
3
4
5
[HttpGet]
public ActionResult Add() //get empty data for user input operation
{
   return View();  //here the model instance defaults to null
}
Khai báo tốt cho hệ thống
?
1
2
3
4
5
[HttpGet]
public ActionResult Add()//get empty data for user input operation
{
   return View(new Product());//here the ViewModel Product has been sent
}
6. Sử dụng Cache khi có thể
Trong trường hợp giá trị nội dung ít thay đổi, thì việc sử dụng OutputCacheAttribute sẽ giúp các bạn tiết kiệm rất nhiều về số lượng kết nối hệ thống hoặc truy vấn dữ liệu

?
1
2
3
4
5
[OutputCache(VaryByParam = "none", Duration = 3600)]
public ActionResult Categories()
{
    return View(new Categories());
}
Trên là ví dụ mô tả cách sử dụng cache trong ASP.Net MVC. Điều này phù hợp với các ứng dụng nhỏ và sữ liệu ít thay đổi. Tuy nhiên, với các ứng dụng lớn, số lượng truy cập nhiều thì đây không phải là sự lựa chọn tốt. Khi đó các bạn nên nghĩ đến những cache khác như có memcached provider để có thể đáp ứng nhu cầu của bạn

7. Sử dụng HTTP Compression
Các bạn mở file web.config, thêm vào đoạn code sau
?
1
2
3
4
<system.webserver>
    <urlcompression dodynamiccompression="true" dostaticcompression="true" dynamiccompressionbeforecache="true">
    </urlcompression>
</system.webserver>
8. Loại bỏ những modules không sử dụng
Khi khởi tạo Project mới, khuyên các bạn nên tạo empty project để có thể loại bỏ bớt những modules (là các dll) không cần thiết so với khi tạo project dạng aplication
Các bạn khai báo thêm đoạn code sau để loại bỏ các modules không dùng
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<httpmodules>
    <remove name="WindowsAuthentication"></remove>
    <remove name="PassportAuthentication"></remove>
    <remove name="Profile"></remove>
    <remove name="AnonymousIdentification"></remove>
</httpmodules>
 
<pages buffer="true" enableviewstate="false"></pages>
 
<configuration>
    <system.web>
        <trace enabled="false"></trace>
    </system.web>
</configuration>
 
<system.web>
    <httpruntime enableversionheader="false"></httpruntime>
</system.web>
 
<httpprotocol>
    <customheaders>
    <remove name="X-Powered-By"></remove>
    </customheaders>
</httpprotocol>
Nguồn: http://www.kenhdotnet.com/

Không có nhận xét nào:

Đăng nhận xét