搜尋
首頁web前端css教學如何將LUNR搜索添加到您的Gatsby網站

如何將LUNR搜索添加到您的Gatsby網站

Jamstack Architecture在網站開發方面獲得了重大吸引力。您是否探索過Gatsby,Nuxt或Grysome?它們的易用性和預先建造的功能通常令人印象深刻。但是,搜索功能並不總是一個內置功能,對內容豐富的網站提出了挑戰。我們可以在沒有服務器端組件的情況下實現強大的搜索嗎?

jamstack固有地缺乏內置的搜索功能。這需要仔細考慮和實施。雖然存在選項,例如Algolia的搜索服務(對免費計劃的限制)或使用WPGRAPHQL和APOLLO客戶端利用WordPress的搜索,但本文側重於客戶端解決方案。

我們將使用Lunr.js構建搜索索引,並將搜索集成到Gatsby站點中,Lunr.js是一個輕巧的JavaScript庫,可提供可擴展且可自定義的搜索,而無需外部服務器依賴關係。我們最近在tartanify.com上使用它來添加“按塔爾坦名稱搜索”功能,克服了與持續的實時搜索有關的挑戰。本文將詳細介紹這些挑戰和解決方案。

入門

為簡單起見,我們將使用官方的Gatsby博客入門者。這摘要靜態網站創建的許多方面。跟隨:

 Gatsby New Gatsby-Starter-Blog https://github.com/gatsbyjs/gatsby-starter-blog
CD Gatsby-Starter-Blog
蓋茨比發展

這將創建一個帶有三個帖子的小博客,可在http://localhost:8000/ 。檢查http://localhost:8000/__graphql顯示可用數據。

通過Lunr.js實施倒立索引

Lunr採用了記錄級的倒置索引。這將站點上的每個單詞都映射到其位置(頁面路徑)。我們確定哪些字段(標題,內容,描述等)提供索引關鍵字。

對於我們的博客,我們將索引標題和內容。標題很簡單,但內容需要清潔。最初,使用rawMarkdownBody由於Markdown語法而被證明是有問題的。我們將使用html字段和striptags軟件包來刪除HTML標籤。有關詳細信息,請參閱LUNR文檔。

這是LUNR索引創建和人口片段(以後在gatsby-node.js中使用):

 const index = lunr(function(){
  this.ref('slug')
  this.field('title')
  this.field('content')
  對於(文檔的const doc){
    this.add(doc)
  }
}))

documents是一系列對象,每個對像都帶有slugtitlecontent

 {
  slug:'/post-slug/',,
  標題:“帖子標題”,
  內容:“發布所有HTML標籤的內容。”
}

我們定義一個唯一的文檔密鑰( slug )和兩個字段( titlecontent )。所有文檔都迭代添加。

gatsby-node.js中創建索引

首先,安裝必要的庫:

紗線添加lunr graphql型json striptags

接下來,修改gatsby-node.js 。該文件在站點構建過程中執行,使我們可以添加索引創建。我們將使用Gatsby Api createResolvers創建一個新的根場LunrIndex

Gatsby的數據存儲和查詢功能通過GraphQL字段解析顯示。 getAllNodes檢索指定類型的節點:

 / * gatsby-node.js */
// ...(導入)

exports.CreateReSolvers =({cache,createresolvers})=> {
  createresolvers({
    詢問: {
      lunrindex:{
        類型:GraphQljSonObject,
        分辨:(源,args,context,info)=> {
          cont blognodes = context.nodemodel.getAllNodes({type:`markdownRemark`});
          const type = info.schema.getType(`markdownRemark`);
          返回createIndex(blognodes,type,cache);
        },,
      },,
    },,
  });
};

// ...(createIndex函數)

createIndex函數利用Lunr片段:

 / * gatsby-node.js */
// ...(導入)

const createIndex = async(blognodes,type,cache)=> {
  // ...(用於獲取和處理數據的實現,包括緩存)
};

(省略了完整的createIndex函數,包括數據獲取,處理和緩存,但對於簡潔起見,但對於功能實現至關重要。原始響應提供了此細節。)這確保僅在必要時重建索引。

添加搜索表格組件

創建搜索表單組件( src/components/search-form.js ):

 // ...(搜索表格組件實現)

(對於簡潔而言,省略了完整的組件實現,但在原始響應中已詳細介紹。)此組件處理表單提交和輸入更改,並用查詢參數導航到/search

創建搜索結果頁面

創建一個搜索結果頁面( src/pages/search.js ):

 // ...(搜索結果頁面實現)

(對於簡潔而言,省略了完整的頁面實現,但在原始響應中詳細介紹。)此頁面使用LunrIndex數據顯示搜索結果。

持續的搜索小部件(tartanify.com示例)

tartanify.com示例演示了一個持久的即時搜索小部件。索引創建類似於博客示例,但更簡單:

 // ...(tartanify.com的索引​​創建)

