Skills Plugins MCP Prompt Model 博客 我的中心
开发编程 #security #web

best-practices

Apply modern web development best practices for security, compatibility, and code quality. Use when asked to "apply best practices", "security audit", "modernize code", "code quality review", or "check for vulnerabilities".

DeepseekModel 官方收录技能 质量 优秀 · 90 v1.0.0

获取

https://deepseekmodel.com/api/download.php?id=addyosmani-web-quality-skills-skills-best-practices-skill-md&format=skill
下载 .skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
name best-practices description Apply modern web development best practices for security, compatibility, and code quality. Use when asked to "apply best practices", "security audit", "modernize code", "code quality review", or "check for vulnerabilities". license MIT metadata {"author":"web-quality-skills","version":"2.0"} 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: 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. Inspect the listed console and network failures and fetch individual details only when they support a finding. Supplement runtime evidence with dependency, header, configuration, and source inspection; Lighthouse is not a complete security assessment. 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')" >
Agent 识别该技能的关键词,点击任意一个即可复制。

该技能未提供触发词。

下载的 .skill 包内含以下字段。
字段 说明
format格式标识(skill/v1)
skill_id技能唯一 ID
name技能名称
version版本号
description技能描述
category所属分类(数组)
trigger_words触发词列表
tags标签列表
source来源标识
source_url来源链接(本页地址)
exported_at导出时间(每次下载生成)
system_prompt系统提示词正文
model_config模型参数:provider / model / temperature / max_tokens / top_p
examples示例
install_guide各平台导入说明(Coze / Dify / Claude / 自定义框架)
同一份技能可按不同平台格式导出。
.skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用 下载
.skillpro 增强格式,额外含脚本 / 工具 / 依赖 / 钩子占位 下载
.json 纯 JSON 导出,只含 system_prompt 与模型参数 下载
Coze 带 frontmatter 的 Markdown,Coze 平台导入用 下载
Dify Dify DSL,创建应用后直接导入 下载

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。