cari
Rumahhujung hadapan webtutorial cssCara Mendapatkan URL Halaman Semasa di Gatsby

Cara Mendapatkan URL Halaman Semasa di Gatsby

Tugas yang seolah -olah mudah ini telah saya menggaru kepala saya selama beberapa jam semasa saya bekerja di laman web saya. Kerana ternyata, mendapatkan URL halaman semasa di Gatsby tidak semudah yang anda fikirkan, tetapi juga tidak begitu rumit untuk difahami.

Mari kita lihat beberapa kaedah membuatnya berlaku. Tetapi pertama, anda mungkin tertanya -tanya mengapa di bumi kita mahu melakukan sesuatu seperti ini.

Mengapa anda mungkin memerlukan URL semasa

Jadi sebelum kita masuk ke dalam bagaimana , mari kita jawab soalan yang lebih besar: Mengapa anda ingin mendapatkan URL halaman semasa? Saya boleh menawarkan beberapa kes penggunaan.

Tag meta

Perkara pertama yang jelas yang anda mahukan URL semasa adalah tag meta di kepala dokumen:

 <link rel="canonical" href="%7Burl%7D">
<meta property="og: url" content="{url}">

Perkongsian sosial

Saya telah melihatnya di beberapa laman web di mana pautan ke halaman semasa dipaparkan di sebelah butang perkongsian. Sesuatu seperti ini (terdapat di pasaran kreatif)

Gaya

Ini kurang jelas tetapi saya telah menggunakannya beberapa kali dengan komponen gaya. Anda boleh menjadikan gaya yang berbeza berdasarkan keadaan tertentu. Salah satu daripada syarat tersebut boleh menjadi laluan halaman (iaitu bahagian URL selepas nama tapak). Inilah contoh cepat:

 Import bertindak balas daripada 'bertindak balas';
import yang digayakan dari 'gaya-komponen';

susun atur const = ({Path, Children}) => (
  <styledlayout path="{Path}">
    {anak}
  </styledlayout>
);
    
const styledLayout = styled.main`
  latar belakang warna: $ {({path}) => (path === '/'? '#fff': '#000')};
`;

susun atur lalai eksport;

Di sini, saya telah membuat komponen susun atur gaya yang, berdasarkan jalan, mempunyai warna latar belakang yang berbeza.

Senarai contoh ini hanya menggambarkan idea dan tidak semestinya komprehensif. Saya pasti terdapat lebih banyak kes di mana anda mungkin ingin mendapatkan URL halaman semasa. Jadi bagaimana kita mendapatkannya?

Memahami masa binaan vs runtime

Tidak begitu pantas! Sebelum kita sampai ke kaedah sebenar dan coretan kod, saya ingin membuat satu perhentian terakhir dan menjelaskan secara ringkas beberapa konsep teras Gatsby.

Perkara pertama yang perlu kita fahami ialah Gatsby, antara banyak perkara lain, adalah penjana tapak statik. Ini bermakna ia mencipta fail statik (yang biasanya HTML dan JavaScript). Tiada pelayan dan tiada pangkalan data di laman web pengeluaran. Semua keping maklumat (termasuk URL halaman semasa) mesti ditarik dari sumber lain atau dihasilkan semasa masa membina atau runtime sebelum memasukkannya ke dalam markup.

Itu membawa kita kepada konsep penting kedua yang perlu kita fahami: membina masa vs runtime. Saya menggalakkan anda membaca dokumentasi rasmi Gatsby mengenainya, tetapi inilah tafsiran saya.

Runtime adalah apabila salah satu halaman statik dibuka dalam penyemak imbas . Dalam hal ini, halaman ini mempunyai akses kepada semua API pelayar yang indah, termasuk API Window yang, di antara banyak perkara lain, mengandungi URL halaman semasa.

Satu perkara yang mudah dikelirukan, terutamanya apabila bermula dengan Gatsby, ialah menjalankan Gatsby dalam terminal dalam mod pembangunan memancarkan penyemak imbas untuk anda. Ini bermakna semua rujukan kepada objek tetingkap berfungsi dan tidak mencetuskan sebarang kesilapan.

Bina masa berlaku apabila anda selesai membangun dan memberitahu Gatsby untuk menjana aset yang dioptimumkan akhir menggunakan arahan Gatsby Build. Semasa masa membina, penyemak imbas tidak wujud. Ini bermakna anda tidak boleh menggunakan objek tetingkap.