(對於簡潔而言,省略了完整的實現,但在原始響應中已詳細介紹。)關鍵區別是由輸入更改觸發的即時搜索功能,而不是表格提交。 useStaticQuery Hook用於數據獲取。

使小部件持續

為了在頁面上維護搜索小部件,我們使用蓋茨比的wrapPageElement API:

 // gatsby-browser.js
// ...(包裝實現)

(在原始響應中詳細介紹了完整的實現。)這將頁面內容與搜索小部件包裝,以確保持久性。

自定義搜索查詢增強功能

原始響應詳細詳細介紹了使用Lunr query方法來改進搜索查詢的方法,以處理模糊匹配,通配符和布爾邏輯,以獲得更好的搜索結果。本節可顯著增強搜索體驗。

結論

在Jamstack網站中實施搜索功能是可以實現的,並且可以顯著改善用戶體驗。雖然似乎與Jamstack的無狀態性質不一致,但Lunr.js等客戶端解決方案提供了強大而靈活的替代方案。本文詳細介紹的仔細考慮和實施突出了通過周到的設計和開發創造出色的用戶體驗的潛力。

以上是如何將LUNR搜索添加到您的Gatsby網站的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用頁面CMS進行靜態站點內容管理使用頁面CMS進行靜態站點內容管理May 13, 2025 am 09:24 AM

我知道,我知道:有大量的內容管理系統選項可用,而我進行了幾個測試,但實際上沒有一個是一個,y'知道嗎?怪異的定價模型,艱難的自定義,有些甚至最終成為整個&

鏈接HTML中CSS文件的最終指南鏈接HTML中CSS文件的最終指南May 13, 2025 am 12:02 AM

鏈接CSS文件到HTML可以通過在HTML的部分使用元素實現。 1)使用標籤鏈接本地CSS文件。 2)多個CSS文件可通過添加多個標籤實現。 3)外部CSS文件使用絕對URL鏈接,如。 4)確保正確使用文件路徑和CSS文件加載順序,優化性能可使用CSS預處理器合併文件。

CSS Flexbox與網格:全面評論CSS Flexbox與網格:全面評論May 12, 2025 am 12:01 AM

選擇Flexbox還是Grid取決於佈局需求:1)Flexbox適用於一維佈局,如導航欄;2)Grid適合二維佈局,如雜誌式佈局。兩者在項目中可結合使用,提升佈局效果。

如何包括CSS文件:方法和最佳實踐如何包括CSS文件:方法和最佳實踐May 11, 2025 am 12:02 AM

包含CSS文件的最佳方法是使用標籤在HTML的部分引入外部CSS文件。 1.使用標籤引入外部CSS文件,如。 2.對於小型調整,可以使用內聯CSS,但應謹慎使用。 3.大型項目可使用CSS預處理器如Sass或Less,通過@import導入其他CSS文件。 4.為了性能,應合併CSS文件並使用CDN,同時使用工具如CSSNano進行壓縮。

Flexbox vs Grid:我應該學習兩者嗎?Flexbox vs Grid:我應該學習兩者嗎?May 10, 2025 am 12:01 AM

是的,youshouldlearnbothflexboxandgrid.1)flexboxisidealforone-demensional,flexiblelayoutslikenavigationmenus.2)gridexcelstcelsintwo-dimensional,confffferDesignssignssuchasmagagazineLayouts.3)blosebothenHancesSunHanceSlineHancesLayOutflexibilitibilitibilitibilitibilityAnderibilitibilityAndresponScormentilial anderingStruction

軌道力學(或我如何優化CSS KeyFrames動畫)軌道力學(或我如何優化CSS KeyFrames動畫)May 09, 2025 am 09:57 AM

重構自己的代碼看起來是什麼樣的?約翰·瑞亞(John Rhea)挑選了他寫的一個舊的CSS動畫,並介紹了優化它的思維過程。

CSS動畫:很難創建它們嗎?CSS動畫:很難創建它們嗎?May 09, 2025 am 12:03 AM

CSSanimationsarenotinherentlyhardbutrequirepracticeandunderstandingofCSSpropertiesandtimingfunctions.1)Startwithsimpleanimationslikescalingabuttononhoverusingkeyframes.2)Useeasingfunctionslikecubic-bezierfornaturaleffects,suchasabounceanimation.3)For

@KeyFrames CSS:最常用的技巧@KeyFrames CSS:最常用的技巧May 08, 2025 am 12:13 AM

@keyframesispopularduetoitsversatoryand and powerincreatingsmoothcsssanimations.keytricksinclude:1)definingsmoothtransitionsbetnestates,2)使用AnimatingMultatingMultationMultationProperPertiessimultane,3)使用使用4)使用BombingeNtibalibility,4)使用CombanningWiThjavoFofofofoftofofo

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用