บทเรียน

พัฒนา LIFF App: สอน LINE Front-end Framework ด้วย React & Next.js

คู่มือฉบับสมบูรณ์สำหรับพัฒนา LIFF app ด้วย React และ Next.js สร้างเว็บแอปที่ทำงานภายใน LINE พร้อม authentication, การเข้าถึงโปรไฟล์ และการส่งข้อความ

LineBot.pro Team16 นาทีอ่าน
พัฒนา LIFF App: สอน LINE Front-end Framework ด้วย React & Next.js

#LIFF คืออะไร?

LIFF (LINE Front-end Framework) คือแพลตฟอร์มสำหรับสร้างเว็บแอปพลิเคชันที่ทำงานภายในแอป LINE แอป LIFF ให้ประสบการณ์คล้ายแอป native ในขณะที่ใช้เทคโนโลยีเว็บมาตรฐาน

#ฟีเจอร์หลัก

  • Seamless Authentication: เข้าถึงโปรไฟล์ LINE ของผู้ใช้โดยไม่ต้องฟอร์มล็อกอิน
  • Message Sending: ส่งข้อความไปยังแชทโดยตรงจากแอปของคุณ
  • Share Target Picker: ให้ผู้ใช้แชร์เนื้อหาไปยังเพื่อนและกลุ่ม
  • QR Code Scanner: ความสามารถสแกน barcode/QR ในตัว
  • Native Feel: ประสบการณ์เต็มหน้าจอภายใน LINE

#Use Cases

Use Caseตัวอย่างประโยชน์
E-commerceแคตตาล็อกสินค้า, checkoutไม่ต้องดาวน์โหลดแอป
Reservationsจองร้านอาหาร, นัดหมายเข้าถึงเร็วผ่าน LINE
Membershipบัตรสมาชิก, ระบบคะแนนAuto-authenticated
Formsแบบสำรวจ, ลงทะเบียนRich UX, ข้อมูลเติมล่วงหน้า
Gamesเกมมินิ, คำถามฟีเจอร์แชร์ viral

เรียนรู้เพิ่มเติมเกี่ยวกับ บริการพัฒนาแอป LINE

#ตั้งค่าโปรเจกต์

#ขั้นตอนที่ 1: สร้าง LIFF App ใน LINE Console

  1. ไปที่ LINE Developers Console
  2. เลือก provider และ channel ของคุณ
  3. ไปที่แท็บ LIFF
  4. คลิก "Add LIFF app"
  5. กำหนดค่า:
    • LIFF app name: ชื่อแอปของคุณ
    • Size: Full, Tall หรือ Compact
    • Endpoint URL: URL แอปของคุณ (ต้องเป็น HTTPS)
    • Scopes: profile, openid, chat_message.write

#ขั้นตอนที่ 2: ตั้งค่าโปรเจกต์ React/Next.js

bash
npx create-next-app@latest my-liff-app --typescript
cd my-liff-app
npm install @line/liff

#ขั้นตอนที่ 3: Initialize LIFF SDK

สร้างไฟล์ LIFF utility:

typescript
// lib/liff.ts
import liff from '@line/liff';

const LIFF_ID = process.env.NEXT_PUBLIC_LIFF_ID!;

export async function initLiff() {
  try {
    await liff.init({ liffId: LIFF_ID });
    console.log('LIFF initialized successfully');
    return true;
  } catch (error) {
    console.error('LIFF initialization failed:', error);
    return false;
  }
}

export function isLoggedIn() {
  return liff.isLoggedIn();
}

export function login() {
  liff.login();
}

export function logout() {
  liff.logout();
}

export async function getProfile() {
  if (!liff.isLoggedIn()) return null;
  return liff.getProfile();
}

export { liff };

#User Authentication

#Getting User Profile

tsx
// components/UserProfile.tsx
'use client';

import { useLiff } from './LiffProvider';
import Image from 'next/image';