Di sini datang a-ha! seketika. Jika binaan diasingkan dari penyemak imbas, dan tidak ada pelayan atau pangkalan data di mana kita boleh mendapatkan URL, bagaimana Gatsby sepatutnya tahu nama domain yang sedang digunakan? Itulah perkara - ia tidak boleh! Anda boleh mendapatkan slug atau laluan halaman, tetapi anda tidak dapat memberitahu apa url asas. Anda mesti menentukannya.

Ini adalah konsep yang sangat asas, tetapi jika anda datang segar dengan pengalaman bertahun -tahun WordPress, ia boleh mengambil sedikit masa untuk maklumat ini untuk tenggelam. Anda tahu bahawa Gatsby adalah pelayan dan semua tetapi saat -saat seperti ini membuat anda menyedari: tidak ada pelayan.

Sekarang kita telah menyusunnya, mari kita melompat ke kaedah sebenar untuk mendapatkan URL halaman semasa.

Kaedah 1: Gunakan harta HREF dari Objek Window.Location

Kaedah pertama ini tidak khusus untuk Gatsby dan boleh digunakan dalam aplikasi JavaScript yang cukup banyak dalam penyemak imbas. Lihat, penyemak imbas adalah kata kunci di sini.

Katakan anda sedang membina salah satu komponen perkongsian dengan medan input yang mesti mengandungi URL halaman semasa. Inilah caranya anda boleh melakukannya:

 Import bertindak balas daripada 'bertindak balas';

const foo = () => {
  const url = typeof window! == 'undefined'? window.location.href: '';

  kembali (
    <input type="text" readonly value="{url}">
  );
};

Eksport lalai foo;

Jika objek tetingkap wujud, kami mendapat harta HREF objek lokasi yang merupakan anak tetingkap. Jika tidak, kami memberikan pemboleh ubah URL nilai rentetan kosong.

Sekiranya kita melakukannya tanpa cek dan tulis seperti ini:

 const url = window.location.href;

... binaan akan gagal dengan kesilapan yang kelihatan seperti ini:

 HTML statik bangunan yang gagal untuk halaman - 2.431s
Ralat #95312 
"Window" tidak tersedia semasa penyerahan sisi pelayan.

Seperti yang saya nyatakan sebelum ini, ini berlaku kerana penyemak imbas tidak wujud semasa masa membina . Itulah kelemahan yang besar dalam kaedah ini. Anda tidak boleh menggunakannya jika anda memerlukan URL untuk hadir pada versi statik halaman.

Tetapi ada kelebihan yang besar juga! Anda boleh mengakses objek tetingkap dari komponen yang bersarang di dalam komponen lain. Dalam erti kata lain, anda tidak perlu menggerudi prop URL dari komponen ibu bapa.

Kaedah 2: Dapatkan harta HREF data lokasi dari alat peraga

Setiap komponen halaman dan templat di Gatsby mempunyai prop lokasi yang mengandungi maklumat mengenai halaman semasa. Walau bagaimanapun, tidak seperti window.location, prop ini hadir di semua halaman.

Memetik Gatsby Docs:

Perkara yang menarik ialah anda boleh mengharapkan prop lokasi tersedia untuk anda di setiap halaman.

Tetapi mungkin terdapat tangkapan di sini. Sekiranya anda baru ke Gatsby, anda akan log prop itu ke konsol, dan perhatikan bahawa ia kelihatan hampir sama dengan tingkap.location (tetapi ia bukan perkara yang sama) dan juga mengandungi atribut HREF. Bagaimana mungkin ini? Nah, tidak. Prop HREF hanya ada semasa runtime.

Perkara yang paling teruk tentang ini ialah menggunakan location.href secara langsung tanpa pemeriksaan terlebih dahulu jika ia wujud tidak akan mencetuskan kesilapan semasa masa membina.

Semua ini bermakna kita boleh bergantung pada lokasi prop untuk berada di setiap halaman, tetapi tidak boleh mengharapkan ia mempunyai harta HREF semasa masa membina. Berhati -hati dengan itu, dan jangan gunakan kaedah ini untuk kes -kes kritikal di mana anda memerlukan URL berada dalam markup pada versi statik halaman.

Oleh itu mari kita menulis semula contoh sebelumnya menggunakan kaedah ini:

 Import bertindak balas daripada 'bertindak balas';

const page = ({location}) => {
  const url = location.href? location.href: '';

  kembali (
    <input type="text" readonly value="{url}">
  );
};

halaman lalai eksport;

