常用AI及学术网址导航源码:从JSON数据到Nginx部署的完整实践
简介:这是一个收录常用AI工具与学术资源网址的轻量级源码包,面向需要高频访问AI平台、学术搜索引擎及专利查询网站的开发者和研究人员,也适合刚开始接触人工智能领域的新手作为入门导航。资源以单个HTML文件为核心导航页面,辅以inscode与gitignore文件用于项目配置管理,整体仅5KB,共计3个文件,打开即用,也可按需增删条目。目前已有196人学习,页面涵盖腾讯IMA、Kimi.ai、Deepseek、智谱清言、秘塔、豆包、通义千问、Elicit、腾讯元宝等AI工具,以及必应、知乎AI专栏、百度学术、谷歌学术镜像、专知、arXiv、HimmPat、Patentics、Web of Science、Global Dossier等学术入口。对于想建立个人AI学术工具箱的读者,这份源码提供清晰可扩展的页面结构,既可用作日常速查导航,也能基于其二次开发,快速搭建自己的网址聚合页;同时,简洁的HTML实现也有助于前端初学者理解静态网页的编写与组织方式。
1. 常用AI及学术网址导航源码:它不是收藏夹,是一套能跑起来的索引系统
做AI相关开发的同学,手边至少堆着几十个站点:模型卡、论文预印本、数据集、API文档、开源仓库,收藏夹里越存越乱,真到用的时候要么找不到,要么链接早失效。这份“常用AI及学术网址”项目源码,就是把这堆散装收藏变成一套可以直接部署的导航网站。页面是现成的,网址数据独立存在结构化文件里,想加站点、删分类、调排序,改完数据文件刷新就能生效,不用动一行页面代码。特别适合需要维护团队内部AI资源索引、或者想给自己搭一个可持续更新导航页的开发者,拿到源码就能本地跑起来。
2. 分类体系是怎么设计的:七个以内的分类加上标签和搜索
2.1 导航的底层逻辑:分类、标签与搜索怎么分工
浏览器收藏夹最大的问题不是存不下,而是“只有一层目录结构”。存三五十个网址的时候还能靠记忆硬找,到一百个以上就彻底失控了。导航网站要解决的从来不是“能不能存”,而是“能不能在一两秒内找到”。
这个源码里用的是三层检索机制:第一层是克制的一级分类,控制在七个以内,保证首页导航不是一长串吓人的链接墙;第二层是标签,用来补充分类说不清楚的属性,比如“Transformer”“部署”“多模态”;第三层是搜索,把站点名称、描述、标签全部拉进索引,输入关键词直接过滤。
我自己维护导航的习惯是:分类只做“入口级筛选”,真正能区分网址差异的是标签和搜索。分类是给人浏览用的,搜索是给人找东西用的,标签则是给搜索提供素材的。三者各管一段,缺一个就会变成“还是得靠人肉翻列表”。
2.2 核心分类:AI模型、学术检索、数据集与工程工具
这套源码默认的分类结构,基本覆盖了AI开发和学术研究的完整链路。我按常见做法整理成下面这张表,拿到源码后你可以对照着看自己的数据文件是否一致:
| 一级分类 | 收录对象 | 典型站点类型 | 维护口径 |
|---|---|---|---|
| AI模型与API | 模型卡、在线试用、API控制台 | Hugging Face Models、各厂商大模型平台、模型推理服务 | 优先收官方域名,API文档和模型页分开记 |
| 学术检索与论文 | 论文预印本、期刊检索、会议论文 | arXiv、OpenReview、Google Scholar、DBLP、期刊官网 | 会议类站点按届次更新,收录主站而非临时链接 |
| 数据集与评测 | 数据集搜索、竞赛平台、榜单 | Kaggle、Papers with Code、数据集托管平台 | 已下线或被合并的数据集及时标记 |
| 开源代码与工具 | 代码托管、包管理、开发者问答 | GitHub、GitLab、PyPI、Stack Overflow | 只收长期维护的站点,排除一次性工具 |
| 工程与部署 | 容器镜像、云平台文档、编排手册 | Docker Hub、云厂商文档、K8s文档、模型部署工具 | 以官方文档入口为主,教程类要看到更新时间 |
| 学习与社区 | 官方课程、技术博客、交流社区 | 大模型基础理论课程、公开课、AI技术社区 | 博客收录RSS或专栏首页,不收录单篇文章 |
这套分类有一点值得借鉴——它把“数据集与评测”单独拆出来,而不是塞进“学术”里。因为做模型评估的人和查论文的人诉求不一样,前者要找的是测试集和榜单,后者找的是研究进展,混在一起两边都难受。
2.3 五条选型标准:什么样的网址值得收进导航
分类解决的是“往哪放”,还有一个更前置的问题:什么样的网址才值得放进来。源码里附带的数据文件能做到这么干净,靠的是下面这五条标准,这也是我在实际维护中一直在用的:
第一,官方来源优先。能用官网域名的绝不用第三方转载,第三方站点今天还在明天可能就生态位没了。第二,活跃度。一个站点如果超过一年没有明显更新,收录价值就很低。对我来说,挂掉的学术网址是最浪费时间的,查资料查到一半死在链接失效上。
第三,长期稳定性。个人博客、临时分享链接这类东西尽量不碰,除非内容确实优质到值得冒风险。第四,检索价值。这个站点能否提供别的站点替代不了的资源?如果功能完全重复,只保留最稳定的那个,避免导航站变成收藏夹的二次堆积。
第五,唯一性。同类站点要敢于做减法。比如代码托管有GitHub就够了,不需要再收三四个同质化平台占位置。这一条是控制导航规模的命门,七分类每个分类下最多十个左右,整个站保持在六十到八十个网址,才谈得上“导航”,不然又变成一个收藏夹。
2.4 数据藏在JSON里:把网址和页面解耦
这套源码做了一件很关键的事:网址数据不在页面代码里,而是独立存成JSON文件,前端通过循环去渲染。这个设计让“改网址”变成纯粹的改数据,完全不需要懂前端框架。
我对这样的结构是很认同的。团队协作时,不太懂代码的同事也能维护网址库,只要不动数据结构,就不会把页面搞挂。交接也容易,新人拿到JSON文件就能看懂全部站点资源,甚至可以直接用脚本做批量更新。
3. 本地跑起来再看效果:环境、启动命令与数据文件改动
3.1 先看目录结构和包管理器,再敲启动命令
拿到源码包的第一步不是急着安装,而是先翻目录。常见做法是先确认项目里有没有package.json,有就走npm的流程。我一般会这样操作:
# 进入项目根目录,先看一眼目录结构 ls -la # 有 package.json 就走标准 npm 流程 npm install # 启动本地开发服务 npm run dev第一行ls是确认项目里到底有什么,第二行安装依赖,第三行启动开发模式。这里有几个值得注意的参数:npm install之后如果报权限错误,常见做法是清理node_modules再重新安装,而不是用sudo硬装;npm run dev启动后,控制台会输出本地访问地址,一般是localhost加一个端口号,直接用浏览器打开就能看到导航页面。
如果你拿到的是纯静态版本,没有package.json,那就更简单,起一个静态文件服务就行。Python环境可以直接用python3 -m http.server,Node环境用npx serve,本质都是把目录当作站点根目录跑起来。判断依据很简单:有package.json看源码包依赖,没有就当静态页处理。
3.2 网址数据文件:改JSON就能换一批站点
这个项目的核心数据文件通常是JSON格式,里面按分类组织所有网址。数据结构大致长这样:
{ "categories": [ { "id": "ai-models", "name": "AI模型与API", "weight": 1 }, { "id": "papers", "name": "学术检索与论文", "weight": 2 } ], "sites": [ { "id": "hf-models", "name": "Hugging Face Models", "url": "https://huggingface.co/models", "description": "模型卡、模型库与推理试用", "category": "ai-models", "tags": ["模型", "Transformer", "多模态"], "recommended": true }, { "id": "arxiv", "name": "arXiv", "url": "https://arxiv.org", "description": "论文预印本平台,AI相关研究首发阵地", "category": "papers", "tags": ["论文", "预印本"], "recommended": true } ] }字段含义如下表:
| 字段 | 作用 | 修改说明 |
|---|---|---|
| id | 站点唯一标识 | 保持唯一,删除站点时一并清理引用 |
| name | 导航显示名称 | 尽量用官方名称,便于辨认 |
| url | 跳转地址 | 确认是长期稳定的官方域名 |
| description | 一句话描述 | 写得具体一些,搜索命中全靠它 |
| category | 所属分类ID | 必须匹配categories中的id |
| tags | 搜索标签 | 把同义词和多模态、部署这类属性都塞进来 |
| recommended | 是否推荐位 | 推荐位通常排在分类内靠前位置 |
改这个文件不需要动任何页面逻辑。加一个站点就照着一个已有条目复制粘贴,改字段值;删站点就直接删掉对应对象,注意别把JSON的逗号删出问题。改完保存,浏览器刷新就能看到变化,这个即时反馈是这套源码最适合入门的地方。
3.3 搜索与分类的参数调整:从配置到逻辑
导航页面上的搜索框不是摆设,它的过滤逻辑一般在独立的JS文件里。大部分同类项目用的是类似下面的实现,只是字段和大小写处理略有差别:
function filterSites(sites, keyword, activeCategory) { const kw = keyword.trim().toLowerCase(); return sites.filter(function (site) { const inCategory = !activeCategory || site.category === activeCategory; if (!inCategory) { return false; } if (!kw) { return true; } const searchableText = [ site.name, site.description, site.tags.join(' ') ].join(' ').toLowerCase(); return searchableText.includes(kw); }); }这段逻辑的核心是三个参数配合:sites是数据文件里的全部站点数组,keyword是搜索框输入的文本,activeCategory是当前激活的分类筛选。代码做的事情很直白——先过滤分类,再过滤关键词。
需要注意的调整点是searchableText的组成。如果站点的标签写得不够全,搜索命中率会很难看。我在实际使用中会把tags多塞几个同义词,比如“LLM”和“大模型”都放进去,因为不同人习惯用不同的叫法。想连URL一起搜,就把site.url也拼进searchableText。还有一个常见误用是忘记toLowerCase,导致中文输入没事、英文大写就搜不到,这个坑后面的避坑章节会细说。
4. 从本地到公网:构建、Nginx托管与更新回路
4.1 构建静态文件,Nginx一个站点配置搞定
本地跑起来只是第一步,这导航要真正当工具用,得让它能在外网访问。这个项目构建出来是纯静态文件,托管方式很多,我常用的是Nginx。
# 先执行构建,产物一般输出到 dist/ 目录 npm run build构建完成后,dist目录里就是完整的静态站点。接下来在Nginx里加一个server块:
server { listen 80; server_name nav.example.com; root /var/www/ai-nav; index index.html; # 静态资源带缓存 location ~* \.(js|css|png|jpg|svg|woff2)$ { expires 7d; add_header Cache-Control "public"; } # 找不到文件回退到首页,配合前端路由用 location / { try_files $uri $uri/ /index.html; } }这里最关键的是try_files那一行。如果导航站用了前端路由,用户访问某个深层路径时服务器没有对应文件,必须回退到index.html,否则刷新一下就是404。很多初学者在本地跑得好好的,一部署到服务器就各种白屏,八成就是漏了这一行。
4.2 更新回路:本地修改、构建验证、发布上线
导航站的内容会持续更新,每次改完数据不可能都手动拖文件到服务器。我习惯写一个简单的发布脚本,把更新流程固化成三步:
#!/bin/bash set -e echo "[1/3] 构建静态文件..." npm run build echo "[2/3] 备份线上版本..." ssh user@your-server "cp -r /var/www/ai-nav /var/www/ai-nav-backup" echo "[3/3] 同步到服务器..." rsync -avz --delete dist/ user@your-server:/var/www/ai-nav echo "发布完成"这个脚本里的set -e表示任何一步出错就停止,避免把损坏的产物同步上去。备份线上版本是给自己留后悔药,改坏了可以快速回滚。rsync用--delete参数是为了让线上目录和本地dist严格一致,被删掉的站点才不会残留在线上。
发布流程里还有一个容易被忽略的动作:构建和验证要分开。构建成功不代表页面正常,我在CI上或者在本地都会加一步验证,用curl检查构建产物的首页是否返回200:
# 本地起个临时静态服务,验证产物可访问 cd dist && python3 -m http.server 8080 & # 请求首页,看状态码 curl -I http://localhost:8080如果curl返回200,再执行同步操作。这一步能拦截大部分“数据删挂导致白屏”的翻车现场。
4.3 域名与证书:对外访问的最后一公里
导航站既然要作为长期工具,建议在域名上一次性配置好HTTPS。HTTP的导航站有几个实际问题:地址栏不会显示安全标识、部分浏览器对不加密页面有限制、搜索引擎的收录权重也更低。
我现在的习惯是域名解析做好之后,直接配置自动续期的证书。Nginx的配置变为监听443端口,把80端口的请求重定向到HTTPS:
server { listen 80; server_name nav.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name nav.example.com; ssl_certificate /etc/letsencrypt/live/nav.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/nav.example.com/privkey.pem; root /var/www/ai-nav; index index.html; location / { try_files $uri $uri/ /index.html; } }证书续期那一步千万别手动盯着,设一个cron任务每个月跑一次续签命令,再把nginx重载一下就行。只要域名没换、解析没断,这个导航站的HTTPS是长期自动维系的,这也是“能长期用”和“折腾完就不管了”的分水岭。
5. 维护避坑记录:链接失效、白屏与搜索失效的五类问题
5.1 链接失效返回404:先看返回码再动手改
现象:点导航里的某个站点,浏览器出来404页面。或者站点直接显示连接失败。
原因:学术站点和技术工具站的链接失效原因比较集中——项目被合并吸收、组织改名域名迁移、个人项目停维护、站点改版换了URL路径。导航数据跟着老域名走,自然全挂。
解决:我遇到这类问题会先区分“404”和“连接失败”。404说明域名还在、站点还活着,只是路径变了,去官网首页找到新路径,更新url字段就行;连接失败说明域名本身不可达,那就要去搜这个站点是否换了新域名,找到了就全套更新,找不到就删掉这一条。导航里如果失效链接长期不清理,整站的可信度会迅速崩掉,维护周期再长也不如一次彻底清理。
5.2 白屏翻车:JSON语法错误最常见
现象:改完数据文件保存,浏览器刷新后整个页面变成白屏,控制台报错。
原因:JSON格式对语法极其严格。多一个逗号、少一个引号、中文字符串没闭合,都会导致整个文件无法被解析。这个项目把网址数据放在JSON里,JSON解析失败前端拿不到任何数据,页面自然就白屏了。
解决:编辑完JSON一定不能直接刷新,先做一次校验。Linux和macOS上用node -e "JSON.parse(require('fs').readFileSync('data.json','utf8'))"检查,或者直接把文件内容粘贴到JSON校验网站上,几秒钟就能看到是哪一行出问题。养成“改数据必校验”的习惯之后,这个问题的翻车概率几乎降为零。
5.3 分类越来越乱:问题出在“收录口径”
现象:用了一段时间后发现同一站点出现在多个分类里,比如某个模型库既在“AI模型”又在“数据集”,搜索时明明两个分类都能搜到,但用户反而不知道以哪个为准。
原因:没有定义分类归属的边界条件。收录的时候全凭直觉,同一个站点在不同时间被不同同学加到了不同分类里,又没有规律可循。
解决:我给这类导航项目定过一条规则——按“用户的主诉求”分类,不按“站点的功能”分类。一个模型库,如果用户打开它是为了查模型卡片,就归入“AI模型与API”,如果它同时提供评测数据集,那也不重复收录,而是把数据集的说明写进描述里。每个站点只在一个分类下出现,搜索靠标签覆盖它的其他属性,这样首页导航就永远保持清爽。
5.4 中文搜索不到:大小写、编码与字段覆盖
现象:搜索框输入英文能搜到站点,输入中文就返回空结果;或者明明描述里包含关键词,却搜不出来。
原因:搜索逻辑里把大小写统一做了,但中文不涉及大小写,问题通常出在两个地方——一是搜索没有覆盖description字段;二是JSON里的中文引号或编码格式有问题。还有一种情况是站点描述写得太简短,关键词压根没写进去。
解决:查看搜索逻辑是否把name、description、tags三个字段都拼接进了匹配文本。如果只匹配name,那几乎等于没有搜索功能,描述才是信息量最密集的字段。另外建议手动调一次用中文搜索,确认内容包含关键词且文件编码是UTF-8。最后把tags里多放同义词,比如“大模型”“LLM”“Foundation Model”都放进去,搜索命中率会显著提升。
5.5 刷新页面就404:路由模式与服务器回退
现象:本地开发一切正常,部署到Nginx之后,从首页点进某个分类页也没问题,但直接刷新这个分类页链接就报404。
原因:这套导航前端用了路由,浏览器地址栏里的路径在服务器上并不对应真实的HTML文件。本地开发服务器会自动回退到首页,但Nginx默认不会,找不到文件就直接404。
解决:在Nginx配置里的location /加上try_files $uri $uri/ /index.html;,把所有不存在的路径都回退到index.html,由前端路由接管。这个问题我提过一两次就不再重复踩了,部署任何带前端路由的静态站,第一件事就是检查这一行有没有写上。
6. 让导航变成长期资产:一个月一次的“导航体检”习惯
导航站维护最大的敌人不是技术难度,而是惰性。网址这个东西会一点点腐烂,今天的可用链接三个月后可能就变成了404。我有一套简单但有效的维护流程,坚持下来导航永远不会变成死站。
每个月我会抽出十分钟做一次“导航体检”。具体做法是写一个小脚本,把数据文件里的所有URL批量做HEAD请求,把返回码记录下来:
#!/bin/bash cat data.json | jq -r '.sites[].url' | while read url; do code=$(curl -o /dev/null -s -w "%{http_code}" -I "$url") echo "$code $url" done这个脚本用jq提取所有站点URL,然后逐个发起HEAD请求,输出状态码和URL。200和301都是正常的,404和503就要重点排查。跑完把输出保存成表格存档,和上个月的对比,一眼就能看出哪个站点是新挂的。
我还给每条导航数据定了一个“收录模板”,新站点入库时强制填写:站点官方名称、官方域名、一句话功能描述、所属分类、三到五个标签、收录日期。凡是描述写不出来的站点不进导航,凡是域名不是官方域名的站点不进导航,凡是自己都不确定下次还会不会用的站点不进导航。这三条过滤下来,大部分噪音都被挡在了导航外。
举个例子,大模型相关的AI Agent工具和应用现在层出不穷,这个分类下尤其容易混进不少短期项目。我遇到过一个AI Agent编排工具,试用版做得很唬人,收录进去才两个多月就宣布停止维护。现在任何AI Agent相关的导航收录,我都要求看到官方文档站和仓库的更新时间,起码还在活跃的才会进列表。
这套流程说白了就是:先用选型标准挡住低质量站点,再用批量检测发现失效链接,最后用收录模板保证后续维护的人知道每个站点为什么在这里。从那以后我每次改导航数据,都强制走一遍“校验JSON、本地构建、curl验证、同步线上”的流程,四步做完才敢说这块更新完了,这套习惯帮我躲过的白屏和404已经数不清了。希望帮到你。
本文还有配套的精品资源,点击获取