JSDC × DevFrontier: Performance, SEO, and AEO Are Now the Same Chain

First edition of the DevFrontier meetup — the evolution of JSDC, Taiwan’s JavaScript community, repositioned for the AI era. The main talk: 邱柏鈞 Leo, Senior Frontend Engineer on KKday’s Growth Team, on 效能驅動成長 — growth driven by performance.

The business case

The Think With Google data that opens the talk: at 3 seconds of load time, bounce rate rises 32% compared to 1 second, and 53% of mobile users abandon. Optimizing Core Web Vitals has a conversion-improvement ceiling of +20%.

這不是耐心問題——這是商業損失。 It’s not a patience problem — it’s a business loss.

My translation to backend terms: it’s exactly like your /api/checkout having a P99 of 3 seconds. It’s not an abstract technical problem; it’s measurable cart abandonment showing up in revenue.

What is AEO?

Answer Engine Optimization: you used to optimize for Google’s algorithm; now you also need Google AI Overview, Gemini, ChatGPT, Claude, and Perplexity to “understand” you — because the result is no longer a click to your page, but the AI citing your content when it answers.

With KKday’s own data (84 analyzed AI Overview citations): 73% of cited sources are in the SEO top 10 — but ranking #1 guarantees nothing. Their counterexample: the keyword “大阪一日遊 行程規劃” ranked #1 in SEO but was never cited, because it was a product listing page. The cited pages were guide articles ranked #5. The AI’s criterion is brutally simple: does this page directly answer the user’s question? AI Overview doesn’t reward domain authority; it rewards direct usefulness.

The migration: from CSR + prerender.io to Nuxt SSR

KKday came from pure Vue CSR with a PHP BFF, paying for prerender.io so bots could see something. The new architecture: CloudFront (CDN caches the full HTML) → Nuxt (SSR + BFF) with two caching layers (local memory + Redis).

The pieces that resonated most with me, with their Spring Boot equivalent:

  • Parallel BFF: moving from serial calls (~360ms) to Promise.all (~130ms) has a direct impact on TTFB and LCP. It’s CompletableFuture.allOf() with @Async.
  • Data stratification: on the same product card, title and description go through SSR + CDN (static), but price and stock go client-side straight to the BFF with no cache — if the price were cached at the CDN, one user would see another user’s price. It’s selective @Cacheable: you cache the product details, never the price.
  • Multi-level caching for flash sales: 100,000 concurrent requests → 99,000 are absorbed by the memory cache (~0.1ms), 999 by Redis (~2ms), and only 1 request reaches the microservice. The good old Caffeine (L1) + Redis (L2) pattern.
  • The two-CDN bug: intermittently broken images and flashes of the desktop layout on mobile — same root cause: Cloudflare and CloudFront answering the same URL with different caching policies (304 vs 200) on a site that serves different HTML per device. It’s @Cacheable without Vary: User-Agent. The fix: Cache-Control: no-store toward the browser.

AI bots are already the 2nd-largest bot traffic

Data from Cloudflare Radar and HUMAN Security: AI bots grew +187% year over year and are already the second-largest bot traffic category, right behind search. And 49.9% of that traffic isn’t for indexing — it’s for training models. KKday confirms it in their own Kibana logs: Applebot spiked (+124% in a month) as Apple Intelligence expands.

The strategic decision every site has to make: 給 AI 爬?還是不給? — do you let AI crawl you or not? The practical control is robots.txt + WAF rules (Cloudflare maintains the user-agent list for you), deciding separately: search=yes and ai-train=no.

The full chain

Leo ties it all together at the close:

  1. Performance wins you the ranking (SEO)
  2. The ranking gives you the chance to be cited by AI (AEO)
  3. Being cited keeps you visible in the zero-click era

These three things are now the same chain — and performance is the starting point. If you’re not cited, you don’t exist, even if you’re #1 on Google.