Ini harus menjadi halaman peringkat atau templat peringkat atas. Anda tidak boleh mengimportnya di mana sahaja dan mengharapkan ia berfungsi. Prop lokasi tidak akan ditentukan.

Seperti yang anda lihat, kaedah ini hampir sama dengan yang sebelumnya. Gunakannya untuk kes -kes di mana URL diperlukan hanya semasa runtime.

Tetapi bagaimana jika anda perlu mempunyai URL penuh dalam markup halaman statik? Mari kita beralih ke kaedah ketiga.

Kaedah 3: Menjana URL Halaman Semasa dengan harta PathName dari Data Lokasi

Seperti yang dibincangkan pada permulaan jawatan ini, jika anda perlu memasukkan URL penuh ke halaman statik, anda perlu menentukan URL asas untuk laman web di suatu tempat dan entah bagaimana mendapatkannya semasa membina masa. Saya akan menunjukkan kepada anda bagaimana untuk melakukannya.

Sebagai contoh, saya akan membuat tag dalam header. Adalah penting untuk mempunyai URL halaman penuh di dalamnya sebelum halaman hits penyemak imbas. Jika tidak, enjin carian dan pengikis tapak akan melihat atribut HREF kosong, yang tidak dapat diterima.

Inilah rancangannya:

  1. Tambah harta tapak ke SiteMetadata di gatsby-config.js.
  2. Buat cangkuk pertanyaan statik untuk mendapatkan sitemetadata dalam mana -mana komponen.
  3. Gunakan cangkuk itu untuk mendapatkan Siteurl.
  4. Campurkannya dengan laluan halaman dan tambahkannya ke markup.

Mari pecahkan setiap langkah ke bawah.

Tambahkan harta tanah ke sitemetadata di gatsby-config.js

Gatsby mempunyai fail konfigurasi yang dipanggil gatsby-config.js yang boleh digunakan untuk menyimpan maklumat global mengenai laman web di dalam objek SiteMetadata. Itu berfungsi untuk kami, jadi kami akan menambah Siteurl ke objek itu:

 modul.exports = {
  sitemetadata: {
    Tajuk: 'Dmitry Mayorov',
    Penerangan: 'Dmitry adalah pemaju depan yang membina laman web yang sejuk.',
    Pengarang: '@dmtrmrv',
    Siteurl: 'https://dmtrmrv.com',
  }
};

Buat cangkuk pertanyaan statik untuk mendapatkan sitemetadata dalam mana -mana komponen

Seterusnya, kami memerlukan cara untuk menggunakan SiteMetadata dalam komponen kami. Nasib baik, Gatsby mempunyai API statik yang membolehkan kita berbuat demikian. Anda boleh menggunakan cangkuk UseStaticQuery secara langsung di dalam komponen anda, tetapi saya lebih suka membuat fail berasingan untuk setiap pertanyaan statik yang saya gunakan di laman web. Ini menjadikan kod lebih mudah dibaca.

Untuk melakukan itu, buat fail yang dipanggil Use-Site-Metadata.js di dalam folder cangkuk di dalam folder SRC laman web anda dan salin dan tampal kod berikut kepadanya.

 import {useStaticQuery, graphql} dari 'gatsby';

const useitemetadata = () => {
  const {site} = useStaticQuery (
  Graphql`
    pertanyaan {
    tapak {
      sitemetadata {
      tajuk
      Penerangan
      pengarang
      Siteurl
      }
    }
    }
  `,
  );
  kembali site.sitemetadata;
};

menggunakan kegunaan lalai eksport;

Pastikan untuk menyemak bahawa semua hak milik, keterangan, penulis, dan mana -mana sifat lain yang anda miliki dalam objek SiteMetadata - muncul dalam pertanyaan GraphQL.

Gunakan cangkuk itu untuk mendapatkan SiteUrl

Inilah bahagian yang menyeronokkan: kami mendapat URL tapak dan menggunakannya di dalam komponen.

 Import bertindak balas daripada 'bertindak balas';
Helmet import dari 'React-Helmet';
import usesitemetadata dari '../hooks/use-site-metadata';

const page = ({location}) => {
  const {siteUrl} = useItemetAdata ();
  kembali (
    <madelimet>
      <link rel="canonical" href="%7B%60%24">
    
  );
};

halaman lalai eksport;</madelimet>

Mari pecahkannya.

Pada baris 3, kami mengimport hook Useitemetadata yang kami buat ke dalam komponen.

 import usesitemetadata dari '../hooks/use-site-metadata';

