搜索组件优化 - Command ?K 搜索框组件
gaoyangw 2024-11-01 12:16 23 浏览 0 评论
前言:
DevNow 项目中我们使用了 DocSearch 来实现搜索功能,但是由于有以下的限制:
- 您的网站必须是技术文档或技术博客。
- 您必须是网站的所有者,或者至少具有更新其内容的权限
- 您的网站必须公开可用
- 您的网站必须已准备好生产环境。
由于这些条件的限制, DocSearch 只适合用在开源的技术文档或技术博客中,所以从 DevNow 开源博客项目的定位来说,还是比较适适合的。为什么突然想着要优化一下搜索组件呢?
今天心血来潮想在 blog 上找一篇文章,用搜素的功能发现搜不出来,搜索挂了?然后突然想起来之前由于想着在 blog 中可能加一些私有的配置或者尝鲜的功能,所有 fork 了一份变成 私有项目了,这样就不符合 DocSearch 的 网站必须是公开的这个限制了。
其实用下来我个人感觉还有以下几点不是很满意的地方:
- 配置麻烦,需要在 Algolia 上注册账号,然后创建一个应用,然后在项目里配置一些 api-key 信息。
- 搜索信息索引的配置可能需要自己在平台上定制化一些 config ,开始可能会比较迷茫。
- 索引可能会不及时,默认一周会重新索引一次,所以刚发布的文章可能无法被搜索到。
所以一怒之下就想着改一下,之前想着看看其他的方案,之前在在 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'>
相关推荐
- 招标公告-网络销售农资治理数据服务项目磋商公告
-
招标公告-网络销售农资治理数据服务项目磋商公告...
- 销售的几种方式(销售的十大方式)
-
以下是几种常见的销售方式介绍:传统线下销售-门店销售:在实体店铺中,销售人员与顾客面对面交流,介绍产品或服务,帮助顾客挑选合适的商品,促成交易。例如在商场的服装专卖店,销售人员会根据顾客的身材、喜...
- AI要干掉SaaS销售?(ai销售是什么意思)
-
随着AI技术的飞速发展,许多行业都在经历前所未有的变革,SaaS销售领域也不例外。最近,行业内关于“AI是否会取代SaaS销售人员”的讨论愈演愈烈,许多从业者感到焦虑不安。然而,SaaS行业老兵大D认...
- 网络上的性暗示广告泛滥,是商业营销手段还是道德底线的滑落?
-
刷到是缘分,感谢大家的阅读,希望您能动动小手帮忙点赞,关注,评论。你的支持和鼓励是我前进的动力。在此祝福大家天天快乐,日日开心!...
- 互联网上,怎么销售 销售是你必须掌握的创造财富的核心技能。
-
互联网上销售2个要点。销售是你必须要掌握的创造财富的核心技能,只有先促成交易才能获得利润。今天的内容非常重要,但是对于很多人来说并不容易理解,因为它和传统的教育理念有很多的冲突。我尽量慢一点,各位好好...
- 浅谈网站优化之站内优化(网站的站内优化)
-
网站优化分为站内优化和站外优化,今天我们只谈站内优化。在给网站做站内优化的同时,我们首先要做一个网站诊断,通过网站诊断,发现网站存在什么问题,然后进行优化。之所以需要优化,是发现网站没有排名,没有流...
- 想成为一个Web前端开发工程师,需要掌握的知识总结
-
前端工程师已经成为目前互联网企业极具竞争力的人才,企业不断提升薪资水平为了招聘到优秀的Web前端开发工程师。因此,越来越多的人想要学习Web前端。那么呢?Web前端的学习路线是什么?下面就和千锋武汉W...
- 合理站内优化-放你200米先跑(200米队伍能站多少人)
-
有一首民谣是这样说的:丢失了一个钉子,坏了一只蹄铁;坏了一只蹄铁,折了一匹战马;折了一匹战马,伤了一位国王;伤了一位国王,输了一场战斗;输了一场战斗,亡了一个帝国。从这首民谣中我们可以提炼出,一个微小...
- 教你分析竞争对手的网站,借鉴快速做好自己网站的SEO
-
关于seo爱好者来说,剖析竞争对手的网站是我们必需要做而且必需要做好的事情。但是很多SEO爱好者只晓得去察看,却不晓得应该如何剖析竞争对手的网站。...
- SEO优化重点在哪里?核心因素(seo的优化基础)
-
seo优化是一个长久的过程,也是一个持续坚持的过程。当然,了解了其中重点的核心因素,会让很多朋友少走很多弯路,所以,今天牵线的木偶想给大家分享下关于SEO比较核心的有些需要重点注意!(完全不了解SE...
- 站内SEO优化需要重视这16点才能提升网站排名!
-
1.H标签网站单个页面的H标签尽量控制在一定数量,常见的用法是h1标签1次,h2标签2次,h3标签用3词,也有很大部分的网站不用h1标签直接使用h2标签,这种情况常见于门户站、新闻站等。2.Alt描述...
- 广州网络包年推广 网络广告包年-易找网络服务中小企业
-
易找网络专注搜索平台关键词优化排名,信息流广告,朋友圈广告,网站建设等,专注于互联网广告业务,致力于帮各类行业广告主提供PC、移动的互联网效果资源,与国内主流媒体建立了深度战略合作。易找是在搜索引擎上...
- 网站建设公司背景与技术实力全面解析
-
今天我要给大家详细讲解一下网站建设公司的情况,这个行业里学问挺多。这些公司能够按照客户的具体要求和需求,制作出功能丰富、外观漂亮的网站,这在互联网领域非常重要。接下来,我们就从几个角度来详细探讨一番。...
- 全有家居朋友圈线上活动策划方案(附下载)
-
部分内容预览...
- 2025商业广场春季营销活动策划方案“春日放飞季”(附下载)
-
部分内容预览...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 网站开发 (47)
- 网络推广哪个平台好 (47)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 广州seo (47)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 网页制作 (47)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站收录查询 (46)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 长尾关键词 (47)
- 手机网站建设 (53)
- 一键优化 (47)