Rumah >hujung hadapan web >tutorial js >ReferenceError: tetingkap tidak ditakrifkan - Panduan Pembangun
Pernah melihat ralat ini muncul dalam konsol anda dan tertanya-tanya apa yang berlaku? Anda tidak bersendirian! Ralat "tetingkap tidak ditakrifkan" yang terkenal adalah salah satu masalah yang paling biasa bagi pembangun yang bekerja dengan React, Next.js atau mana-mana aplikasi yang diberikan sebelah pelayan (SSR).
Pertama, mari kita fahami apa sebenarnya tetingkap. Dalam JavaScript berasaskan pelayar, tetingkap ialah objek global yang mewakili tetingkap penyemak imbas. Ia mengandungi pelbagai jenis bahan berguna seperti:
Masalahnya? Objek ini hanya wujud dalam penyemak imbas. Apabila kod anda dijalankan pada pelayan (seperti semasa SSR), tiada penyemak imbas, dan oleh itu tiada objek tetingkap!
Apabila anda cuba mengakses sifat tetingkap secara terus dalam komponen anda, terutamanya semasa pemaparan awal, anda akan menghadapi ralat ini. Ini biasanya berlaku apabila menyemak dimensi skrin atau ciri penyemak imbas:
// This will break during SSR const screenWidth = window.innerWidth;
Banyak perpustakaan khusus penyemak imbas menganggap ia berjalan dalam persekitaran pelanggan. Apabila perpustakaan ini cuba mengakses tetingkap semasa pemaparan sebelah pelayan, aplikasi anda akan ranap:
// Some libraries assume window exists import someLibrary from 'browser-only-library';
localStorage ialah sifat tetingkap yang kerap diakses untuk storan sebelah pelanggan. Mencuba untuk menggunakannya semasa pemaparan pelayan akan mencetuskan ralat:
// This will fail on the server const savedData = localStorage.getItem('user-data');
Penyelesaian yang paling mudah ialah membungkus kod khusus penyemak imbas anda dalam cangkuk useEffect:
import { useEffect } from 'react'; function MyComponent() { useEffect(() => { // Safe to use window here const screenWidth = window.innerWidth; console.log('Screen width:', screenWidth); }, []); return <div>My Component</div>; }
Buat fungsi utiliti untuk menyemak tetingkap dengan selamat:
const isClient = typeof window !== 'undefined'; function MyComponent() { if (isClient) { // Safe to use window here } return <div>My Component</div>; }
Untuk aplikasi Next.js, gunakan import dinamik dengan ssr: false:
import dynamic from 'next/dynamic'; const BrowserOnlyComponent = dynamic( () => import('../components/BrowserComponent'), { ssr: false } );
Elakkan ralat "tetingkap tidak ditentukan" dengan corak yang diuji pertempuran ini:
// This will break during SSR const screenWidth = window.innerWidth;
// Some libraries assume window exists import someLibrary from 'browser-only-library';
Melupakan SSR: Sentiasa ingat bahawa kod React anda mungkin dijalankan pada pelayan dahulu, yang membawa kepada ralat "tetingkap tidak ditakrifkan".
Ketergantungan Pihak Ketiga: Sesetengah pakej menganggap ia dijalankan dalam penyemak imbas. Semak keserasian SSR mereka sebelum menggunakannya.
Import Bersyarat: Jangan gunakan import dinamik melainkan perlu - ia boleh menjejaskan prestasi.
Ingat untuk menguji aplikasi anda dalam kedua-dua persekitaran pelayan dan pelanggan. Berikut ialah persediaan ujian mudah:
// This will fail on the server const savedData = localStorage.getItem('user-data');
Ralat "tetingkap tidak ditakrifkan" mungkin kelihatan menakutkan pada mulanya, tetapi ia sebenarnya agak mudah untuk dikendalikan sebaik sahaja anda memahami sebab ia berlaku. Ingat:
Jika anda ingin mengetahui lebih lanjut tentang objek tetingkap, anda boleh membaca Dokumen Web MDN.
Selamat pengekodan! ?
Atas ialah kandungan terperinci ReferenceError: tetingkap tidak ditakrifkan - Panduan Pembangun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!