Kemudian, pada baris 6, kita merosakkan data yang datang daripadanya, mewujudkan pembolehubah Siteurl. Sekarang kami mempunyai URL tapak yang tersedia untuk kami semasa membina dan runtime. Manis!

 const {siteUrl} = useItemetAdata ();

Campurkan URL tapak dengan jalan halaman dan tambahkannya ke markup

Sekarang, ingat prop lokasi dari kaedah kedua? Perkara yang hebat mengenainya ialah ia mengandungi harta PathName semasa kedua -dua membina dan runtime. Lihat ke mana ia pergi? Apa yang perlu kita lakukan ialah menggabungkan kedua -dua:

 `$ {siteUrl} $ {location.pathname}`

Ini mungkin penyelesaian yang paling mantap yang akan berfungsi di pelayar dan semasa membina pengeluaran. Saya secara peribadi menggunakan kaedah ini paling banyak.

Saya menggunakan Helmet React dalam contoh ini. Sekiranya anda tidak mendengarnya, ia adalah alat untuk menjadikan bahagian kepala dalam aplikasi React. Darrell Hoffman menulis penjelasan yang bagus di sini di CSS-Tricks.

Kaedah 4: Menjana URL halaman semasa di sebelah pelayan

Apa?! Adakah anda hanya mengatakan pelayan? Bukankah Gatsby penjana tapak statik? Ya, saya katakan pelayan. Tetapi ia bukan pelayan dalam erti kata tradisional.

Seperti yang sudah kita ketahui, Gatsby menjana (iaitu pelayan pelayan) halaman statik semasa masa membina. Di situlah nama itu berasal. Apa yang hebat tentang itu ialah kita boleh menyambungkan proses itu dengan menggunakan API berganda yang telah disediakan oleh Gatsby.

API yang paling menarik minat kami dipanggil Onrenderbody. Kebanyakan masa, ia digunakan untuk menyuntik skrip dan gaya tersuai ke halaman. Tetapi apa yang menarik tentang ini (dan API sisi pelayan yang lain) adalah bahawa ia mempunyai parameter PathName. Ini bermakna kita boleh menjana URL halaman semasa "pada pelayan."

Saya tidak akan menggunakan kaedah ini secara peribadi untuk menambah tag meta ke bahagian kepala kerana kaedah ketiga yang kita lihat lebih sesuai untuk itu. Tetapi demi contoh, izinkan saya menunjukkan kepada anda bagaimana anda boleh menambah pautan kanonik ke laman web menggunakan OnRenderBody.

Untuk menggunakan mana-mana API sisi pelayan, anda perlu menulis kod dalam fail yang dipanggil Gatsby-SSR.js yang terletak di folder root laman web anda. Untuk menambah pautan ke bahagian kepala, anda akan menulis sesuatu seperti ini:

 const react = memerlukan ('bertindak balas');
const config = memerlukan ('./ gatsby-config');

Exports.onRenderbody = ({PathName, Setetheadcomponents}) => {
  Setheadcomponents ([
    <link rel="canonical" href="%7B%60%24">,
  ]);
};

Mari pecahkan kod ini sedikit demi sedikit.

Kami memerlukan reaksi pada baris 1. Ia perlu membuat kerja sintaks JSX. Kemudian, pada baris 2, kami menarik data dari fail gatsby-config.js ke dalam pemboleh ubah konfigurasi.

Seterusnya, kami memanggil kaedah Setetheadcomponents di dalam OnRenderbody dan lulus pelbagai komponen untuk ditambah ke tajuk tapak. Dalam kes kami, ia hanya satu tag pautan. Dan untuk atribut HREF pautan itu sendiri, kami menggabungkan Siteurl dan Nama Path:

 `$ {config.sitemetadata.siteurl} $ {pathname}`

Seperti yang saya katakan sebelum ini, ini mungkin bukan kaedah pergi untuk menambah tag ke bahagian kepala, tetapi adalah baik untuk mengetahui bahawa Gatsby mempunyai API sisi pelayan yang memungkinkan untuk menghasilkan URL untuk mana-mana halaman yang diberikan semasa peringkat penyerahan pelayan.

Jika anda ingin mengetahui lebih lanjut mengenai penyampaian pelayan dengan Gatsby, saya menggalakkan anda membaca dokumentasi rasmi mereka.

Itu sahaja!

