写了个 Nodejs npm 搜索工具

写了个 Nodejs npm 搜索工具

页面放在… http://s.jiyinyiyong.info/npm-search/page/ 因为用了 WebSocket, 于是别的浏览器就用不了… 另外 VPS 比较慢… 不知道国内怎么办好, 代码在 Github, 继续改: https://github.com/jiyinyiyong/npm-search nipster 和命令行两个都太慢了… 所以折腾了, 数据是从 npmjs.org 抓的 支持正则搜索比如 live\w 会经过 new RegExp(‘live\w’) 编译成 /live\w/ 不知道应该怎么排序才有用, 限制了数量在 40 左右吧


5 回复

写了个 Node.js npm 搜索工具

大家好,我最近写了一个简单的 Node.js npm 搜索工具,可以方便地搜索 npm 包。你可以通过网页界面或命令行来使用它。

页面地址

页面已经部署上线,你可以访问以下链接:

技术栈

由于使用了 WebSocket,当前版本只能通过一个特定的浏览器来访问。未来可能会考虑其他方式来改善这一点。另外,由于服务器的性能问题(我的 VPS 比较慢),在国内访问可能会比较慢。如果有更好的解决方案,欢迎提 PR!

代码仓库

如果你对代码感兴趣,可以查看我的 GitHub 仓库:

数据来源

数据直接从 npm 官方网站抓取而来,以确保数据的准确性和实时性。目前有两个工具 nipster 和命令行工具速度较慢,所以我决定自己动手丰衣足食。

搜索功能

搜索功能支持正则表达式搜索。例如,输入 live\w 会被编译成正则表达式 /live\w/ 进行匹配。这样你就可以灵活地搜索符合特定模式的包名了。

排序与结果限制

关于如何排序搜索结果,我还在探索中。目前我将结果限制在 40 个左右,以减少服务器压力并提高响应速度。如果你有好的建议,欢迎提 issue 或 PR!

示例代码

以下是搜索功能的简单示例代码:

const express = require('express');
const axios = require('axios');
const app = express();

app.get('/search', async (req, res) => {
    const query = req.query.q; // 获取查询参数
    if (!query) {
        return res.status(400).send({ error: 'Query is required' });
    }

    try {
        // 从 npm 官网获取数据
        const response = await axios.get(`https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}&size=40`);
        const packages = response.data.objects.map(obj => obj.package);
        
        // 返回前 40 个结果
        res.json(packages.slice(0, 40));
    } catch (error) {
        console.error(error);
        res.status(500).send({ error: 'Failed to fetch data from npm registry' });
    }
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

以上代码展示了如何使用 Express 和 Axios 从 npm 官方 API 获取数据,并返回前 40 个匹配的结果。希望这个工具对你有所帮助!如果你有任何问题或建议,请随时联系我。


增加了更新时间的提示, 并把抓到的数据在本地写了一份, 更新周期 6h… http://s.jiyinyiyong.info/npm-search/page/ http://s.jiyinyiyong.info/npm-search/server/data.json

用了 ws 模块的话, NAE 是放不了了, 看来看去觉得到处的网速都不行啊

搞个阿里云…国内速度还是很好的…

国内的空间, 嫌备案麻烦. 貌似阿里云比我需要的贵好多

关于“写了个 Nodejs npm 搜索工具”的帖子内容,你可以考虑以下几点来优化和改进你的项目:

  1. WebSocket 替换为 REST API: 使用 WebSocket 可能会导致一些浏览器不兼容。建议将 WebSocket 的功能替换为 REST API 调用,这将提高跨浏览器的兼容性。例如,你可以使用 axiosnode-fetch 来发起 HTTP 请求。

    示例代码:

    const axios = require('axios');
    
    async function searchNpm(keyword) {
      try {
        const response = await axios.get(`https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(keyword)}`);
        return response.data.objects.map(obj => obj.package.name);
      } catch (error) {
        console.error('Error fetching data:', error);
        return [];
      }
    }
    
  2. 提高性能:

    • 使用缓存机制来存储频繁请求的数据,减少对远程服务的依赖。
    • 如果可能,可以考虑部署到国内的服务提供商,如阿里云、腾讯云等,以提高访问速度。
  3. 排序算法: 根据需求选择合适的排序方法。例如,可以根据下载量、更新日期或星级进行排序。你也可以让用户自定义排序规则。

    示例代码:

    function sortResults(results, sortBy = 'popularity') {
      switch(sortBy) {
        case 'popularity':
          return results.sort((a, b) => b.downloads - a.downloads);
        case 'date':
          return results.sort((a, b) => new Date(b.time.modified) - new Date(a.time.modified));
        default:
          return results;
      }
    }
    
  4. 用户反馈: 在 GitHub 上添加一个贡献指南和问题模板,鼓励用户提出反馈和改进意见,这有助于社区贡献和发展。

  5. 文档和说明: 提供详细的 README 文件,包括安装步骤、如何使用该工具以及如何贡献代码。

  6. 安全性: 确保从外部获取的数据被正确处理,避免潜在的安全风险,如注入攻击等。

通过上述调整,你的 Node.js NPM 搜索工具将会更加完善和易用。

回到顶部