From fe56c3b17e8b2590086f12c6f189a4aa9736c0ec Mon Sep 17 00:00:00 2001 From: mariosemes Date: Thu, 26 Mar 2026 22:08:09 +0100 Subject: [PATCH] Lazy-load puppeteer to fix tsx watch hanging on startup Puppeteer import at top level was blocking tsx watch mode, preventing the server from starting. Now imported dynamically only when a JS-rendered store is actually scraped. Co-Authored-By: Claude Opus 4.6 (1M context) --- package.json | 4 ++-- src/server/scraper/browser-scraper.ts | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 39c9be3..4179d88 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "private": true, "type": "module", "scripts": { - "dev:server": "tsx watch src/server/index.ts", + "dev:server": "tsx watch --clear-screen=false src/server/index.ts", "dev:client": "cd src/client && npm run dev", - "dev": "concurrently \"npm run dev:server\" \"npm run dev:client\"", + "dev": "concurrently --names server,client \"npm run dev:server\" \"npm run dev:client\"", "build:client": "cd src/client && npm run build", "build:server": "tsc", "build": "npm run build:client && npm run build:server", diff --git a/src/server/scraper/browser-scraper.ts b/src/server/scraper/browser-scraper.ts index bb9bc81..f3f86f9 100644 --- a/src/server/scraper/browser-scraper.ts +++ b/src/server/scraper/browser-scraper.ts @@ -1,4 +1,4 @@ -import puppeteer, { type Browser } from 'puppeteer'; +import type { Browser } from 'puppeteer'; import type { Store } from '../models/store.js'; import type { ScrapedItem } from './result-parser.js'; @@ -10,7 +10,8 @@ const NAVIGATION_TIMEOUT = 20_000; async function getBrowser(): Promise { if (browser && browser.connected) return browser; - browser = await puppeteer.launch({ + const puppeteer = await import('puppeteer'); + browser = await puppeteer.default.launch({ headless: true, args: [ '--no-sandbox',