Ứng dụng quản lý tập tin hosts là công cụ thiết yếu cho nhà phát triển khi cần mô phỏng môi trường mạng, định tuyến tên miền về máy cục bộ hoặc chặn nội dung không mong muốn. Thay vì chỉnh sửa thủ công qua trình soạn thảo hệ thống, một giải pháp hiện đại nên tích hợp phát hiện tự động hệ điều hành, kiểm tra cú pháp thời gian thực, sao lưu linh hoạt và hỗ trợ đa nền tảng.
Cấu trúc kiến trúc chính
- Giao diện người dùng: Xây dựng bằng HTML/CSS/JavaScript với bố cục chia hai khung — bên trái hiển thị cây thư mục các đường dẫn tiêu chuẩn của
hoststrên Windows (C:\Windows\System32\drivers\etc\hosts), macOS/Linux (/etc/hosts); bên phải là vùng soạn thảo có highlight cú pháp và gợi ý lỗi. - Mã nền (Node.js): Sử dụng module
osđể xác định nền tảng,fs.promisesđể đọc/ghi an toàn, vàchild_processđể thực thi lệnh làm mới DNS (ví dụ:ipconfig /flushdnstrên Windows hoặcsudo dscacheutil -flushcachetrên macOS). - Tính năng nâng cao: Hàm
validateHostsEntry()kiểm tra từng dòng theo mẫuIP_ADDRESS[whitespace]DOMAIN_NAME, loại bỏ dòng trống hoặc comment không hợp lệ; nút "Chặn quảng cáo nhanh" chèn danh sách tiền định gồm0.0.0.0 adservice.google.com,127.0.0.1 doubleclick.net…
Mẫu mã xử lý hệ điều hành
const os = require('os');
const path = require('path');
function getHostsPath() {
const platform = os.platform();
switch (platform) {
case 'win32':
return path.join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'drivers', 'etc', 'hosts');
case 'darwin':
case 'linux':
return '/etc/hosts';
default:
throw new Error(`Hệ điều hành ${platform} chưa được hỗ trợ`);
}
}
Xử lý quyền hệ thống
Trên macOS và Linux, việc ghi vào /etc/hosts yêu cầu đặc quyền root. Ứng dụng sử dụng sudo-prompt để yêu cầu mật khẩu người dùng qua hộp thoại hệ thống thay vì chạy toàn bộ Electron dưới sudo — đảm bảo an toàn và tuân thủ nguyên tắc least privilege.
Tích hợp làm mới DNS
function flushDnsCache() {
const platform = os.platform();
const commands = {
win32: ['ipconfig', '/flushdns'],
darwin: ['dscacheutil', '-flushcache'],
linux: ['systemd-resolve', '--flush-caches']
};
const [cmd, ...args] = commands[platform] || [];
if (!cmd) return Promise.reject(new Error('Không hỗ trợ làm mới DNS trên nền tảng này'));
return spawn(cmd, args, { stdio: 'ignore' })
.then(() => console.log('Bộ nhớ đệm DNS đã được làm mới'))
.catch(err => console.error('Lỗi khi làm mới DNS:', err));
}
Quy trình triển khai
Sau khi phát triển xong, ứng dụng có thể đóng gói thành tệp cài đặt độc lập cho từng nền tảng bằng electron-builder. Ngoài ra, nhờ khả năng render giao diện web trong Electron, phần giao diện cũng có thể xuất ra dạng SPA (Single Page Application) để thử nghiệm nhanh trên trình duyệt mà không cần cài đặt.