Nhúng bản đồ MapLibre + ô tìm địa chỉ Việt Nam bằng JavaScript thuần
Hướng dẫn nhúng bản đồ MapLibre và ô tìm kiếm địa chỉ Việt Nam bằng HTML/JavaScript thuần — không cần framework, dùng /v1/suggest của GoGoDuk, đặt ghim từ toạ độ.
Không phải dự án nào cũng cần React. Một landing page, một trang liên hệ, hay một form đặt lịch nhiều khi chỉ cần một bản đồ và một ô tìm địa chỉ — dựng bằng HTML và JavaScript thuần là xong, không phải kéo theo cả một framework.
Bài này làm đúng việc đó: nhúng bản đồ MapLibre GL JS và một ô autocomplete
địa chỉ Việt Nam, dùng hai endpoint đã public của GoGoDuk —
/v1/suggest để gợi ý và
/v1/place/resolve để lấy toạ độ — rồi đặt ghim
lên bản đồ. Toàn bộ vừa đủ trong một file HTML cộng một proxy backend nhỏ.
Vì sao chọn JavaScript thuần
Nếu bạn đã có sẵn ứng dụng React/Next.js, hãy dùng component autocomplete trong React — nó gọn gàng hơn cho form phức tạp. Nhưng với một trang tĩnh, thêm React chỉ để có một ô input là quá nặng: bundle lớn, build phức tạp, và một người mới khó sửa.
JavaScript thuần phù hợp khi:
- Trang nhỏ, ít tương tác — landing page, trang "Liên hệ", "Cửa hàng".
- Bạn nhúng bản đồ vào một site sẵn có (WordPress, HTML tĩnh) mà không muốn đổi toàn bộ stack.
- Bạn muốn hiểu rõ từng mắt xích trước khi gói nó vào một component.
Nhúng bản đồ MapLibre cơ bản
MapLibre GL JS là thư viện render bản đồ vector mã nguồn mở (nhánh tách từ Mapbox GL JS, miễn phí). Nạp nó qua CDN và tạo một bản đồ trỏ vào style của bạn:
Lưu ý MapLibre nhận toạ độ theo thứ tự [lon, lat] (kinh độ trước), ngược với
thói quen "lat, lon" — đây là lỗi sai phổ biến nhất khi mới dùng.
Tại sao phải có proxy backend
Cám dỗ lớn nhất là gọi thẳng api.gogoduk.com từ JavaScript trình duyệt. Đừng.
Làm vậy thì X-API-Key của bạn nằm lộ thiên trong tab Network và trong source —
ai cũng copy được và xài hết quota của bạn.
Cách đúng: trình duyệt gọi một route backend của chính bạn, route đó mới gắn
X-API-Key rồi chuyển tiếp sang GoGoDuk. Key không bao giờ rời khỏi server. Ví dụ
bằng Node thuần (không framework), nhưng nguyên tắc giống hệt với PHP, Python hay
bất kỳ backend nào:
Trình duyệt chỉ thấy /api/suggest và /api/resolve — không thấy key.
Thêm ô tìm kiếm + gọi /v1/suggest (có debounce)
/v1/suggest nhận input (tối thiểu 2 ký tự) và trả về danh sách predictions,
mỗi item có placeId, mainText (dòng chính) và secondaryText (phần hành chính).
Đừng bắn request mỗi ký tự — debounce lại để gộp các lần gõ nhanh thành một
request, vừa nhẹ vừa tiết kiệm quota:
Chọn kết quả → resolve toạ độ → đặt ghim
Autocomplete chỉ trả về placeId (định danh ổn định), chưa có toạ độ. Khi người
dùng bấm một gợi ý, gọi /v1/place/resolve để lấy result.lat và result.lon,
rồi đặt marker và flyTo tới đó:
Thử gõ "201 Trần Não" rồi chọn gợi ý đầu tiên — bản đồ sẽ bay tới
10.7866, 106.7298 và cắm ghim ngay tại địa chỉ đó. Toàn bộ luồng:
gõ → /v1/suggest → chọn → /v1/place/resolve → marker — gói gọn trong một file
HTML và một proxy chục dòng.
Vài lưu ý khi đưa lên production
- Tuyệt đối không để
X-API-Keyở client. Luôn đi qua proxy backend như trên. - Debounce ô input (200–400ms) để không spam request và không nhảy kết quả loạn.
- Thứ tự toạ độ: MapLibre và GoGoDuk đều dùng
[lon, lat]; field resolve tên làlon(không phảilng). Sai thứ tự là ghim rơi ra giữa biển. - Style bản đồ:
demotiles.maplibre.orgchỉ để thử. Production nên dùng một style/tile nguồn ổn định (tự host hoặc nhà cung cấp tile) để bản đồ Việt Nam nét và đủ chi tiết.
Khi nào nên lên framework
JavaScript thuần đủ tốt cho một ô tìm kiếm và một bản đồ. Nhưng khi form bắt đầu phức tạp — nhiều trường, validate, điều hướng bàn phím trong dropdown, gắn vào state của trang thanh toán — thì một component có cấu trúc sẽ dễ bảo trì hơn. Lúc đó chuyển sang component autocomplete trong React/Next.js, hoặc xem tổng quan về Vietnam Address Autocomplete API để hiểu thêm về thiết kế trải nghiệm. Muốn dựng cả tính năng tìm chi nhánh gần nhất thì có sẵn bài Store Locator bằng MapLibre.
/v1/suggest và /v1/place/resolve nằm trong gói free của GoGoDuk: 100
request/ngày mỗi tài khoản, không cần thẻ tín dụng — đủ cho prototype và nhiều
trang nhỏ chạy thật. Tạo tài khoản, lấy API key, và
nhúng bản đồ đầu tiên ngay chiều nay. Có thắc mắc hay muốn khoe sản phẩm? Tham gia
nhóm hỗ trợ Telegram của chúng tôi.
Muốn dùng GoGoDuk?
Miễn phí trọn đời — 100 request/ngày mỗi tài khoản, không cần thẻ tín dụng. Giới hạn cao hơn theo yêu cầu.
Đăng ký →