Tích hợp Supabase với React Native: Ứng dụng mobile hoàn chỉnh

12/03/2026 P T P Chung 8 phút đọc 0 bình luận

Tại sao Supabase và React Native là cặp đôi hoàn hảo cho ứng dụng mobile

Khi xây dựng một ứng dụng mobile hiện đại, việc lựa chọn công nghệ phù hợp cho cả frontend và backend có thể quyết định sự thành bại của dự án. Supabase, một nền tảng backend-as-a-service mã nguồn mở, đang ngày càng được ưa chuộng nhờ khả năng cung cấp cơ sở dữ liệu PostgreSQL, xác thực người dùng, lưu trữ file, và API thời gian thực chỉ trong vài phút. Kết hợp với React Native - framework cho phép viết code một lần và triển khai trên cả iOS và Android - ta có một giải pháp mạnh mẽ để phát triển ứng dụng mobile nhanh chóng và hiệu quả.

Các thành phần cốt lõi của hệ sinh thái Supabase

Trước khi bắt tay vào tích hợp, cần hiểu rõ những gì Supabase cung cấp:

- PostgreSQL Database: Cơ sở dữ liệu quan hệ mạnh mẽ, hỗ trợ các ràng buộc, chỉ mục, và stored procedures. - Authentication: Hệ thống đăng nhập tích hợp sẵn với email/password, OAuth providers (Google, GitHub, Apple), và magic links. - Storage: Dịch vụ lưu trữ file an toàn, cho phép upload và quản lý ảnh, video, tài liệu. - Realtime: Cập nhật dữ liệu theo thời gian thực thông qua WebSocket, rất phù hợp cho chat, dashboard, hoặc notification. - Auto-generated APIs: Supabase tự động tạo REST và GraphQL APIs từ database schema, giúp frontend dễ dàng truy cập dữ liệu.

Thiết lập môi trường phát triển

Để bắt đầu, cần có tài khoản Supabase và project mới. Sau khi tạo project, lưu lại URL và public key - chúng sẽ được dùng để kết nối từ ứng dụng React Native.

Trong project React Native, cài đặt thư viện @supabase/supabase-js:

npm install @supabase/supabase-js

Thiết lập kết nối Supabase trong React Native

Tạo một file config để lưu trữ thông tin kết nối:

// src/config/supabase.js
import { createClient } from '@supabase/supabase-js';

const supabaseUrl = 'YOUR_SUPABASE_URL'; const supabaseKey = 'YOUR_SUPABASE_KEY';

export const supabase = createClient(supabaseUrl, supabaseKey);

Xác thực người dùng với Supabase Auth

Supabase Auth hỗ trợ nhiều phương thức đăng nhập. Dưới đây là ví dụ với email/password:

import { supabase } from '../config/supabase';

// Đăng ký const handleSignUp = async (email, password) => { const { data, error } = await supabase.auth.signUp({ email, password }); if (error) throw error; return data; };

// Đăng nhập const handleSignIn = async (email, password) => { const { data, error } = await supabase.auth.signInWithPassword({ email, password }); if (error) throw error; return data; };

// Đăng xuất const handleSignOut = async () => { const { error } = await supabase.auth.signOut(); if (error) throw error; };

Để lưu trữ session và tự động cập nhật khi người dùng đăng nhập/đăng xuất, có thể dùng Supabase Auth context:

import { useState, createContext, useContext, useEffect } from 'react';
import { supabase } from '../config/supabase';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null);

Quảng cáo

300x250 In-Content Advertisement

useEffect(() => { const { data: { subscription } } = supabase.auth.onAuthStateChange( (event, session) => { setUser(session?.user ?? null); } ); return () => subscription.unsubscribe(); }, []);

return ( <AuthContext.Provider value={{ user }}> {children} </AuthContext.Provider> ); };

export const useAuth = () => useContext(AuthContext);

Làm việc với Database và Storage

Truy vấn dữ liệu

Với Auto-generated APIs, việc đọc/ghi dữ liệu rất đơn giản:

// Lấy danh sách posts
const fetchPosts = async () => {
  const { data, error } = await supabase
    .from('posts')
    .select('*')
    .order('created_at', { ascending: false });
  if (error) throw error;
  return data;
};

// Thêm post mới const createPost = async (title, content) => { const { data, error } = await supabase .from('posts') .insert([{ title, content }]) .select() .single(); if (error) throw error; return data; };

Upload và quản lý file

// Upload ảnh
const uploadImage = async (uri, filename) => {
  const { data, error } = await supabase.storage
    .from('avatars')
    .upload(filename, {
      uri,
      name: filename,
      type: 'image/jpeg'
    });
  if (error) throw error;
  return data;
};

// Lấy URL ảnh const getImageUrl = async (path) => { const { data, error } = await supabase.storage .from('avatars') .getPublicUrl(path); if (error) throw error; return data; };

Realtime: Cập nhật dữ liệu theo thời gian thực

Một trong những tính năng mạnh mẽ nhất của Supabase là realtime subscriptions. Ví dụ, để lắng nghe thay đổi trên bảng posts:

import { supabase } from '../config/supabase';

const subscribeToPosts = (callback) => { const channel = supabase .channel('posts-channel') .on('postgres_changes', { event: '*', schema: 'public', table: 'posts' }, callback) .subscribe(); return () => supabase.removeChannel(channel); };

Khi có insert, update, hoặc delete trên bảng posts, callback sẽ được gọi, cho phép ứng dụng React Native cập nhật giao diện ngay lập tức.

Tối ưu hiệu năng và bảo mật

- Row Level Security (RLS): Bật RLS trong Supabase để đảm bảo người dùng chỉ truy cập được dữ liệu của mình. - Indexing: Tạo chỉ mục cho các cột thường xuyên query để tăng tốc độ truy xuất. - Debouncing: Với realtime subscriptions, nên debounce các cập nhật UI để tránh re-render quá nhiều lần. - Offline support: Cân nhắc dùng libraries như redux-persist hoặc async-storage để cache dữ liệu khi mất kết nối.

Kết luận

Việc tích hợp Supabase với React Native giúp giảm đáng kể thời gian phát triển backend, cho phép tập trung vào trải nghiệm người dùng và logic nghiệp vụ. Với authentication, database, storage, và realtime được đóng gói trong một nền tảng, bạn có thể xây dựng ứng dụng mobile hoàn chỉnh chỉ trong vài tuần thay vì vài tháng.

Điểm mạnh của Supabase nằm ở sự đơn giản và mở rộng: bắt đầu nhanh với auto-generated APIs, sau đó nâng cấp dần với RLS, stored procedures, hoặc custom functions khi ứng dụng lớn mạnh. Kết hợp với React Native, đây là lựa chọn lý tưởng cho startup và team nhỏ muốn ra mắt sản phẩm nhanh chóng, hoặc cho developer cá nhân muốn thử nghiệm ý tưởng mới.

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!