best-practices

addyosmani/web-quality-skills · Agent Skill

Çağdaş web geliştirme güvenlik, uyumluluk ve kod kalitesi için en iyi uygulamaları uygulayın. "En iyi uygulamaları uygulayın", "güvenlik denetimi", "kodu modernleştirin", "kod kalitesi incelemesi" veya "zafiyetleri kontrol edin" istendiğinde kullanın.

Kuruluma geç ↓

Genel bakış

YayıncıaddyosmaniTopluluk
Depoaddyosmani/web-quality-skills ↗
Skill klasörübest-practices
Yıldız2.992
Fork261
Dosyalar2
LisansMIT
Son güncelleme24 Ağustos 2026
BağlantılarSkill kaynağı ↗ · Depo ↗

Mozgi kontrolü

Skill dosyalarında bulduklarımız. Ayrıntılar abonelikle.

Güvenlik
orta risk · dikkat gerektiren 1 nokta bulundu
Uyumluluk
ek yazılım gerekiyor
Benzer skiller
62 benzer skill bulundu
Abonelikte ayrıca

Kurulum

Skill, SKILL.md dosyası içeren bir klasördür. Ajanınızı seçin ve komutları proje kökünde bir terminalde çalıştırın (macOS, Linux veya Windows'ta Git Bash).

Promptu Claude, Codex veya başka bir asistana yapıştırın: skill'i inceleyip sizin için kuracaktır.

Install the “best-practices” skill from mozgi.io (https://mozgi.io/skills/addyosmani-best-practices/) for me.

1. Download the archive: https://mozgi.io/skills/addyosmani-best-practices/download
   If it fails, take the skill folder from the source: https://github.com/addyosmani/web-quality-skills/tree/main/skills/best-practices
2. Read SKILL.md and the other files. Check the skill is safe: no hidden commands, no sending data elsewhere, no scripts doing something other than described. If anything looks suspicious, stop and tell me.
3. Put the “best-practices” folder into your agent's skills folder: .claude/skills/ for Claude Code, .agents/skills/ for Codex, .cursor/skills/ for Cursor, .gemini/skills/ for Gemini CLI. Inside the project if we are in one, otherwise in the home folder (~/.claude/skills/ etc.).
4. Make sure <skills folder>/best-practices/SKILL.md exists.
5. Briefly tell me what this skill does and offer to try it on my task.

If you cannot do a step yourself, tell me what to click or type.

Kaynak dosyaları

2 dosya ZIP indir

Kurulumdan önce SKILL.md ve eşlik eden dosyaları inceleyin. Önizleme için dosyaya tıklayın.

SKILL.md içeriği

Yazarın orijinal metni · salt okunur

Best practices

Modern web development standards based on Lighthouse best practices audits. Covers security, browser compatibility, and code quality patterns.

Evidence-led audit workflow

When a rendered page is available:

1. Run a live Lighthouse Best Practices audit when that capability is available; with Chrome DevTools MCP, use lighthouse_audit. Use navigation mode for a normal page load or snapshot mode when the current state must be preserved.

2. Inspect the listed console and network failures and fetch individual details only when they support a finding.

3. Supplement runtime evidence with dependency, header, configuration, and source inspection; Lighthouse is not a complete security assessment.

4. Fix the implicated code, re-run the same audit, and keep security findings separate from style preferences.

If live tools are unavailable, use the Lighthouse CLI plus focused dependency and header checks. Never report a high Lighthouse score as proof that the application is secure.

Security

Read the security reference ↗ when security is in scope or a live audit surfaces a related failure. It covers HTTPS/HSTS, CSP and Trusted Types, Subresource Integrity, headers, dependencies, sanitization, and cookies.

At minimum:

  • Use HTTPS without mixed content. Add HSTS only after confirming every relevant subdomain supports HTTPS.
  • Treat a strict CSP as defense in depth. Prefer nonces or hashes and test with report-only before enforcement.
  • Sanitize untrusted HTML and protect DOM XSS sinks. Prefer text APIs when markup is not required.
  • Pin and review third-party code. Use SRI where the delivery model supports it and keep dependencies patched.
  • Verify response headers at runtime. Source configuration alone does not prove what the deployed page sends.

Browser compatibility

Doctype declaration

<!-- ❌ Missing or invalid doctype -->
<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">

<!-- ✅ HTML5 doctype -->
<!DOCTYPE html>
<html lang="en">

Character encoding

<!-- ❌ Missing or late charset -->
<html>
<head>
  <title>Page</title>
  <meta charset="UTF-8">
</head>

<!-- ✅ Charset as first element in head -->
<html>
<head>
  <meta charset="UTF-8">
  <title>Page</title>
</head>

Viewport meta tag

<!-- ❌ Missing viewport -->
<head>
  <title>Page</title>
</head>

<!-- ✅ Responsive viewport -->
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Page</title>
</head>

Feature detection

// ❌ Browser detection (brittle)
if (navigator.userAgent.includes('Chrome')) {
  // Chrome-specific code
}

// ✅ Feature detection
if ('IntersectionObserver' in window) {
  // Use IntersectionObserver
} else {
  // Fallback
}

// ✅ Using @supports in CSS
@supports (display: grid) {
  .container {
    display: grid;
  }
}

@supports not (display: grid) {
  .container {
    display: flex;
  }
}

Polyfills (when needed)

Prefer bundling polyfills at build time (Babel/SWC + core-js, or @vitejs/plugin-legacy) targeted by your supported-browsers list. This eliminates the runtime check entirely and avoids shipping polyfill bytes to modern browsers.

If you must load a polyfill at runtime, append a script element — never use document.write (it blocks the parser and is broken in async/deferred contexts):

<script>
  if (!('fetch' in window)) {
    const s = document.createElement('script');
    s.src = '/polyfills/fetch.js';
    s.defer = true;
    document.head.appendChild(s);
  }
</script>

Never load polyfills from a third-party CDN you don't control. The polyfill.io service was compromised in mid-2024 ↗ in a supply-chain attack and used to serve malware to ~100k sites. Self-host, or use a vetted mirror (e.g. Cloudflare's cdnjs polyfill build ↗) — and pin the version with Subresource Integrity.

---

Deprecated APIs

Avoid these

// ❌ document.write (blocks parsing)
document.write('<script src="..."></script>');

// ✅ Dynamic script loading
const script = document.createElement('script');
script.src = '...';
document.head.appendChild(script);

// ❌ Synchronous XHR (blocks main thread)
const xhr = new XMLHttpRequest();
xhr.open('GET', url, false); // false = synchronous

// ✅ Async fetch
const response = await fetch(url);

// ❌ Application Cache (deprecated)
<html manifest="cache.manifest">

// ✅ Service Workers
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js');
}

