起因是自己喜欢追踪最新发布的产品和创业公司,但是刷 ProductHunt, IndieHackers 这些网站感觉效率太低,很不直观。 随即零零散散花了几周时间用 NextJS 手挫了这个网站: https://huntscreens.com 把 ProductHunt 和 IndieHackers 的产品,以及 YC 最新投资的项目都截个图,陈列出来,这样每天摸鱼的时候刷一下,扩展自己的眼界,激发自己的灵感。 项目已经完全开源,部署可能有点难度,需要帮助可以随时戳我: https://github.com/daimajia/huntscreens 欢迎大家拍砖提意见,有感兴趣的可以一起来开发。❤️
这次用了很多新的技术栈,随手分享一下: 最有帮助的是 https://trigger.dev (无相关利益),用了以后解决了以往让人头大的任务队列问题,非常方便,强烈推荐。 还有就是 https://react.email/ (无相关利益),以前写邮件模板写的人头大,这个可以直接用 React 语法和 Tailwind 实现漂亮的邮件方案。后来看他们 Blog 的这篇讲他们数据增长的文章才知道,原来几个人的小团队能发展这么快! https://resend.com/blog/what-is-next-after-100-000-users 强烈推荐阅读。 Drizzle ORM 和 Supabase 都很好用,也非常推荐。
@xzg1993 任务队列,比如定时的抓取数据,定时的发送 Email 。自己实现的话,有非常多麻烦的点,比如失败重试,比如并发控制,比如队列运维。 Trigger 一个很爽的功能是,支持帮你生成回调 URL ,这样你需要 url callback 回调的请求,不需要单独写路由,具体可以看这个代码: https://github.com/daimajia/huntscreens/blob/23659e3ea04b8d521590573e1f085537c18de834/jobs/ph.jobs.ts#L79 ```javascript const result = await io.waitForRequest( `call-screenshotone-${payload.uuid}`, async (url) => { await fetch(`https://api.screenshotone.com/take`, { method: "post", headers: { "Content-Type": "application/json", }, body: JSON.stringify(getScreenshotOneParams(payload.url, payload.uuid, url)), }) }, { timeoutInSeconds: 300 } ); if(result.store.location) { await io.logger.info('Screenshot successfully:', { payload }); await db.update(producthunt).set({webp: true}).where(eq(producthunt.uuid, payload.uuid)); }else{ await io.logger.error('got screenshot error', result); } return { payload: payload, result: result.store }; ``` 官方文档在这里: https://trigger.dev/docs/documentation/guides/task-library#waitforrequest