Ngôn ngữ hiển thị:
Bạn đã bao giờ tốn cả tiếng đồng hồ chỉ để cấu hình IP nội bộ, tắt tường lửa trên máy tính, rồi cuối cùng nhận ra Safari trên iPhone vẫn trơ trơ không chịu tải trang Next.js đang chạy ở localhost chưa?
Khi phát triển ứng dụng web bằng Next.js, hầu hết chúng ta đều có thói quen co kéo trình duyệt trên máy tính để giả lập giao diện mobile. Cách này nhanh, tiện, nhưng nó đánh lừa thị giác rất ghê gớm. Trình duyệt giả lập trên máy tính sử dụng phần cứng mạnh mẽ, chuột máy tính chính xác tuyệt đối và không hề có những giới hạn bảo mật nghiêm ngặt như một chiếc điện thoại thật. Đến khi ứng dụng chạy trên một chiếc iPhone chạy Safari, mọi thứ bắt đầu đổ vỡ: hiệu ứng giật lag, layout vỡ vụn, và tệ nhất là các API hiện đại bỗng dưng đình công.
Nguyên nhân gốc rễ nằm ở cơ chế bảo mật của iOS Safari. Apple kiểm soát cực kỳ gắt gao các kết nối không an toàn. Nếu bạn cố gắng truy cập vào máy tính dev thông qua địa chỉ IP nội bộ dạng http://192.168.1.x:3000, Safari sẽ lập tức chặn đứng các tính năng cần môi trường bảo mật (Secure Context). Những tính năng như truy cập Camera, định vị Geolocation, Web Clipboard API, hay Service Worker để chạy PWA đều yêu cầu một kết nối HTTPS hợp lệ.
Trước đây, giải pháp quen thuộc là tự tạo chứng chỉ SSL giả lập (Self-signed certificate) trên máy tính rồi tìm cách cài file chứng chỉ đó vào điện thoại, sau đó bật quyền tin cậy trong phần cài đặt sâu thẳm của iOS. Việc này phiền phức đến mức mỗi lần đổi máy hoặc cài lại hệ điều hành là một cơn ác mộng. Một cách khác là dùng các dịch vụ proxy đời đầu, nhưng chúng thường giới hạn băng thông hoặc bắt đăng ký tài khoản lằng nhằng ngay từ bước thiết lập đầu tiên. Cloudflare Tunnel xuất hiện và giải quyết triệt để bài toán này bằng cách tạo ra một đường ống bảo mật trực tiếp từ máy tính của bạn lên đám mây của Cloudflare, trả về một URL HTTPS "xịn" hoàn toàn miễn phí mà không đòi hỏi bất kỳ cấu hình mạng phức tạp nào.
Hãy tưởng tượng bạn đang xây dựng một tính năng quét mã QR cho một ứng dụng quản lý kho bằng Next.js. Trên máy tính, bạn bật webcam lên và mọi thứ chạy mượt mà vì Chrome chấp nhận http://localhost là một môi trường an toàn. Bạn tự tin giao diện đã responsive đẹp mắt. Nhưng khi mang ra kho thực tế, nhân viên phải dùng iPhone để quét. Bạn không thể bắt họ cầm chiếc laptop chạy vòng quanh.
Bạn quyết định lấy điện thoại quét thử. Khổ nỗi là khi gõ địa chỉ IP của máy tính vào Safari, màn hình đen thui. Trình duyệt báo lỗi không tìm thấy thiết bị camera. Bạn mất cả buổi chiều chỉ để nhận ra HTTP thường không có quyền sờ vào phần cứng của thiết bị iOS. Nếu không có HTTPS, bạn không cách nào test được hành vi vuốt chạm, tốc độ bắt hình của camera, hay độ trễ khi xử lý hình ảnh trên chip di động.
Một tình huống kinh điển khác là phát triển ứng dụng Progressive Web App (PWA). Bạn muốn kiểm tra xem tính năng lưu bộ nhớ đệm (caching) khi mất mạng có hoạt động ổn định trên iOS hay không, hay giao diện "Thêm vào màn hình chính" (Add to Home Screen) hiển thị ra sao. Service Worker của PWA tuyệt đối từ chối hoạt động trên các kết nối HTTP thông thường của mạng nội bộ. Việc thiếu một đường truyền HTTPS thực tế lúc này sẽ khiến toàn bộ quy trình kiểm thử bị đóng băng, buộc bạn phải đẩy code lên các server staging như Vercel hoặc Netlify chỉ để test một dòng code vừa sửa. Chu kỳ đợi chờ CI/CD build xong rồi mới test được trên điện thoại sẽ ngốn sạch thời gian và cảm hứng sáng tạo của bạn.
Để bắt đầu, chúng ta cần một công cụ dòng lệnh cực kỳ nhẹ tên là cloudflared. Đây là phần mềm do chính Cloudflare phát triển, đóng vai trò như một người vận chuyển, gom toàn bộ lưu lượng từ port local trên máy bạn và đẩy qua đường ống bảo mật.
Nếu bạn đang sử dụng macOS, cách nhanh nhất là cài đặt thông qua trình quản lý gói Homebrew. Hãy mở terminal lên và gõ dòng lệnh sau:
brew install cloudflaredĐối với các bạn dùng Windows, có thể sử dụng Scoop thông qua lệnh scoop install cloudflared hoặc tải trực tiếp file thực thi (.exe) từ trang chủ GitHub của Cloudflare rồi thêm vào biến môi trường PATH. Quá trình cài đặt này chỉ cần thực hiện duy nhất một lần trên máy tính của bạn.
Sau khi cài đặt xong xuôi, quy trình làm việc mỗi ngày khi dev sẽ chia làm hai bước cực kỳ đơn giản tương ứng với hai cửa sổ Terminal độc lập.
Cửa sổ Terminal thứ nhất: Di chuyển vào thư mục dự án Next.js của bạn và khởi động server phát triển như bình thường:
npm run devMặc định, Next.js sẽ lắng nghe và phục vụ ứng dụng tại địa chỉ http://localhost:3000. Hãy đảm bảo trang web của bạn đã truy cập bình thường được trên máy tính trước khi đi tiếp.
Cửa sổ Terminal thứ hai: Bây giờ là lúc phép màu xuất hiện. Bạn không cần đăng nhập, không cần tạo tài khoản Cloudflare, chỉ cần gọi lệnh yêu cầu tạo một tunnel tạm thời trỏ thẳng vào port của Next.js:
cloudflared tunnel --url http://localhost:3000Hệ thống sẽ mất khoảng vài giây để kết nối với trung tâm dữ liệu gần nhất của Cloudflare. Nhìn vào những dòng log đang chạy trên màn hình, bạn sẽ thấy một đoạn text nổi bật có cấu trúc dạng:
https://xxxx-xxxx-xxxx.trycloudflare.comĐây chính là chiếc chìa khóa vàng. Đoạn mã ngẫu nhiên phía trước được sinh ra tự động và đi kèm với chứng chỉ SSL hoàn toàn hợp lệ từ Cloudflare. Giờ thì việc cần làm chỉ là sao chép toàn bộ URL đó, gửi qua iPhone (bằng AirDrop, Note đồng bộ hoặc quét mã QR) rồi dán vào Safari. Ngay lập tức, bạn sẽ thấy giao diện ứng dụng Next.js của mình xuất hiện trên màn hình điện thoại, bất kể điện thoại đang dùng chung WiFi với máy tính hay đang bật mạng di động 4G/5G.
Mẹo xương máu: Việc gõ lại một chuỗi ký tự ngẫu nhiên dài ngoằng của Cloudflare lên điện thoại là một cực hình. Để tiết kiệm thời gian, bạn có thể cài thêm một công cụ tạo mã QR ngay trong Terminal như
qrcode-terminal. Mỗi khi Cloudflare nhả ra URL, bạn chỉ cần ném nó vào lệnh tạo QR, giơ iPhone lên quét một phát là xong, không cần phải qua các bước trung gian gửi link phức tạp.
Dù giải pháp này cực kỳ tiện lợi, có vài điểm mấu chốt bạn cần lưu ý để tránh việc vò đầu bứt tai tự hỏi tại sao ứng dụng không chạy đúng như kỳ vọng.
Thứ nhất, bản chất của lệnh chạy không cần tài khoản phía trên là tạo ra một tunnel ẩn danh và tạm thời. Nghĩa là cứ mỗi lần bạn nhấn Ctrl + C để tắt lệnh hoặc khởi động lại máy tính, URL cũ sẽ lập tức bị hủy bỏ vĩnh viễn. Khi bạn gõ lại lệnh, Cloudflare sẽ cấp cho bạn một URL hoàn toàn mới. Đừng dại dột lưu URL này vào dấu trang (bookmark) của điện thoại hay gửi nó cho đối tác với hy vọng ngày mai họ vẫn xem được. Nếu muốn một URL cố định, bạn bắt buộc phải đăng ký một tài khoản Cloudflare miễn phí, thêm tên miền của bạn vào và cấu hình một Named Tunnel thông qua dashboard của họ.
Thứ hai là câu chuyện về việc kiểm thử các tính năng đặc thù của PWA và Service Worker. Chế độ dev của Next.js (chạy lệnh npm run dev) được tối ưu cho việc chỉnh sửa code nhanh nhờ tính năng Fast Refresh. Tuy nhiên, cơ chế này đôi khi xung đột với cách thức cache dữ liệu của Service Worker, dẫn đến hiện tượng giao diện trên điện thoại không cập nhật hoặc bị lỗi Hydration (lệch cấu trúc HTML giữa server và client). Nói thẳng ra là nếu bạn muốn test hành vi ngoại tuyến (offline setup), các thông báo cài đặt ứng dụng, tốt nhất hãy chạy quy trình build sản phẩm thật trên máy local trước:
npm run build && npm startLúc này ứng dụng Next.js của bạn sẽ chạy ở chế độ Production ngay tại máy dev. Sau đó mới bật lệnh cloudflared trỏ vào. Trải nghiệm lúc này trên iPhone sẽ phản ánh chính xác 100% những gì người dùng cuối sẽ nhận được khi ứng dụng được deploy lên môi trường thật.
Q: Dữ liệu truyền qua đường ống ẩn danh của Cloudflare có an toàn không? Máy tính của mình có nguy cơ bị hack không?A: Hoàn toàn an toàn. Đường ống này chỉ mở đúng một lối đi duy nhất từ môi trường Internet vào port nội bộ mà bạn chỉ định (ở đây là port 3000). Cloudflare đóng vai trò như một bộ lọc, họ chỉ chuyển tiếp các request hợp lệ đến ứng dụng của bạn chứ không hề mở toang hệ thống file hay các cổng dịch vụ khác trên hệ điều hành. Tuy nhiên, vì URL này là công khai, bất kỳ ai có được chuỗi ký tự đó đều có thể truy cập vào bản dev của bạn, nên tránh để lộ các thông tin nhạy cảm trên giao diện khi đang bật tunnel.
Q: Tại sao không dùng ngrok cho phổ biến, mình thấy cộng đồng hay nhắc đến công cụ này?A: Ngrok từng là bá chủ ở mảng này, nhưng đó là chuyện của quá khứ. Hiện tại, phiên bản miễn phí của ngrok bóp nghẹt người dùng bằng việc giới hạn băng thông, giới hạn số lượng request trong một phút và bắt buộc phải đăng ký tài khoản, cấu hình mã Auth Token cực kỳ phiền toái. Tệ hơn nữa, mỗi khi truy cập bằng ngrok, người dùng sẽ phải bấm qua một trang cảnh báo trung gian rất khó chịu. Cloudflare Tunnel miễn phí hoàn toàn, không giới hạn băng thông và cho phép truy cập trực tiếp vào ứng dụng mà không có màn hình cảnh báo nào cản trở.
Q: Điện thoại và máy tính của mình có cần phải kết nối cùng một mạng WiFi hay không?A: Hoàn toàn không cần. Đây chính là điểm mạnh của Cloudflare Tunnel so với cách kết nối qua IP nội bộ. Vì lưu lượng được đẩy lên máy chủ toàn cầu của Cloudflare rồi mới đi ngược về điện thoại, chiếc iPhone của bạn có thể dùng mạng 4G ngoài đường, hoặc máy tính đặt ở văn phòng công ty còn bạn đang cầm điện thoại ngồi ở quán cà phê cách đó cả cây số thì kết nối vẫn hoạt động mượt mà.
Việc tích hợp Cloudflare Tunnel vào thói quen lập trình hàng ngày mang lại một sự thay đổi rất lớn về mặt tư duy tối ưu sản phẩm. Khoảng cách giữa việc "nhìn có vẻ ổn" trên trình duyệt máy tính và việc "chạy mượt mà" trên một thiết bị phần cứng thực tế được thu hẹp lại bằng không. Thay vì lười biếng bỏ qua bước test mobile hoặc chấp nhận sống chung với quy trình deploy lên staging chậm chạp, giải pháp này mang lại khả năng phản hồi ngay lập tức sau mỗi dòng code thay đổi. Sự đầu tư về mặt thời gian để làm quen với công cụ này gần như bằng không, nhưng giá trị nó mang lại cho chất lượng sản phẩm cuối cùng và sự an tâm của người lập trình là điều không thể đo đếm được.