Event listener passive

// ❌ Non-passive touch/wheel (may block scrolling)
element.addEventListener('touchstart', handler);
element.addEventListener('wheel', handler);

// ✅ Passive listeners (allows smooth scrolling)
element.addEventListener('touchstart', handler, { passive: true });
element.addEventListener('wheel', handler, { passive: true });

// ✅ If you need preventDefault, be explicit
element.addEventListener('touchstart', handler, { passive: false });

---

Console & errors

No console errors

// ❌ Errors in production
console.log('Debug info'); // Remove in production
throw new Error('Unhandled'); // Catch all errors

// ✅ Proper error handling
try {
  riskyOperation();
} catch (error) {
  // Log to error tracking service
  errorTracker.captureException(error);
  // Show user-friendly message
  showErrorMessage('Something went wrong. Please try again.');
}

Error boundaries (React)

class ErrorBoundary extends React.Component {
  state = { hasError: false };
  
  static getDerivedStateFromError(error) {
    return { hasError: true };
  }
  
  componentDidCatch(error, info) {
    errorTracker.captureException(error, { extra: info });
  }
  
  render() {
    if (this.state.hasError) {
      return <FallbackUI />;
    }
    return this.props.children;
  }
}

// Usage
<ErrorBoundary>
  <App />
</ErrorBoundary>

Global error handler

// Catch unhandled errors
window.addEventListener('error', (event) => {
  errorTracker.captureException(event.error);
});

// Catch unhandled promise rejections
window.addEventListener('unhandledrejection', (event) => {
  errorTracker.captureException(event.reason);
});

---

Source maps

Production configuration

// ❌ Source maps exposed in production
// webpack.config.js
module.exports = {
  devtool: 'source-map', // Exposes source code
};

// ✅ Hidden source maps (uploaded to error tracker)
module.exports = {
  devtool: 'hidden-source-map',
};

// ✅ Or no source maps in production
module.exports = {
  devtool: process.env.NODE_ENV === 'production' ? false : 'source-map',
};

Strip sourcesContent from production maps when uploading to your error tracker. By default, bundlers embed the full original source inside the .map file — anyone who obtains the map (including via a misconfigured upload step) gets your unminified code. Configure your bundler to omit sourcesContent, or use a Sentry/Bugsnag CLI flag that does so when uploading.

