惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
爱范儿
爱范儿
罗磊的独立博客
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
U
Unit 42
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
H
Help Net Security
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Performance Tips for Firefox New Tab Extensions: Sub-100m...
Weather Cloc · 2026-05-04 · via DEV Community

Performance Tips for Firefox New Tab Extensions: Sub-100ms Load Times

Every time someone opens a new tab, your extension loads. If it's slow, they'll either disable it or dread using it. Here's how to keep load times under 100ms.

Baseline: What Makes a New Tab Feel Fast?

The new tab page replaces Firefox's built-in page, which is basically instant. Users will notice if yours takes more than 200ms. Aim for:

  • First paint: < 50ms
  • Interactive: < 100ms
  • Weather data visible: < 500ms (from cache)

Inline Critical CSS

External stylesheets block rendering. Inline your critical CSS:

<!DOCTYPE html>
<html>
<head>
  <!-- Critical CSS inlined — no blocking request -->
  <style>
    :root { --bg: #fff; --text: #1a1a1a; }
    body { margin: 0; background: var(--bg); color: var(--text); font-family: system-ui; }
    .container { max-width: 800px; margin: 0 auto; padding: 2rem; }
    /* Only above-the-fold styles here */
  </style>
</head>
<body>
  <!-- Content -->
  <script src="app.js" defer></script>
</body>
</html>

Enter fullscreen mode Exit fullscreen mode

Use defer for Scripts

<!-- GOOD: script parses after HTML, doesn't block -->
<script src="app.js" defer></script>

<!-- BAD: blocks HTML parsing -->
<script src="app.js"></script>

Enter fullscreen mode Exit fullscreen mode

With defer, the HTML renders before JavaScript runs, so the user sees something immediately.

Apply Theme Before DOM

Flash of wrong theme is jarring:

<head>
  <!-- Run SYNCHRONOUSLY to avoid theme flash -->
  <script>
    // This runs immediately, before any rendering
    (function() {
      const theme = localStorage.getItem('theme') || 'auto';
      const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
      const effective = theme === 'auto' ? (prefersDark ? 'dark' : 'light') : theme;
      document.documentElement.setAttribute('data-theme', effective);
    })();
  </script>
  <style>/* ... */</style>
</head>

Enter fullscreen mode Exit fullscreen mode

Yes, this is a synchronous script — but it's tiny and necessary to prevent FOUC.

Load Cached Data First

Don't wait for an API call before rendering:

async function init() {
  // 1. Apply settings from sync storage (fast, local)
  const prefs = await browser.storage.sync.get(DEFAULTS);
  applyPreferences(prefs);

  // 2. Show cached weather immediately (no network needed)
  const { weatherCache } = await browser.storage.local.get('weatherCache');
  if (weatherCache) {
    displayWeather(weatherCache.data);
  } else {
    showWeatherSkeleton();
  }

  // 3. Fetch fresh data in background
  fetchWeatherAndUpdate(prefs.location);

  // 4. Render clocks (pure JS, no async needed)
  initClocks(prefs.worldClocks);
}

Enter fullscreen mode Exit fullscreen mode

With this pattern, the page is visually complete from cached data in < 50ms.

Avoid Layout Thrashing

Batching DOM reads and writes prevents forced reflows:

// BAD: read/write/read/write causes 4 reflows
const w1 = el1.offsetWidth;  // read
el1.style.width = (w1 + 10) + 'px';  // write
const w2 = el2.offsetWidth;  // read (forces reflow)
el2.style.width = (w2 + 10) + 'px';  // write

// GOOD: batch reads, then writes
const w1 = el1.offsetWidth;  // read
const w2 = el2.offsetWidth;  // read (no reflow, still in same layout)
el1.style.width = (w1 + 10) + 'px';  // write
el2.style.width = (w2 + 10) + 'px';  // write

Enter fullscreen mode Exit fullscreen mode

Cache Formatter Objects

Creating Intl.DateTimeFormat objects is expensive. For clocks updating every second:

// Create formatters once, reuse forever
const clockFormatters = new Map();

function getFormatter(timezone) {
  if (!clockFormatters.has(timezone)) {
    clockFormatters.set(timezone, new Intl.DateTimeFormat('en-US', {
      timeZone: timezone,
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: false
    }));
  }
  return clockFormatters.get(timezone);
}

Enter fullscreen mode Exit fullscreen mode

requestAnimationFrame for Clock Updates

Use requestAnimationFrame + timestamp diff instead of setInterval to avoid timer drift:

let lastUpdate = 0;

function updateClocks(timestamp) {
  // Only update every ~1 second
  if (timestamp - lastUpdate >= 950) {
    lastUpdate = timestamp;
    renderClocks();
  }
  requestAnimationFrame(updateClocks);
}

requestAnimationFrame(updateClocks);

Enter fullscreen mode Exit fullscreen mode

Minimize Storage Reads

Batch storage reads into one call:

// BAD: multiple awaits, multiple IPC calls
const { theme } = await browser.storage.sync.get('theme');
const { location } = await browser.storage.sync.get('location');
const { clocks } = await browser.storage.sync.get('clocks');

// GOOD: one IPC call
const { theme, location, clocks } = await browser.storage.sync.get(['theme', 'location', 'clocks']);

Enter fullscreen mode Exit fullscreen mode

Measuring Performance

// Measure your init time
const t0 = performance.now();
await init();
const t1 = performance.now();
console.log(`Init took ${t1 - t0}ms`);

Enter fullscreen mode Exit fullscreen mode

Use Firefox's built-in Performance profiler (F12 → Performance tab) to identify bottlenecks.

Results

With these techniques, Weather & Clock Dashboard achieves:

  • First paint: ~20ms (cached theme applied synchronously)
  • Cached weather displayed: ~40ms
  • Clock rendered: ~45ms
  • Fresh weather visible: ~400ms (network permitting)

Weather & Clock Dashboard — free Firefox new tab with weather, world clocks, and search. MIT licensed.