ในระบบ 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 มีข้อดีคือ
- No Conflicts: ป้องกันปัญหาชื่อตัวแปรซ้ำกับ Library อื่น
- Better Minification: เครื่องมืออย่าง Vite/Rollup สามารถบีบอัดโค้ดได้ดีกว่า
- Security: ช่วยลดช่องโหว่จากการที่ Script แปลกปลอมมาเรียกใช้ jQuery ของเราผ่าน Global scope
ตอนนี้คุณสามารถเรียกใช้ $ ในหน้า Browser Console เพื่อทดสอบตาราง DataTables ของคุณได้แล้วครับ
อ่านเพิ่มเติม