百度360必应搜狗淘宝本站头条
当前位置:网站首页 > SEO教程 > 正文

搜索组件优化 - Command ?K 搜索框组件

gaoyangw 2024-11-01 12:16 21 浏览 0 评论

前言:

DevNow 项目中我们使用了 DocSearch 来实现搜索功能,但是由于有以下的限制:

  1. 您的网站必须是技术文档或技术博客。
  2. 您必须是网站的所有者,或者至少具有更新其内容的权限
  3. 您的网站必须公开可用
  4. 您的网站必须已准备好生产环境。

由于这些条件的限制, DocSearch 只适合用在开源的技术文档或技术博客中,所以从 DevNow 开源博客项目的定位来说,还是比较适适合的。为什么突然想着要优化一下搜索组件呢?

今天心血来潮想在 blog 上找一篇文章,用搜素的功能发现搜不出来,搜索挂了?然后突然想起来之前由于想着在 blog 中可能加一些私有的配置或者尝鲜的功能,所有 fork 了一份变成 私有项目了,这样就不符合 DocSearch 的 网站必须是公开的这个限制了。

其实用下来我个人感觉还有以下几点不是很满意的地方:

  1. 配置麻烦,需要在 Algolia 上注册账号,然后创建一个应用,然后在项目里配置一些 api-key 信息。
  2. 搜索信息索引的配置可能需要自己在平台上定制化一些 config ,开始可能会比较迷茫。
  3. 索引可能会不及时,默认一周会重新索引一次,所以刚发布的文章可能无法被搜索到。

所以一怒之下就想着改一下,之前想着看看其他的方案,之前在在 shadcn/ui 中看到了一个 Command + K 的搜索组件,所以就想着能不能在 DevNow 中也实现一下。这个实现的方案是基于 cmdk 这个库来实现的, Nextjs 官网应该也是这个实现方案。

cmdk

集成 shadcn/ui

在这里还是推荐使用 shadcn/ui 来集成,因为它提供了很多的组件,而且还提供了一些 hooks 来帮助我们实现一些功能。想着后续可能还会用到一些组件,所以就直接集成了,不得不说这个UI库的样式真是深得我心啊。

安装的话直接跟着 文档 来就好,提供了一些常见框架的集成:

文档