For Vite, prefer sourcemap: 'hidden' over 'true' so the //# sourceMappingURL= comment isn't emitted into the bundle.

---

Performance best practices

Avoid blocking patterns

// ❌ Blocking script
<script src="heavy-library.js"></script>

// ✅ Deferred script
<script defer src="heavy-library.js"></script>

// ❌ Blocking CSS import
@import url('other-styles.css');

// ✅ Link tags (parallel loading)
<link rel="stylesheet" href="styles.css">
<link rel="stylesheet" href="other-styles.css">

Efficient event handlers

// ❌ Handler on every element
items.forEach(item => {
  item.addEventListener('click', handleClick);
});

// ✅ Event delegation
container.addEventListener('click', (e) => {
  if (e.target.matches('.item')) {
    handleClick(e);
  }
});

Memory management

// ❌ Memory leak (never removed)
const handler = () => { /* ... */ };
window.addEventListener('resize', handler);

// ✅ Cleanup when done
const handler = () => { /* ... */ };
window.addEventListener('resize', handler);

// Later, when component unmounts:
window.removeEventListener('resize', handler);

// ✅ Using AbortController
const controller = new AbortController();
window.addEventListener('resize', handler, { signal: controller.signal });

// Cleanup:
controller.abort();

---

Code quality

Valid HTML

<!-- ❌ Invalid HTML -->
<div id="header">
<div id="header"> <!-- Duplicate ID -->

<ul>
  <div>Item</div> <!-- Invalid child -->
</ul>

<a href="/"><button>Click</button></a> <!-- Invalid nesting -->

<!-- ✅ Valid HTML -->
<header id="site-header">
</header>

<ul>
  <li>Item</li>
</ul>

<a href="/" class="button">Click</a>

Semantic HTML

<!-- ❌ Non-semantic -->
<div class="header">
  <div class="nav">
    <div class="nav-item">Home</div>
  </div>
</div>
<div class="main">
  <div class="article">
    <div class="title">Headline</div>
  </div>
</div>

<!-- ✅ Semantic HTML5 -->
<header>
  <nav>
    <a href="/">Home</a>
  </nav>
</header>
<main>
  <article>
    <h1>Headline</h1>
  </article>
</main>

Image aspect ratios

<!-- ❌ Distorted images -->
<img src="photo.jpg" width="300" height="100">
<!-- If actual ratio is 4:3, this squishes the image -->

<!-- ✅ Preserve aspect ratio -->
<img src="photo.jpg" width="300" height="225">
<!-- Actual 4:3 dimensions -->

<!-- ✅ CSS object-fit for flexibility -->
<img src="photo.jpg" style="width: 300px; height: 200px; object-fit: cover;">

---

Permissions & privacy

Request permissions properly

// ❌ Request on page load (bad UX, often denied)
navigator.geolocation.getCurrentPosition(success, error);

// ✅ Request in context, after user action
findNearbyButton.addEventListener('click', async () => {
  // Explain why you need it
  if (await showPermissionExplanation()) {
    navigator.geolocation.getCurrentPosition(success, error);
  }
});

Permissions policy

<!-- Restrict powerful features -->
<meta http-equiv="Permissions-Policy" 
      content="geolocation=(), camera=(), microphone=()">

<!-- Or allow for specific origins -->
<meta http-equiv="Permissions-Policy" 
      content="geolocation=(self 'https://maps.example.com')">

---

Audit checklist

Security (critical)

  • [ ] HTTPS enabled, no mixed content
  • [ ] No vulnerable dependencies (npm audit)
  • [ ] CSP headers configured (with frame-ancestors, base-uri, form-action)
  • [ ] require-trusted-types-for 'script' enforced (or report-only during rollout)
  • [ ] Third-party <script>/<link rel="stylesheet"> pinned with SRI hashes
  • [ ] Security headers present (HSTS, X-Content-Type-Options, Referrer-Policy)
  • [ ] No exposed source maps (and sourcesContent stripped from uploaded ones)

Compatibility

  • [ ] Valid HTML5 doctype
  • [ ] Charset declared first in head
  • [ ] Viewport meta tag present
  • [ ] No deprecated APIs used
  • [ ] Passive event listeners for scroll/touch

Code quality

  • [ ] No console errors
  • [ ] Valid HTML (no duplicate IDs)
  • [ ] Semantic HTML elements used
  • [ ] Proper error handling
  • [ ] Memory cleanup in components

UX

  • [ ] No intrusive interstitials
  • [ ] Permission requests in context
  • [ ] Clear error messages
  • [ ] Appropriate image aspect ratios