export function UserProfile() {
  const { isReady, isLoggedIn, profile, login, logout } = useLiff();

  if (!isReady) {
    return <div>กำลังโหลด...</div>;
  }

  if (!isLoggedIn) {
    return (
      <button onClick={login} className="btn-primary">
        เข้าสู่ระบบด้วย LINE
      </button>
    );
  }

  return (
    <div className="flex items-center gap-4">
      {profile?.pictureUrl && (
        <Image
          src={profile.pictureUrl}
          alt={profile.displayName}
          width={48}
          height={48}
          className="rounded-full"
        />
      )}
      <div>
        <p className="font-semibold">{profile?.displayName}</p>
        <button onClick={logout} className="text-sm text-gray-500">
          ออกจากระบบ
        </button>
      </div>
    </div>
  );
}

#Messaging Integration

#Sending Messages

typescript
// ส่งข้อความไปยังแชทปัจจุบัน
async function sendMessage(text: string) {
  if (!liff.isInClient()) {
    alert('ฟีเจอร์นี้ใช้งานได้เฉพาะภายใน LINE');
    return;
  }

  await liff.sendMessages([
    {
      type: 'text',
      text: text
    }
  ]);
}

#Share Target Picker

ให้ผู้ใช้แชร์เนื้อหาไปยังเพื่อนหรือกลุ่ม:

typescript
async function shareToFriends() {
  if (!liff.isApiAvailable('shareTargetPicker')) {
    alert('ฟีเจอร์แชร์ไม่พร้อมใช้งาน');
    return;
  }

  const result = await liff.shareTargetPicker([
    {
      type: 'flex',
      altText: 'ดูสินค้านี้สิ!',
      contents: {
        type: 'bubble',
        hero: {
          type: 'image',
          url: 'https://example.com/product.jpg',
          size: 'full',
          aspectRatio: '20:13'
        },
        body: {
          type: 'box',
          layout: 'vertical',
          contents: [
            { type: 'text', text: 'สินค้าสุดเจ๋ง', weight: 'bold' },
            { type: 'text', text: '฿999', color: '#06C755' }
          ]
        }
      }
    }
  ]);

  if (result) {
    console.log('แชร์สำเร็จ');
  }
}

#Best Practices

#1. Handle External Browser

แอป LIFF สามารถเปิดใน external browsers ได้ จัดการอย่างเหมาะสม:

typescript
function App() {
  const { isReady, isInClient, isLoggedIn, login } = useLiff();

  if (!isReady) return <LoadingScreen />;

  // ถ้าไม่ได้อยู่ใน LINE และไม่ได้ล็อกอิน แสดงปุ่มล็อกอิน
  if (!isInClient && !isLoggedIn) {
    return (
      <div className="text-center p-8">
        <h1>ยินดีต้อนรับ!</h1>
        <p>เข้าสู่ระบบด้วย LINE เพื่อดำเนินการต่อ</p>
        <button onClick={login} className="btn-primary">
          เข้าสู่ระบบด้วย LINE
        </button>
      </div>
    );
  }

  return <MainApp />;
}

#2. Responsive Design สำหรับ LIFF Sizes

css
/* Compact: ~50% ของความสูงหน้าจอ */
/* Tall: ~75% ของความสูงหน้าจอ */
/* Full: 100% ของหน้าจอ */

.liff-container {
  min-height: 100vh;
  min-height: 100dvh; /* Dynamic viewport height */
}

/* Safe area สำหรับอุปกรณ์ที่มี notch */
.liff-content {
  padding-bottom: env(safe-area-inset-bottom);
}

#3. Deep Linking

สร้าง URL ที่แชร์ได้ที่เปิดหน้าเฉพาะ:

typescript
// รูปแบบ LIFF URL: https://liff.line.me/{liffId}/{path}
const productUrl = `https://liff.line.me/${LIFF_ID}/product/${productId}`;

#Deployment

#Deploy ไปยัง Vercel

bash
# ติดตั้ง Vercel CLI
npm install -g vercel

