Minification (lập trình)

Trong lập trình, **minification** (còn được gọi là **minimisation** hoặc **minimization**) là quá trình loại bỏ các ký tự không cần thiết từ mã nguồn hoặc chương trình thông dịch hoặc ngôn ngữ đánh dấu mà không thay đổi chức năng của nó. Các ký tự không cần thiết thường là ký tự khoảng trắng, dấu xuống dòng, comment, và đôi khi là cả dấu phân cách khối, thường được sử dụng để tăng thêm khả năng đọc cho mã nguồn, không có tác dụng để chạy. Minification giảm kích thước của mã nguồn, khiến cho việc truyền tải nó qua một mạng lưới (ví dụ như Internet) trở nên hiệu quả hơn. Trong văn hóa lập trình, việc hướng tới mã nguồn được tối giản hết mức là mục tiêu của các cuộc thi code golf.

Minification khác với nén dữ liệu ở chỗ mã nguồn được thu gọn có thể được diễn giải ngay lập tức mà không cần bước giải nén: cùng một trình thông dịch có thể làm việc với cả mã nguồn gốc cũng như với mã nguồn được thu gọn. 

Mục tiêu của minification không giống với obfuscation; mã nguồn minified có thể trở về mã nguồn ban đầu bằng các công cụ làm đẹp mã nguồn (pretty-printer) hoặc các công cụ unminifer. Tuy nhiên, để đạt được mục tiêu, minification đôi khi vẫn sử dụng các kỹ thuật cũng được sử dụng bởi kỹ thuật obfuscation; ví dụ như việc rút ngắn tên biến và tái cấu trúc mã nguồn. Các công cụ làm đẹp mã hoặc unminifier chỉ có thể đảo ngược hoàn toàn quá trình thu gọn nếu chúng được cung cấp thông tin chi tiết về các chuyển đổi do chính các kỹ thuật đó thực hiện. Khi thiếu thông tin về các thao tác thu gọn, mã nguồn được đảo ngược sẽ sử dụng tên biến và luồng điều khiển khác, nhưng vẫn giữ nguyên chức năng như mã nguồn ban đầu.

## Ví dụ
Ví dụ, ở đoạn mã JavaScript sau:

```javascript
// Đây là một comment sẽ bị loại bỏ bởi minifier
var array = [];
for (var i = 0; i < 20; i++) {
  array[i] = i;
}
```

tương đương với, nhưng dài hơn đoạn mã sau:

```javascript
for(var a=[],i=0;i<20;a[i]=i++);
```


## Lịch sử
Năm 2001, Douglas Crockford đã giới thiệu JSMin, một công cụ giúp loại bỏ comment và các dấu khoảng trắng khỏi đoạn mã JavaScript. Sau đó là YUI Compressor ra đời vào năm 2007. Vào năm 2009, Google đã ra mắt bộ công cụ Closure, trong đó có Closure Compiler với tính năng source mapping nguồn cùng với một tiện ích mở rộng Firefox có tên Closure Inspector. Năm 2010, Mihai Bazon giới thiệu UglifyJS, nhưng sau đó được thay thế bởi UglifyJS2 vào năm 2012, với khả năng hỗ trợ source mapping. Từ năm 2017, Alex Lam đã tiếp quản việc bảo trì và phát triển UglifyJS2, thay thế nó bằng UglifyJS3, một phiên bản thống nhất giữa CLI với API. Vào năm 2018, Terser được fork và được phát triển từ UglifyJS và đã được ưa chuộng nhiều. Năm 2020, Terser đã vượt xa UglifyJS về số lượt tải hàng ngày.

## Source mapping
Source map là một định dạng tập tin cho phép các công cụ phần mềm JavaScript hiển thị cho người dùng đoạn mã khác với mã nguồn thực sự được máy tính thực thi. Ví dụ, việc "ánh xạ" mã nguồn đã được minified với mã nguồn ban đầu để hỗ trợ cho việc gỡ lỗi.

Định dạng ban đầu được tạo bởi Joseph Schorr như một phần của dự án Closure Inspector minification. Phiên bản 2 và 3 của định dạng đã giảm đáng kể kích thước của tập tin "ánh xạ".

## Dạng

### Công cụ
Visual Studio Code đi kèm với khả năng hỗ trợ minification trong nhiều ngôn ngữ. Điều này có thể được thực hiện bằng cách đi tới Visual Studio Marketplace để tải xuống và cài đặt một số minifter.

Công cụ tối ưu hóa JavaScript có thể minify và tạo ra source map. Ngoài ra một số công cụ trực tuyến nhất định có thể nén CSS.

### Phát triển web
Các thành phần và thư viện dành cho các ứng dụng web và trang web đã được phát triển để tối ưu hóa các yêu cầu tập tin và giảm thời gian tải trang bằng cách thu nhỏ kích thước của nhiều tập tin khác nhau.

Tài nguyên JavaScript và CSS có thể được minified, vẫn giữ nguyên chức năng trong khi giảm đáng kể kích thước tập tin. Các thư viện trực tuyến có khả năng minify và tối ưu hóa ở các mức độ khác nhau. Một số thư viện cũng kết hợp nhiều tập lệnh thành một tập tin duy nhất để tải xuống từ phía client. Source map JavaScript có thể giúp mã nguồn dễ đọc và gỡ lỗi ngay cả sau khi đã được kết hợp và minified.

## Tham khảo