Tools

| Tool | Purpose |

|------|---------|

| npm audit | Dependency vulnerabilities |

| SecurityHeaders.com ↗ | Header analysis |

| W3C Validator ↗ | HTML validation |

| Live Lighthouse audit (Chrome DevTools MCP: lighthouse_audit) | Rendered Best Practices checks for agents |

| Lighthouse CLI | Best Practices audit fallback |

| Observatory ↗ | Security scan |

References

Sık sorulan sorular

best-practices skill'i ne yapar?

Çağdaş web geliştirme güvenlik, uyumluluk ve kod kalitesi için en iyi uygulamaları uygulayın. "En iyi uygulamaları uygulayın", "güvenlik denetimi", "kodu modernleştirin", "kod kalitesi incelemesi" veya "zafiyetleri kontrol edin" istendiğinde kullanın.

best-practices nasıl kurulur?

Bu sayfadaki “Kurulum” bölümünü açın ve ajanınızı seçin — Claude Code, Codex, Cursor veya Gemini CLI: skill klasörünü doğru yere kopyalayan hazır komutlar orada. Ya da “Asistanla” sekmesindeki promptu kopyalayın; asistan skill'i inceleyip kuracaktır.

best-practices hangi yapay zekâlarla çalışır?

Skill'ler düz Markdown talimatlarıdır (Agent Skills formatı), bu yüzden best-practices SKILL.md okuyan her ajanla çalışır: Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode ve diğerleri. Model talimatları yalnızca görev skill açıklamasına uyduğunda yükler.

best-practices ücretsiz mi?

Skill, addyosmani tarafından açık olarak yayımlandı (MIT lisansı). Skill'in kendisi ücretsizdir — yalnızca kullandığınız token'lar için yapay zekâ sağlayıcınıza ödeme yaparsınız.

Skill kurmak güvenli mi?

Skill, ajanınızın izleyeceği talimatlardır; kurmadan önce SKILL.md ve eşlik eden dosyaları okuyun. Skill klasöründeki betikler yalnızca ajanınız çalıştırırsa çalışır — ne yaptığını izleyin ve gereksiz izin vermeyin.

Skill, MCP sunucusu veya eklentiden nasıl farklıdır?

MCP sunucusu veya eklenti modele yeni araçlar verir — çalışıp sonuç döndüren kod. Skill ise bilgi ve süreç verir: göreve nasıl yaklaşılacağı, hangi adımların izleneceği ve iyi sonucun neye benzediği. Sunucu veya API anahtarı gerekmez.

Benzer skiller

Tüm skiller →
frontend-ui-engineering Duyarlı ve erişilebilir kullanıcı arayüzlerinin profesyonel geliştirilmesi. Bu beceri, WCAG standartlarını karşılayan yüksek kaliteli bileşenler, düzenler ve etkileşim mantığı oluşturarak, tipik yapay zeka estetiğinden uzak, profesyonel düzeyde sonuçlar sunar. addyosmani109k core-web-vitals Temel web metriklerini (LCP, INP, CLS) kullanıcı sayfası deneyimini iyileştirmek için alan ve laboratuvar araştırmalarından alınan verilerle optimize edin. "Temel web metriklerini iyileştirmek", "LCP'yi düzeltmek", "CLS'yi azaltmak", "INP'yi optimize etmek", "sayfa kullanıcı deneyimini optimize etmek" veya "düzen düzenindeki kaymaları düzeltmek" istendiğinde kullanın. addyosmani3k performance Web sayfasının performansını daha hızlı yüklenme ve daha iyi kullanıcı deneyimi için optimize edin. "Sitemi hızlandırın", "performansı optimize edin", "yükleme süresini azaltın", "yavaş yükleme sorununu düzeltin", "sayfa hızını iyileştirin" veya "performans denetimi" istendiğinde kullanın. addyosmani3k seo Görünürlüğü ve arama motoru sıralamasını optimize edin. "SEO'yu iyileştirin", "arama için optimize edin", "meta etiketlerini düzeltin", "yapılandırılmış verileri ekleyin", "site haritası optimizasyonu" veya "arama motoru optimizasyonu" istendiğinde kullanın. addyosmani3k to-prd Sohbeti teknik bir talebe dönüştürür ve hata izleme sistemine yayınlar. mattpocock304k tdd Çalışma akışı kırmızı-yeşil-yeniden faktoring fonksiyonlarının ve düzeltmelerin bir kerede tek bir dilim inşa edilmesi için kullanılır. mattpocock304k