Seperti yang anda lihat, mendapatkan URL halaman semasa di Gatsby tidak begitu rumit, terutamanya apabila anda memahami konsep teras dan mengetahui alat yang tersedia untuk digunakan. Jika anda tahu kaedah lain, sila beritahu saya dalam komen!

Sumber

  • Antara muka tetingkap JavaScript
  • Gambaran Keseluruhan Proses Membina Gatsby
  • Data lokasi dari alat peraga
  • API Rendering Server Gatsby
  • React Helmet

Atas ialah kandungan terperinci Cara Mendapatkan URL Halaman Semasa di Gatsby. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
CSS Flexbox vs Grid: Kajian KomprehensifCSS Flexbox vs Grid: Kajian KomprehensifMay 12, 2025 am 12:01 AM

Memilih Flexbox atau Grid bergantung kepada keperluan susun atur: 1) Flexbox sesuai untuk susun atur satu dimensi, seperti bar navigasi; 2) Grid sesuai untuk susun atur dua dimensi, seperti susun atur majalah. Kedua -duanya boleh digunakan dalam projek untuk meningkatkan kesan susun atur.

Cara memasukkan fail CSS: Kaedah dan amalan terbaikCara memasukkan fail CSS: Kaedah dan amalan terbaikMay 11, 2025 am 12:02 AM

Cara terbaik untuk memasukkan fail CSS adalah menggunakan tag untuk memperkenalkan fail CSS luaran di bahagian HTML. 1. Gunakan tag untuk memperkenalkan fail CSS luaran, seperti. 2. Untuk pelarasan kecil, css sebaris boleh digunakan, tetapi harus digunakan dengan berhati -hati. 3. Projek besar boleh menggunakan preprocessors CSS seperti SASS atau kurang untuk mengimport fail CSS lain melalui @import. 4. Untuk prestasi, fail CSS harus digabungkan dan CDN harus digunakan, dan dimampatkan menggunakan alat seperti CSSNANO.

Flexbox vs Grid: Sekiranya saya belajar kedua -duanya?Flexbox vs Grid: Sekiranya saya belajar kedua -duanya?May 10, 2025 am 12:01 AM

Ya, youdyhouldlearnbothflexboxandgrid.1) flexboxisidealforone-dimensi, flexiblelayoutslikenavigasiMenus.2)

Mekanik Orbital (atau bagaimana saya mengoptimumkan animasi kerangka utama CSS)Mekanik Orbital (atau bagaimana saya mengoptimumkan animasi kerangka utama CSS)May 09, 2025 am 09:57 AM

Apa yang kelihatan seperti refactor kod anda sendiri? John Rhea memisahkan animasi CSS lama yang dia tulis dan berjalan melalui proses pemikiran mengoptimumkannya.

Animasi CSS: Adakah sukar untuk mencipta mereka?Animasi CSS: Adakah sukar untuk mencipta mereka?May 09, 2025 am 12:03 AM

Csanimationsarenotinherenthardbutrequirepracticeandundunderpanderofcsspropertiesandtimingfunctions.1) startwithsimpleanimationslikescalingabuttonhoverusingkeyframes.2)

@KeyFrames CSS: Trik yang paling banyak digunakan@KeyFrames CSS: Trik yang paling banyak digunakanMay 08, 2025 am 12:13 AM

@keyframesispopularduetoitsversatilityAndPowerIncreatingSmoothcsSanimations.KeyTrickSinclude: 1) definisiMoothTransitionSbetweenStates, 2) AnimatingMultiplePropertiSti

Kaunter CSS: Panduan Komprehensif untuk Penomboran AutomatikKaunter CSS: Panduan Komprehensif untuk Penomboran AutomatikMay 07, 2025 pm 03:45 PM

Csscountersareusedtomanageautomaticnumberinginwebdesigns.1) mereka yang boleh dimanfaatkan, listitems, andcustomnumbering.2) AdvancedusesIndenestedNumberingsystems.3) cabaran yang terkandung di dalam cabaran

Bayang-bayang tatal moden menggunakan animasi yang didorong oleh tatalBayang-bayang tatal moden menggunakan animasi yang didorong oleh tatalMay 07, 2025 am 10:34 AM

Menggunakan bayang -bayang skrol, terutamanya untuk peranti mudah alih, adalah sedikit UX yang telah diliputi oleh Chris sebelum ini. Geoff merangkumi pendekatan yang lebih baru yang menggunakan harta animasi-masa. Berikut adalah satu lagi cara.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Nordhold: Sistem Fusion, dijelaskan
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).