:::tip[注意] 在安装前要先在 tsconfig.json 中配置好 resolve paths @/* 这个是必须有的,否则 shadcn/ui 无法初始化成功

{
  "compilerOptions": {
    // ...
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"] // <--- 这个必须有
    }
    // ...
  }
}

:::

安装 Command

文档在 这里

pnpm dlx shadcn@latest add command

一个简单的例子





const Search: FC<Props> = ({ category }) => {
  const [open, setOpen] = useState(false);
  useEffect(() => {
    const down = (e: KeyboardEvent) => {
      if (e.key === 'k' && (e.metaKey || e.ctrlKey)) {
        e.preventDefault();
        setOpen((open) => !open);
      }
    };


    document.addEventListener('keydown', down);
    return () => document.removeEventListener('keydown', down);
  }, []);


  return (
    <div className='mr-4 hidden items-center lg:flex'>
      <Button
        onClick={() => setOpen((open) => !open)}
        size='sm'
        className='h-[32px] bg-muted/50 px-2 py-0 text-sm text-muted-foreground shadow-none hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
      >
        Search
        <kbd className='pointer-events-none ml-1 inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100'>
          <span className='text-xs'>?</span>K
        </kbd>
      </Button>


      {config.search && (
        <CommandDialog open={open} onOpenChange={setOpen}>
          <CommandInput placeholder='Type a command or search...' />
          <CommandList>
            <CommandEmpty>No results found.</CommandEmpty>
            {category.map((item, index) => (
              <Fragment key={index}>
                <CommandGroup heading={item.label}>
                  {item.children.map((child, cIndex) => (
                    <CommandItem
                      // 这里需要注意的是:
                      // 选项点击选中的事件是 onSelect 不是 onClick
                      onSelect={() => {
                        window.open(`${location.origin}/posts/${child.id}`, '_blank');
                      }}
                      key={cIndex}
                      className='cursor-pointer'
                    >
                      <span>{child.label}</span>
                    </CommandItem>
                  ))}
                </CommandGroup>
                {index === category.length - 1 && <CommandSeparator />}
              </Fragment>
            ))}
          </CommandList>
        </CommandDialog>
      )}
    </div>
  );
};

效果展示:

使用 DocSearch

DocSearch

使用 command 替换后:

command

大家觉得哪个更好呢,我个人觉得新版的会更加简洁一点。

遇到的问题

第一版的实现到这里就结束了,然后上线后发现了问题。发现线上的环境突然变卡了,请求也变多了,一看发现堵了很多请求:

文件请求问题

然后就是定位问题,发现原因是: 当我在 Astro 中集成 React 框架时,如果组件是运行要求在客户端运行时:

<Search client:only='react' />

在通过 client:only 来标记的组件中获取所有文件的标题时,会把所有的请求一遍,这里我的理解是在客户端没有这些信息,所有执行的时候会构建一份。

这里如果改下数据源,将数据传递给 Search的话,可以规避掉这个问题。

<Search category={category}  client:only='react'>


原文链接:搜索组件优化 - Command ?K | DevNow

相关推荐

企业宣传册该怎么做?超级干货,制作教程戳这里

公司宣传册做得好,可以进一步展示企业文化,为企业树立一个良好的形象,促进企业的发展。那么应该怎样才能把企业宣传册做得好?...

GIF动图怎么制作?教你3个好用的制作方法

GIF的全称为GraphicsInterchangeFormat,可译为图像互换格式,我们一般也称它为动图,它是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。...

提前三天教你们python制作万能抢购神器,学不会就准备过光棍节吧

目录前言:分析(x0)...

别不信,我用一张图就能搞定一整份PPT,还能被领导夸一句

很多人在制作PPT的时候,都一定会从素材网站里找很多图片,来做背景或者插图。那么你有没有想过,如果时间不够用,而且你只有一张图,该怎么办?这个问题,看完这篇文章你立马就能解决!而且我还把文中超级炫酷的...

如何制作网站落地页?

落地页是什么?就是当你打开一个网页时,你第一眼所见到的界面就是网站的落地页面(登录页面)。落地页也称“着陆页”,是指访问者在其他地方看到发出的某个具有明确主题的特定营销活动,点击后被链接到你网站上的第...

整点不一样的网站制作教程,教你怎么用网站模板制作网站#...

网站制作教程整点不一样的网站。不要再问我网站制作教程了,今天给你整个怎么用网站模板制作网站的教程。·1、登录账号进入后台。·2、选择模板。自助建站平台通常提供各种各样的网站模板,可以根据自己的需求和喜...

图文教程:免费注册.PW顶级域名和免费制作一个企业网站

当你看到这篇文章的时候,肯定第一反应是“天下没有免费的午餐”。哪有那么便宜的事情,免费给你注册一个.PW顶级域名,而且还送一个企业网站。会有什么猫腻呢?笔者告诉你,猫腻就是耐思尼克想要让更多的人接触到...

作为数据分析师,学会这4个chatgpt使用技巧,根本不担心被取代!

上文给简单聊了一下为什么ChatGPT不能取代数据分析师,本文我们来深入感受一下如何让GPT帮助数据分析师“提效...

16种常用的数据分析方法-典型相关分析

CCA典型相关分析(canonicalcorrelationanalysis)从总体上把握两组指标之间的相关关系,分别提取两组变量有代表性的两个综合变量U1和V1(分别为两个变量组中各变量的线性组...

推荐几款可视化数据分析工具

数据是一座待挖掘的金矿。进入数据大爆炸时代,各种数据据呈现爆发式增长,越来越多的人将通过数据来寻求事物背后规律的解答。不管是以往专业性的数据挖掘工具还是如今集成一体的数据可视化工具,都见证着数据分析发...

网站运营需要哪些数据支持,如何对数据进行有效分析?

网站运营需要哪些数据支持这个问题是比较泛的,为什么这么说呢?在我们运营一个网站的时候,我们面对的不同行业和不同业务,所需要的数据也都不一样的。比如我们运营一个旅游网站,我们需要用户的行为数据,网站的...

独家揭秘:人为峰如何玩转网站流量的大数据分析

当网站建设好后,很多客户可能就放在一边,其访问量不知道各个企业是否有关注与做数据分析呢?网站设计及建设后我们的最终目的是希望其网站正式上线后能带来更多的流量,并转换成销量。人为峰网络营销除了可以提...

全套新媒体数据分析表

编辑:正兴资料君(关注我,每天领福利)今日分享:...

机器学习第五发:BS教你如何解析网页,规整数据?

现在越来越多的应用和互联网产品做内容的聚合,像今日头条、等等,太多的聚合应用以及不胜枚举,甚至浏览器也可以嵌入聚合的应用。互联网上拥有太多太多的数据,抓取网页的数据做数据挖掘也是最廉价的获取数据的途径...

今日头条网站数据分析

今日头条是大家最熟悉的新媒体平台,也是拥有大量自媒体作者的平台,很受网友欢迎,那么我们从seo角度去分析这个平台网站数据,看看是不是我们想象的那么完美。下面是查询今日头条网站的结果:提炼一下,总结以下...

取消回复欢迎 发表评论: