国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table of Contents
Getting Started
Implementing an Inverted Index with Lunr.js
Adding the Search Form Component
Creating the Search Results Page
Persistent Search Widget (Tartanify.com Example)
Making the Widget Persistent
Custom Search Query Enhancements
Conclusion
Home Web Front-end CSS Tutorial How to Add Lunr Search to Your Gatsby Website

How to Add Lunr Search to Your Gatsby Website

Apr 07, 2025 am 09:54 AM

How to Add Lunr Search to Your Gatsby Website

The Jamstack architecture is gaining significant traction for website development. Have you explored Gatsby, Nuxt, or Gridsome? Their ease of use and pre-built features are often impressive. However, search functionality isn't always a built-in feature, presenting a challenge for content-rich sites. Can we implement robust search without server-side components?

Jamstack inherently lacks built-in search capabilities. This requires careful consideration and implementation. While options exist, such as Algolia's search-as-a-service (with limitations on free plans) or leveraging WordPress's search with WPGraphQL and Apollo Client, this article focuses on a client-side solution.

We'll build a search index and integrate search into a Gatsby site using Lunr.js, a lightweight JavaScript library offering extensible and customizable search without external server dependencies. We recently used it on tartanify.com to add a "Search by Tartan Name" feature, overcoming challenges related to persistent, real-time search. This article will detail those challenges and solutions.

Getting Started

For simplicity, we'll use the official Gatsby blog starter. This abstracts many aspects of static website creation. To follow along:

gatsby new gatsby-starter-blog https://github.com/gatsbyjs/gatsby-starter-blog
cd gatsby-starter-blog
gatsby develop

This creates a small blog with three posts, accessible at http://localhost:8000/. Inspecting http://localhost:8000/__graphql reveals the available data.

Implementing an Inverted Index with Lunr.js

Lunr employs a record-level inverted index. This maps each word on the site to its location (page paths). We determine which fields (title, content, description, etc.) provide indexing keywords.

For our blog, we'll index titles and content. Titles are straightforward, but content requires cleaning. Initially using rawMarkdownBody proved problematic due to markdown syntax. We'll use the html field and the striptags package to remove HTML tags. Refer to the Lunr documentation for details.

Here's the Lunr index creation and population snippet (used later in gatsby-node.js):

const index = lunr(function () {
  this.ref('slug')
  this.field('title')
  this.field('content')
  for (const doc of documents) {
    this.add(doc)
  }
})

documents is an array of objects, each with slug, title, and content:

{
  slug: '/post-slug/',
  title: 'Post Title',
  content: 'Post content with all HTML tags stripped out.'
}

We define a unique document key (slug) and two fields (title and content). All documents are added iteratively.

Creating the Index in gatsby-node.js

First, install necessary libraries:

yarn add lunr graphql-type-json striptags

Next, modify gatsby-node.js. This file executes during site build, allowing us to add index creation. We'll use the Gatsby API createResolvers to create a new root field, LunrIndex.

Gatsby's data store and query capabilities are exposed via GraphQL field resolvers. getAllNodes retrieves nodes of a specified type:

/* gatsby-node.js */
// ... (imports)

exports.createResolvers = ({ cache, createResolvers }) => {
  createResolvers({
    Query: {
      LunrIndex: {
        type: GraphQLJSONObject,
        resolve: (source, args, context, info) => {
          const blogNodes = context.nodeModel.getAllNodes({ type: `MarkdownRemark` });
          const type = info.schema.getType(`MarkdownRemark`);
          return createIndex(blogNodes, type, cache);
        },
      },
    },
  });
};

// ... (createIndex function)

The createIndex function utilizes the Lunr snippet:

/* gatsby-node.js */
// ... (imports)

const createIndex = async (blogNodes, type, cache) => {
  // ... (Implementation to fetch and process data, including caching)
};

(The complete createIndex function, including data fetching, processing, and caching, is omitted for brevity but is crucial for a functional implementation. The original response provides this detail.) This ensures the index is only rebuilt when necessary.

Adding the Search Form Component

Create a search form component (src/components/search-form.js):

// ... (search form component implementation)

(The complete component implementation is omitted for brevity but is detailed in the original response.) This component handles form submission and input changes, navigating to /search with the query parameter.

Creating the Search Results Page

Create a search results page (src/pages/search.js):

// ... (search results page implementation)

(The complete page implementation is omitted for brevity, but is detailed in the original response.) This page uses the LunrIndex data to display search results.

Persistent Search Widget (Tartanify.com Example)

The tartanify.com example demonstrates a persistent instant search widget. The index creation is similar to the blog example, but simpler:

// ... (index creation for tartanify.com)

(The complete implementation is omitted for brevity but is detailed in the original response.) The key difference is the instant search functionality triggered by input changes, not form submission. The useStaticQuery hook is used for data fetching.

Making the Widget Persistent

To maintain the search widget across page changes, we use Gatsby's wrapPageElement API:

// gatsby-browser.js
// ... (wrapPageElement implementation)

(The complete implementation is detailed in the original response.) This wraps the page content with the search widget, ensuring persistence.

Custom Search Query Enhancements

The original response details improvements to the search query using Lunr's query method to handle fuzzy matches, wildcards, and boolean logic for better search results. This section significantly enhances the search experience.

Conclusion

Implementing search functionality in Jamstack websites is achievable and can significantly improve user experience. While seemingly at odds with the stateless nature of Jamstack, client-side solutions like Lunr.js offer powerful and flexible alternatives. The careful consideration and implementation detailed in this article highlight the potential for creating a superior user experience through thoughtful design and development.

The above is the detailed content of How to Add Lunr Search to Your Gatsby Website. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is 'render-blocking CSS'? What is 'render-blocking CSS'? Jun 24, 2025 am 12:42 AM

CSS blocks page rendering because browsers view inline and external CSS as key resources by default, especially with imported stylesheets, header large amounts of inline CSS, and unoptimized media query styles. 1. Extract critical CSS and embed it into HTML; 2. Delay loading non-critical CSS through JavaScript; 3. Use media attributes to optimize loading such as print styles; 4. Compress and merge CSS to reduce requests. It is recommended to use tools to extract key CSS, combine rel="preload" asynchronous loading, and use media delayed loading reasonably to avoid excessive splitting and complex script control.

External vs. Internal CSS: What's the Best Approach? External vs. Internal CSS: What's the Best Approach? Jun 20, 2025 am 12:45 AM

ThebestapproachforCSSdependsontheproject'sspecificneeds.Forlargerprojects,externalCSSisbetterduetomaintainabilityandreusability;forsmallerprojectsorsingle-pageapplications,internalCSSmightbemoresuitable.It'scrucialtobalanceprojectsize,performanceneed

Does my CSS must be on lower case? Does my CSS must be on lower case? Jun 19, 2025 am 12:29 AM

No,CSSdoesnothavetobeinlowercase.However,usinglowercaseisrecommendedfor:1)Consistencyandreadability,2)Avoidingerrorsinrelatedtechnologies,3)Potentialperformancebenefits,and4)Improvedcollaborationwithinteams.

CSS Case Sensitivity: Understanding What Matters CSS Case Sensitivity: Understanding What Matters Jun 20, 2025 am 12:09 AM

CSSismostlycase-insensitive,butURLsandfontfamilynamesarecase-sensitive.1)Propertiesandvalueslikecolor:red;arenotcase-sensitive.2)URLsmustmatchtheserver'scase,e.g.,/images/Logo.png.3)Fontfamilynameslike'OpenSans'mustbeexact.

What is Autoprefixer and how does it work? What is Autoprefixer and how does it work? Jul 02, 2025 am 01:15 AM

Autoprefixer is a tool that automatically adds vendor prefixes to CSS attributes based on the target browser scope. 1. It solves the problem of manually maintaining prefixes with errors; 2. Work through the PostCSS plug-in form, parse CSS, analyze attributes that need to be prefixed, and generate code according to configuration; 3. The usage steps include installing plug-ins, setting browserslist, and enabling them in the build process; 4. Notes include not manually adding prefixes, keeping configuration updates, prefixes not all attributes, and it is recommended to use them with the preprocessor.

What are CSS counters? What are CSS counters? Jun 19, 2025 am 12:34 AM

CSScounterscanautomaticallynumbersectionsandlists.1)Usecounter-resettoinitialize,counter-incrementtoincrease,andcounter()orcounters()todisplayvalues.2)CombinewithJavaScriptfordynamiccontenttoensureaccurateupdates.

CSS: When Does Case Matter (and When Doesn't)? CSS: When Does Case Matter (and When Doesn't)? Jun 19, 2025 am 12:27 AM

In CSS, selector and attribute names are case-sensitive, while values, named colors, URLs, and custom attributes are case-sensitive. 1. The selector and attribute names are case-insensitive, such as background-color and background-Color are the same. 2. The hexadecimal color in the value is case-sensitive, but the named color is case-sensitive, such as red and Red is invalid. 3. URLs are case sensitive and may cause file loading problems. 4. Custom properties (variables) are case sensitive, and you need to pay attention to the consistency of case when using them.

Case Sensitivity in CSS: Selectors, Properties, and Values Explained Case Sensitivity in CSS: Selectors, Properties, and Values Explained Jun 19, 2025 am 12:38 AM

CSSselectorsandpropertynamesarecase-insensitive,whilevaluescanbecase-sensitivedependingoncontext.1)Selectorslike'div'and'DIV'areequivalent.2)Propertiessuchas'background-color'and'BACKGROUND-COLOR'aretreatedthesame.3)Valueslikecolornamesarecase-insens

See all articles