# Deploy
vercel --prod

#Environment Variables

ตั้งค่าใน Vercel dashboard หรือ .env.local:

env
NEXT_PUBLIC_LIFF_ID=your-liff-id

#Testing Checklist

  • ทดสอบในแอป LINE (iOS และ Android)
  • ทดสอบใน external browser
  • ทดสอบ login/logout flow
  • ทดสอบการส่งข้อความ (ถ้ามี)
  • ทดสอบ share target picker (ถ้ามี)
  • ทดสอบบนหน้าจอขนาดต่างๆ

#สรุป

LIFF เปิดโอกาสให้รวมเว็บแอปของคุณกับ LINE ได้อย่างทรงพลัง ประเด็นสำคัญ:

  • Initialize LIFF ตั้งแต่เริ่มต้น app lifecycle
  • จัดการทั้ง in-client และ external browser scenarios
  • ใช้ Share Target Picker สำหรับฟีเจอร์ viral
  • ยืนยัน access tokens บน backend เสมอ
  • ทดสอบอย่างละเอียดบนอุปกรณ์จริง

พร้อมสร้าง LIFF app ของคุณหรือยัง?

ลอง LineBot.pro สำหรับการพัฒนา LIFF อย่างรวดเร็วด้วย templates และ tools ของเรา สร้าง LINE mini-apps เร็วขึ้นด้วย pre-built components

แหล่งข้อมูลที่เกี่ยวข้อง:

บริการที่เกี่ยวข้อง

เกี่ยวกับ LineBot.pro

LineBot.pro คือแพลตฟอร์ม LINE automation สำหรับสร้าง Rich Menu แชทบอท และแคมเปญ broadcast บน LINE Official Account ทีมงานของเราเขียนคู่มือเหล่านี้จากประสบการณ์จริงกับ LINE Messaging API

ติดต่อเรา
บล็อก

บทความที่เกี่ยวข้อง

@line/bot-sdk Express Middleware: ตัวอย่างพร้อมใช้งานจริง พร้อม replyMessage & validateSignature
บทเรียน

@line/bot-sdk Express Middleware: ตัวอย่างพร้อมใช้งานจริง พร้อม replyMessage & validateSignature

ตัวอย่างโค้ดสำหรับ @line/bot-sdk Express middleware: signature validation, replyMessage พร้อม sentMessages, error handling และ TypeScript types พร้อม production

อ่านเพิ่มเติม
อัปเดต LINE Messaging API 2026: ฟีเจอร์ใหม่ ราคา & การเปลี่ยนแปลง (Free Tier, Mini App, Rich Menu)
ข่าว

อัปเดต LINE Messaging API 2026: ฟีเจอร์ใหม่ ราคา & การเปลี่ยนแปลง (Free Tier, Mini App, Rich Menu)

อ้างอิงครบสำหรับอัปเดต LINE Messaging API 2026: ฟีเจอร์ใหม่ การเปลี่ยนแปลงราคา (free tier ข้อความรายเดือน) ขีดจำกัด Rich Menu อัปเดต Mini App และราคาเฉพาะไทย/ไต้หวัน

อ่านเพิ่มเติม
วิธีสร้าง LINE Chatbot: บทเรียนพัฒนาบอททีละขั้นตอน
บทเรียน

วิธีสร้าง LINE Chatbot: บทเรียนพัฒนาบอททีละขั้นตอน

คู่มือฉบับสมบูรณ์สำหรับสร้าง LINE chatbot ตั้งแต่เริ่มต้น เรียนรู้ Messaging API สถาปัตยกรรม webhook การจัดการข้อความ AI integration และ deploy ด้วย Node.js และ Python

อ่านเพิ่มเติม
LineBot.pro

พร้อม Automate ธุรกิจ LINE ของคุณหรือยัง?

เริ่มทำให้การสื่อสาร LINE ของคุณเป็นอัตโนมัติกับ LineBot.pro วันนี้