Home

Byphunsanit

jQuery: import $ ให้เป็น global scope ?

ในระบบ Vite และ ES Modules ตัวแปรที่คุณ import เข้ามาจะถูกจำกัดขอบเขต (Scope) อยู่แค่ภายในไฟล์นั้น ๆ ทำให้คำสั่งอย่าง $ หรือ jQuery ไม่เป็น Global โดยอัตโนมัติ ถ้าหากคุณต้องการประกาศให้มันเป็น Global Scope (เพื่อให้ Script อื่นๆ หรือ Console เรียกใช้ได้)


วิธีที่ 1: ประกาศผ่าน window ในไฟล์ main.ts (วิธีที่ง่ายที่สุด)

วิธีนี้คือการใส่ตัวแปรเข้าไปใน Object window โดยตรงหลังจากที่ import เข้ามาแล้วครับ

import $ from 'jquery';

// ประกาศให้เป็น Global Scope
(window as any).$ = $;
(window as any).jQuery = $;

// ทดสอบเรียกใช้
$(() => {
    console.log("jQuery is now global!");
});

วิธีที่ 2: ตั้งค่าผ่าน vite.config.ts (วิธีที่สะอาดที่สุด)

ถ้าคุณไม่อยากมานั่งเขียน window.$ = $ ในทุกโปรเจกต์ หรือต้องการให้ Vite ช่วยจัดการเรื่องการฉีดตัวแปร (Injection) ให้โดยอัตโนมัติ ให้ใช้การตั้งค่าในไฟล์ Config ครับ

// vite.config.ts
import { defineConfig } from 'vite';

export default defineConfig({
  define: {
    // วิธีนี้จะทำให้ $ และ jQuery ใช้งานได้ทั่วทั้งโปรเจกต์
    'window.$': 'jquery',
    'window.jQuery': 'jquery',
  }
});

ข้อควรระวังเมื่อใช้ TypeScript

เนื่องจาก TypeScript จะคอยตรวจสอบว่า window มี Property ชื่อ $ หรือไม่ หากคุณไปเรียกใช้ในไฟล์อื่นแล้วเจอ Error ว่า Property ‘$’ does not exist on type ‘Window’ คุณต้องสร้างไฟล์เพื่อขยาย Type (Declaration) ดังนี้ครับ
สร้างไฟล์: src/env.d.ts (หรือเพิ่มในไฟล์ .d.ts ที่มีอยู่)

interface Window {
  $: any;
  jQuery: any;
}

💡 ทำไม jQuery 4.0 ถึงไม่แนะนำให้ทำ Global?

ใน jQuery 4.0 ทีมพัฒนาพยายามผลักดันให้ใช้ ES Modules อย่างเต็มตัว การไม่ใช้ Global Scope มีข้อดีคือ

  1. No Conflicts: ป้องกันปัญหาชื่อตัวแปรซ้ำกับ Library อื่น
  2. Better Minification: เครื่องมืออย่าง Vite/Rollup สามารถบีบอัดโค้ดได้ดีกว่า
  3. Security: ช่วยลดช่องโหว่จากการที่ Script แปลกปลอมมาเรียกใช้ jQuery ของเราผ่าน Global scope

ตอนนี้คุณสามารถเรียกใช้ $ ในหน้า Browser Console เพื่อทดสอบตาราง DataTables ของคุณได้แล้วครับ


อ่านเพิ่มเติม