[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-67ef05a6-0a0a-4c59-b44c-ad8ecf77c07f":3,"$fbF9KathBfrWuViiE0U6vRbtIqS9vb3ORSSSz5Y_fs3I":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"67ef05a6-0a0a-4c59-b44c-ad8ecf77c07f","vercel-deployment","针对Vercel和Next.js部署的专业知识","cat_coding_frontend","mod_coding","sickn33,coding","---\nname: vercel-deployment\ndescription: Expert knowledge for deploying to Vercel with Next.js\nrisk: safe\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Vercel Deployment\n\nExpert knowledge for deploying to Vercel with Next.js\n\n## Capabilities\n\n- vercel\n- deployment\n- edge-functions\n- serverless\n- environment-variables\n\n## Prerequisites\n\n- Required skills: nextjs-app-router\n\n## Patterns\n\n### Environment Variables Setup\n\nProperly configure environment variables for all environments\n\n**When to use**: Setting up a new project on Vercel\n\n\u002F\u002F Three environments in Vercel:\n\u002F\u002F - Development (local)\n\u002F\u002F - Preview (PR deployments)\n\u002F\u002F - Production (main branch)\n\n\u002F\u002F In Vercel Dashboard:\n\u002F\u002F Settings → Environment Variables\n\n\u002F\u002F PUBLIC variables (exposed to browser)\nNEXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fxxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...\n\n\u002F\u002F PRIVATE variables (server only)\nSUPABASE_SERVICE_ROLE_KEY=eyJ...  \u002F\u002F Never NEXT_PUBLIC_!\nDATABASE_URL=postgresql:\u002F\u002F...\n\n\u002F\u002F Per-environment values:\n\u002F\u002F Production: Real database, production API keys\n\u002F\u002F Preview: Staging database, test API keys\n\u002F\u002F Development: Local\u002Fdev values (also in .env.local)\n\n\u002F\u002F In code, check environment:\nconst isProduction = process.env.VERCEL_ENV === 'production'\nconst isPreview = process.env.VERCEL_ENV === 'preview'\n\n### Edge vs Serverless Functions\n\nChoose the right runtime for your API routes\n\n**When to use**: Creating API routes or middleware\n\n\u002F\u002F EDGE RUNTIME - Fast cold starts, limited APIs\n\u002F\u002F Good for: Auth checks, redirects, simple transforms\n\n\u002F\u002F app\u002Fapi\u002Fhello\u002Froute.ts\nexport const runtime = 'edge'\n\nexport async function GET() {\n  return Response.json({ message: 'Hello from Edge!' })\n}\n\n\u002F\u002F middleware.ts (always edge)\nexport function middleware(request: NextRequest) {\n  \u002F\u002F Fast auth checks here\n}\n\n\u002F\u002F SERVERLESS (Node.js) - Full Node APIs, slower cold start\n\u002F\u002F Good for: Database queries, file operations, heavy computation\n\n\u002F\u002F app\u002Fapi\u002Fusers\u002Froute.ts\nexport const runtime = 'nodejs'  \u002F\u002F Default, can omit\n\nexport async function GET() {\n  const users = await db.query('SELECT * FROM users')\n  return Response.json(users)\n}\n\n### Build Optimization\n\nOptimize build for faster deployments and smaller bundles\n\n**When to use**: Preparing for production deployment\n\n\u002F\u002F next.config.js\n\u002F** @type {import('next').NextConfig} *\u002F\nconst nextConfig = {\n  \u002F\u002F Minimize output\n  output: 'standalone',  \u002F\u002F For Docker\u002Fself-hosting\n\n  \u002F\u002F Image optimization\n  images: {\n    remotePatterns: [\n      { hostname: 'your-cdn.com' },\n    ],\n  },\n\n  \u002F\u002F Bundle analyzer (dev only)\n  \u002F\u002F npm install @next\u002Fbundle-analyzer\n  ...(process.env.ANALYZE === 'true' && {\n    webpack: (config) => {\n      const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')\n      config.plugins.push(new BundleAnalyzerPlugin())\n      return config\n    },\n  }),\n}\n\n\u002F\u002F Reduce serverless function size:\n\u002F\u002F - Use dynamic imports for heavy libs\n\u002F\u002F - Check bundle with: npx @next\u002Fbundle-analyzer\n\n### Preview Deployment Workflow\n\nUse preview deployments for PR reviews\n\n**When to use**: Setting up team development workflow\n\n\u002F\u002F Every PR gets a unique preview URL automatically\n\n\u002F\u002F Protect preview deployments with password:\n\u002F\u002F Vercel Dashboard → Settings → Deployment Protection\n\n\u002F\u002F Use different env vars for preview:\n\u002F\u002F - PREVIEW: Use staging database\n\u002F\u002F - PRODUCTION: Use production database\n\n\u002F\u002F In code, detect preview:\nif (process.env.VERCEL_ENV === 'preview') {\n  \u002F\u002F Show \"Preview\" banner\n  \u002F\u002F Use test payment processor\n  \u002F\u002F Disable analytics\n}\n\n\u002F\u002F Comment preview URL on PR (automatic with Vercel GitHub integration)\n\n### Custom Domain Setup\n\nConfigure custom domains with proper SSL\n\n**When to use**: Going to production\n\n\u002F\u002F In Vercel Dashboard → Domains\n\n\u002F\u002F Add domains:\n\u002F\u002F - example.com (apex\u002Froot)\n\u002F\u002F - www.example.com (subdomain)\n\n\u002F\u002F DNS Configuration (at your registrar):\n\u002F\u002F Type: A, Name: @, Value: 76.76.21.21\n\u002F\u002F Type: CNAME, Name: www, Value: cname.vercel-dns.com\n\n\u002F\u002F Redirect www to apex (or vice versa):\n\u002F\u002F Vercel handles this automatically\n\n\u002F\u002F In next.config.js for redirects:\nmodule.exports = {\n  async redirects() {\n    return [\n      {\n        source: '\u002Fold-page',\n        destination: '\u002Fnew-page',\n        permanent: true,  \u002F\u002F 308\n      },\n    ]\n  },\n}\n\n## Sharp Edges\n\n### NEXT_PUBLIC_ exposes secrets to the browser\n\nSeverity: CRITICAL\n\nSituation: Using NEXT_PUBLIC_ prefix for sensitive API keys\n\nSymptoms:\n- Secrets visible in browser DevTools → Sources\n- Security audit finds exposed keys\n- Unexpected API access from unknown sources\n\nWhy this breaks:\nVariables prefixed with NEXT_PUBLIC_ are inlined into the JavaScript\nbundle at build time. Anyone can view them in browser DevTools.\nThis includes all your users and potential attackers.\n\nRecommended fix:\n\nOnly use NEXT_PUBLIC_ for truly public values:\n\n\u002F\u002F SAFE to use NEXT_PUBLIC_\nNEXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fxxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...  \u002F\u002F Anon key is designed to be public\nNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...\nNEXT_PUBLIC_GA_ID=G-XXXXXXX\n\n\u002F\u002F NEVER use NEXT_PUBLIC_\nSUPABASE_SERVICE_ROLE_KEY=eyJ...     \u002F\u002F Full database access!\nSTRIPE_SECRET_KEY=sk_live_...         \u002F\u002F Can charge cards!\nDATABASE_URL=postgresql:\u002F\u002F...          \u002F\u002F Direct DB access!\nJWT_SECRET=...                         \u002F\u002F Can forge tokens!\n\n\u002F\u002F Access server-only vars in:\n\u002F\u002F - Server Components (app router)\n\u002F\u002F - API Routes\n\u002F\u002F - Server Actions ('use server')\n\u002F\u002F - getServerSideProps (pages router)\n\n### Preview deployments using production database\n\nSeverity: HIGH\n\nSituation: Not configuring separate environment variables for preview\n\nSymptoms:\n- Test data appearing in production\n- Production data corrupted after PR merge\n- Users seeing test accounts\u002Fcontent\n\nWhy this breaks:\nPreview deployments run untested code. If they use production database,\na bug in a PR can corrupt production data. Also, testers might create\ntest data that shows up in production.\n\nRecommended fix:\n\nSet up separate databases for each environment:\n\n\u002F\u002F In Vercel Dashboard → Settings → Environment Variables\n\n\u002F\u002F Production (production env only):\nDATABASE_URL=postgresql:\u002F\u002Fprod-host\u002Fprod-db\n\n\u002F\u002F Preview (preview env only):\nDATABASE_URL=postgresql:\u002F\u002Fstaging-host\u002Fstaging-db\n\n\u002F\u002F Or use Vercel's branching databases:\n\u002F\u002F - Neon, PlanetScale, Supabase all support branch databases\n\u002F\u002F - Auto-create preview DB for each PR\n\n\u002F\u002F For Supabase, create a staging project:\n\u002F\u002F Production:\nNEXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fprod-xxx.supabase.co\n\n\u002F\u002F Preview:\nNEXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fstaging-xxx.supabase.co\n\n### Serverless function too large, slow cold starts\n\nSeverity: HIGH\n\nSituation: API route or server component has slow initial load\n\nSymptoms:\n- First request takes 3-10+ seconds\n- Subsequent requests are fast\n- Function size limit exceeded error\n- Deployment fails with size error\n\nWhy this breaks:\nVercel serverless functions have a 50MB limit (compressed).\nLarge functions mean slow cold starts (1-5+ seconds).\nHeavy dependencies like puppeteer, sharp can cause this.\n\nRecommended fix:\n\nReduce function size:\n\n\u002F\u002F 1. Use dynamic imports for heavy libs\nexport async function GET() {\n  const sharp = await import('sharp')  \u002F\u002F Only loads when needed\n  \u002F\u002F ...\n}\n\n\u002F\u002F 2. Move heavy processing to edge or external service\nexport const runtime = 'edge'  \u002F\u002F Much smaller, faster cold start\n\n\u002F\u002F 3. Check bundle size\n\u002F\u002F npx @next\u002Fbundle-analyzer\n\u002F\u002F Look for large dependencies\n\n\u002F\u002F 4. Use external services for heavy tasks\n\u002F\u002F - Image processing: Cloudinary, imgix\n\u002F\u002F - PDF generation: API service\n\u002F\u002F - Puppeteer: Browserless.io\n\n\u002F\u002F 5. Split into multiple functions\n\u002F\u002F \u002Fapi\u002Fheavy-task\u002Fstart - Queue the job\n\u002F\u002F \u002Fapi\u002Fheavy-task\u002Fstatus - Check progress\n\n### Edge runtime missing Node.js APIs\n\nSeverity: HIGH\n\nSituation: Using Node.js APIs in edge runtime functions\n\nSymptoms:\n- X is not defined at runtime\n- Cannot find module fs\n- Works locally, fails deployed\n- Middleware crashes\n\nWhy this breaks:\nEdge runtime runs on V8, not Node.js. Many Node APIs are missing:\nfs, path, crypto (partial), child_process, and most native modules.\nYour code will fail at runtime with \"X is not defined\".\n\nRecommended fix:\n\nCheck API compatibility before using edge:\n\n\u002F\u002F SUPPORTED in Edge:\n\u002F\u002F - fetch, Request, Response\n\u002F\u002F - crypto.subtle (Web Crypto)\n\u002F\u002F - TextEncoder, TextDecoder\n\u002F\u002F - URL, URLSearchParams\n\u002F\u002F - Headers, FormData\n\u002F\u002F - setTimeout, setInterval\n\n\u002F\u002F NOT SUPPORTED in Edge:\n\u002F\u002F - fs, path, os\n\u002F\u002F - Buffer (use Uint8Array)\n\u002F\u002F - crypto.createHash (use crypto.subtle)\n\u002F\u002F - Most npm packages with native deps\n\n\u002F\u002F If you need Node.js APIs:\nexport const runtime = 'nodejs'  \u002F\u002F Use Node runtime instead\n\n\u002F\u002F For crypto hashing in edge:\n\u002F\u002F WRONG\nimport { createHash } from 'crypto'  \u002F\u002F Fails in edge\n\n\u002F\u002F RIGHT\nasync function hash(message: string) {\n  const encoder = new TextEncoder()\n  const data = encoder.encode(message)\n  const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n  return Array.from(new Uint8Array(hashBuffer))\n    .map(b => b.toString(16).padStart(2, '0'))\n    .join('')\n}\n\n### Function timeout causes incomplete operations\n\nSeverity: MEDIUM\n\nSituation: Long-running operations timing out\n\nSymptoms:\n- Task timed out after X seconds\n- Incomplete database operations\n- Partial file uploads\n- Function killed mid-execution\n\nWhy this breaks:\nVercel has timeout limits:\n- Hobby: 10 seconds\n- Pro: 60 seconds (can increase to 300)\n- Enterprise: 900 seconds\n\nOperations exceeding this are killed mid-execution.\n\nRecommended fix:\n\nHandle long operations properly:\n\n\u002F\u002F 1. Return early, process async\nexport async function POST(request: Request) {\n  const data = await request.json()\n\n  \u002F\u002F Queue for background processing\n  await queue.add('process-data', data)\n\n  \u002F\u002F Return immediately\n  return Response.json({ status: 'queued' })\n}\n\n\u002F\u002F 2. Use streaming for long responses\nexport async function GET() {\n  const stream = new ReadableStream({\n    async start(controller) {\n      for (const chunk of generateChunks()) {\n        controller.enqueue(chunk)\n        await sleep(100)  \u002F\u002F Prevents timeout\n      }\n      controller.close()\n    }\n  })\n  return new Response(stream)\n}\n\n\u002F\u002F 3. Use external services for heavy processing\n\u002F\u002F - Trigger serverless function, return job ID\n\u002F\u002F - Process in background (Inngest, Trigger.dev)\n\u002F\u002F - Client polls for completion\n\n\u002F\u002F 4. Increase timeout (Pro plan)\n\u002F\u002F vercel.json:\n{\n  \"functions\": {\n    \"app\u002Fapi\u002Fslow\u002Froute.ts\": {\n      \"maxDuration\": 60\n    }\n  }\n}\n\n### Environment variable missing at runtime but present at build\n\nSeverity: MEDIUM\n\nSituation: Environment variable works in build but undefined at runtime\n\nSymptoms:\n- Env var is undefined in production\n- Value doesn't change after updating in dashboard\n- Works in dev, wrong value in production\n- Requires redeploy to update value\n\nWhy this breaks:\nSome env vars are only available at build time (hardcoded into bundle).\nIf you expect a runtime value but it was baked in at build, you get\nthe build-time value or undefined.\n\nRecommended fix:\n\nUnderstand when env vars are read:\n\n\u002F\u002F BUILD TIME (baked into bundle):\n\u002F\u002F - NEXT_PUBLIC_* variables\n\u002F\u002F - next.config.js\n\u002F\u002F - generateStaticParams\n\u002F\u002F - Static pages\n\n\u002F\u002F RUNTIME (read on each request):\n\u002F\u002F - Server Components (without cache)\n\u002F\u002F - API Routes\n\u002F\u002F - Server Actions\n\u002F\u002F - Middleware\n\n\u002F\u002F To force runtime reading:\nexport const dynamic = 'force-dynamic'\n\n\u002F\u002F For config that must be runtime:\n\u002F\u002F Don't use NEXT_PUBLIC_, read on server and pass to client\n\n\u002F\u002F Check which env vars you need:\n\u002F\u002F Build: URLs, public keys, feature flags (if static)\n\u002F\u002F Runtime: Secrets, database URLs, user-specific config\n\n### CORS errors calling API routes from different domain\n\nSeverity: MEDIUM\n\nSituation: Frontend on different domain can't call API routes\n\nSymptoms:\n- CORS policy error in browser console\n- No Access-Control-Allow-Origin header\n- Requests work in Postman but not browser\n- Works same-origin, fails cross-origin\n\nWhy this breaks:\nBy default, browsers block cross-origin requests. Vercel doesn't\nautomatically add CORS headers. If your frontend is on a different\ndomain (or localhost in dev), requests fail.\n\nRecommended fix:\n\nAdd CORS headers to API routes:\n\n\u002F\u002F app\u002Fapi\u002Fdata\u002Froute.ts\nexport async function GET(request: Request) {\n  const data = await fetchData()\n\n  return Response.json(data, {\n    headers: {\n      'Access-Control-Allow-Origin': '*',  \u002F\u002F Or specific domain\n      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n      'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n    },\n  })\n}\n\n\u002F\u002F Handle preflight requests\nexport async function OPTIONS() {\n  return new Response(null, {\n    headers: {\n      'Access-Control-Allow-Origin': '*',\n      'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n      'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n    },\n  })\n}\n\n\u002F\u002F Or use next.config.js for all routes:\nmodule.exports = {\n  async headers() {\n    return [\n      {\n        source: '\u002Fapi\u002F:path*',\n        headers: [\n          { key: 'Access-Control-Allow-Origin', value: '*' },\n        ],\n      },\n    ]\n  },\n}\n\n### Page shows stale data after deployment\n\nSeverity: MEDIUM\n\nSituation: Updated data not appearing after new deployment\n\nSymptoms:\n- Old content shows after deploy\n- Changes not visible immediately\n- Different users see different versions\n- Data updates but page doesn't\n\nWhy this breaks:\nVercel caches aggressively. Static pages are cached at the edge.\nEven dynamic pages may be cached if not configured properly.\nOld cached versions served until cache expires or is purged.\n\nRecommended fix:\n\nControl caching behavior:\n\n\u002F\u002F Force no caching (always fresh)\nexport const dynamic = 'force-dynamic'\nexport const revalidate = 0\n\n\u002F\u002F ISR - revalidate every 60 seconds\nexport const revalidate = 60\n\n\u002F\u002F On-demand revalidation (after mutation)\nimport { revalidatePath, revalidateTag } from 'next\u002Fcache'\n\n\u002F\u002F In Server Action:\nasync function updatePost(id: string) {\n  await db.post.update({ ... })\n  revalidatePath(`\u002Fposts\u002F${id}`)  \u002F\u002F Purge this page\n  revalidateTag('posts')          \u002F\u002F Purge all with this tag\n}\n\n\u002F\u002F Purge via API (deployment hook):\n\u002F\u002F POST https:\u002F\u002Fyour-site.vercel.app\u002Fapi\u002Frevalidate?path=\u002Fposts\n\n\u002F\u002F Check caching in response headers:\n\u002F\u002F x-vercel-cache: HIT = served from cache\n\u002F\u002F x-vercel-cache: MISS = freshly generated\n\n## Validation Checks\n\n### Secret in NEXT_PUBLIC Variable\n\nSeverity: CRITICAL\n\nMessage: Secret exposed via NEXT_PUBLIC_ prefix. This will be visible in browser.\n\nFix action: Remove NEXT_PUBLIC_ prefix and access only in server-side code\n\n### Hardcoded Vercel URL\n\nSeverity: WARNING\n\nMessage: Hardcoded Vercel URL. Use VERCEL_URL environment variable instead.\n\nFix action: Use process.env.VERCEL_URL or NEXT_PUBLIC_VERCEL_URL\n\n### Node.js API in Edge Runtime\n\nSeverity: ERROR\n\nMessage: Node.js module used in Edge runtime. fs\u002Fpath not available in Edge.\n\nFix action: Use runtime = 'nodejs' or remove Node.js dependencies\n\n### API Route Without CORS Headers\n\nSeverity: WARNING\n\nMessage: API route without CORS headers may fail cross-origin requests.\n\nFix action: Add Access-Control-Allow-Origin header if API is called from other domains\n\n### API Route Without Error Handling\n\nSeverity: WARNING\n\nMessage: API route without try\u002Fcatch. Unhandled errors return 500 without details.\n\nFix action: Wrap in try\u002Fcatch and return appropriate error responses\n\n### Secret Read in Static Context\n\nSeverity: WARNING\n\nMessage: Server secret accessed in static generation. Value baked into build.\n\nFix action: Move secret access to runtime code or use NEXT_PUBLIC_ for public values\n\n### Large Package Import\n\nSeverity: WARNING\n\nMessage: Large package imported. May cause slow cold starts. Consider alternatives.\n\nFix action: Use lodash-es with tree shaking, date-fns instead of moment, @aws-sdk\u002Fclient-* instead of aws-sdk\n\n### Dynamic Page Without Revalidation Config\n\nSeverity: WARNING\n\nMessage: Dynamic page without revalidation config. Consider setting revalidation strategy.\n\nFix action: Add export const revalidate = 60 for ISR, or 0 for no cache\n\n## Collaboration\n\n### Delegation Triggers\n\n- next.js|app router|pages|server components -> nextjs-app-router (Deployment needs Next.js patterns)\n- database|supabase|backend -> supabase-backend (Deployment needs database)\n- auth|authentication|session -> nextjs-supabase-auth (Deployment needs auth config)\n- monitoring|logs|errors|analytics -> analytics-architecture (Deployment needs monitoring)\n\n### Production Launch\n\nSkills: vercel-deployment, nextjs-app-router, supabase-backend, nextjs-supabase-auth\n\nWorkflow:\n\n```\n1. App configuration (nextjs-app-router)\n2. Database setup (supabase-backend)\n3. Auth config (nextjs-supabase-auth)\n4. Deploy (vercel-deployment)\n```\n\n### CI\u002FCD Pipeline\n\nSkills: vercel-deployment, devops, qa-engineering\n\nWorkflow:\n\n```\n1. Test automation (qa-engineering)\n2. Pipeline config (devops)\n3. Deploy strategy (vercel-deployment)\n```\n\n## Related Skills\n\nWorks well with: `nextjs-app-router`, `supabase-backend`\n\n## When to Use\n- User mentions or implies: vercel\n- User mentions or implies: deploy\n- User mentions or implies: deployment\n- User mentions or implies: hosting\n- User mentions or implies: production\n- User mentions or implies: environment variables\n- User mentions or implies: edge function\n- User mentions or implies: serverless function\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,229,792,"2026-05-16 13:46:10",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"前端开发","frontend","mdi-language-html5","HTML\u002FCSS\u002FJavaScript\u002F框架相关",1,96,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"8e752a85-019a-4a00-8928-be7382b7d97c","1.0.0","vercel-deployment.zip",6652,"uploads\u002Fskills\u002F67ef05a6-0a0a-4c59-b44c-ad8ecf77c07f\u002Fvercel-deployment.zip","8c632de1c1732ebac3c5a69eee281871565acfa0a6e7328acb0a0412255b4b83","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":17638}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]