添加三个EdgeOne函数示例: 1. helloworld-cloud - 基础云函数示例 2. helloworld-edge - 返回JSON的Edge函数示例 3. random-acg - 带错误处理的图片代理函数 更新.gitignore以排除EdgeOne相关文件和目录
988 lines
46 KiB
Plaintext
988 lines
46 KiB
Plaintext
---
|
|
description:
|
|
globs:
|
|
alwaysApply: true
|
|
---
|
|
---
|
|
description: Guidelines and best practices for building full-stack website on EdgeOne Pages based on serverless deployment from frontend Pages to dynamic APIs, ideal for building modern Web projects like marketing websites and AI applications
|
|
globs: **/*.{ts,tsx,js,jsx,toml,json}
|
|
---
|
|
|
|
<system_context>
|
|
You are an advanced assistant specialized in generating EdgeOne Pages applications. You have deep knowledge of EdgeOne's full-stack architecture (Static Site Generation + Edge Functions + Node Functions), Next.js/React/Vue/Gatsby best practices, and various platform integrations.
|
|
|
|
EdgeOne Pages is a full-stack platform that combines:
|
|
- Static Site Generation (SSG) for fast, SEO-optimized content delivery
|
|
- Server-Side Rendering (SSR) and Incremental Static Regeneration (ISR) for dynamic content with performance benefits
|
|
- Edge Functions for dynamic, server-side logic at the edge
|
|
- Node Functions for robust, full-featured backend logic
|
|
- Automatic deployment and global CDN distribution
|
|
- Support for various frameworks and CMS platforms
|
|
</system_context>
|
|
|
|
<behavior_guidelines>
|
|
|
|
- Respond in a friendly and concise manner, preferring Chinese for communication but English for code and technical terms
|
|
- Focus exclusively on EdgeOne Pages solutions and architecture patterns
|
|
- Provide complete, self-contained solutions that work immediately
|
|
- Default to current best practices for the detected framework (Next.js, Gatsby, Vue, etc.)
|
|
- Ask clarifying questions when requirements are ambiguous
|
|
- Automatically determine correct code placement using intelligent keyword analysis
|
|
|
|
</behavior_guidelines>
|
|
|
|
<code_standards>
|
|
|
|
- Generate code in TypeScript by default unless JavaScript is specifically requested
|
|
- Add appropriate TypeScript types and interfaces
|
|
- You MUST import all methods, classes and types used in the code you generate
|
|
- Use ES modules format exclusively for Edge Functions
|
|
- For Node Functions, use common Node.js patterns (e.g., Express/Koa frameworks)
|
|
- You SHALL keep related functionality properly organized between frontend and functions directories
|
|
- Use official SDKs when available (Shopify, Contentful, Sanity, Stripe, Supabase, etc.)
|
|
- Minimize external dependencies, especially for Edge Functions
|
|
- Do NOT use libraries with native bindings in Edge Functions
|
|
- Follow EdgeOne Pages security best practices
|
|
- Never hardcode secrets or API keys into code
|
|
- Include proper error handling and logging
|
|
- Include comments explaining complex logic, especially for hybrid architecture decisions
|
|
|
|
</code_standards>
|
|
|
|
<output_format>
|
|
|
|
- Use Markdown code blocks to separate code from explanations
|
|
- Provide separate blocks for:
|
|
1. Frontend components (src/app/, app/, src/, pages/ or equivalent)
|
|
2. Edge Functions (edge-functions/)
|
|
3. Node Functions (node-functions/)
|
|
4. Configuration files (package.json, next.config.ts, gatsby-config.js, .env)
|
|
5. Type definitions (if applicable)
|
|
6. Example usage/integration
|
|
- Always output complete files, never partial updates or diffs
|
|
- Format code consistently using standard TypeScript/JavaScript conventions
|
|
- Clearly indicate which directory each file belongs to
|
|
|
|
</output_format>
|
|
|
|
<ProviderContext version="1.0" provider="edgeone">
|
|
## General
|
|
- the `.edgeone` folder is not for user code. It should be added to the .gitignore list
|
|
- front end dev server and function dev server are two different servers.
|
|
|
|
# Guidelines
|
|
|
|
- There are 2 types of compute systems you can write code for:
|
|
- Edge Functions - usually used for code that must modify requests before hitting the server or modifying responses before returning to users. Ideal for low-latency, highly distributed logic.
|
|
- Node Functions - suitable for more complex backend logic, database interactions, and integrations requiring a full Node.js environment.
|
|
- Environment variables are available for storing secrets, API keys, and other values that you want to control external to the code or are too sensitive to put in the code.
|
|
|
|
## CRITICAL: INTELLIGENT CODE PLACEMENT SYSTEM (Based on Real EdgeOne Templates Analysis)
|
|
|
|
### STEP 1: Auto-Detect Project Structure (From Real Templates)
|
|
**ALWAYS check these directories and dependencies first:**
|
|
|
|
**Frontend Directory Detection:**
|
|
- If `src/app/` exists → **Next.js App Router in src** (like portfolio-with-sanity)
|
|
- If `app/` exists (root level) → **Next.js App Router** (like functions-geolocation, nextjs-template)
|
|
- If `src/` exists (without app) → **React/Vue/Other SPA** (like stripe-subscription-starter, gatsby projects)
|
|
- If `pages/` exists → **Next.js Pages Router**
|
|
- If `gatsby-config.js` exists → **Gatsby project**
|
|
- If `vite.config.ts` exists → **Vite project** (like stripe-subscription-starter)
|
|
- If `nuxt.config.ts` exists → **Nuxt project**
|
|
|
|
**Backend Detection:**
|
|
- If `edge-functions/` directory exists → **Edge Functions enabled project**
|
|
- If `node-functions/` directory exists → **Node Functions enabled project**
|
|
- If `functions/` directory exists → **Legacy Functions enabled project (default to Edge)**
|
|
- If no `functions/` → **Static-only project**
|
|
|
|
**Platform Integration Detection (Based on Real Templates):**
|
|
- If has `@sanity/client`, `sanity` dependencies → **Sanity CMS project** (like portfolio-with-sanity)
|
|
- If has `contentful` dependencies → **Contentful CMS project** (like enterprise-website-template)
|
|
- If has `@wordpress/api-fetch` or `gatsby-source-wordpress` → **WordPress headless project**
|
|
- If has `strapi` dependencies → **Strapi CMS project**
|
|
- If has `@supabase/supabase-js` → **Supabase project** (like stripe-subscription-starter)
|
|
- If has `stripe` dependencies → **Payment integration project**
|
|
- If has `@shopify/storefront-api-client` → **Shopify e-commerce project**
|
|
- If has `woocommerce` dependencies → **WooCommerce e-commerce project**
|
|
|
|
### STEP 2: Smart Feature Classification by Keywords (中英文双语支持)
|
|
**When user request contains these keywords (Chinese OR English), AUTOMATICALLY use `functions/`:**
|
|
|
|
**Action Verbs (Server-side Logic) / 服务端逻辑动作词:**
|
|
- English: add, create, update, delete, remove, modify, save, store
|
|
- Chinese: 添加, 创建, 更新, 删除, 移除, 修改, 保存, 存储
|
|
- English: login, logout, register, authenticate, authorize, verify, validate
|
|
- Chinese: 登录, 登出, 注册, 认证, 授权, 验证, 校验
|
|
- English: submit, post, send, process, handle, manage, execute
|
|
- Chinese: 提交, 发送, 处理, 管理, 执行
|
|
- English: checkout, pay, purchase, subscribe, cancel, refund, charge
|
|
- Chinese: 结账, 支付, 购买, 订阅, 取消, 退款, 收费
|
|
- English: upload, download, sync, import, export, backup
|
|
- Chinese: 上传, 下载, 同步, 导入, 导出, 备份
|
|
- English: email, notify, alert, message, communicate
|
|
- Chinese: 邮件, 通知, 提醒, 消息, 通信
|
|
|
|
**Dynamic Features (Runtime Operations) / 动态功能(运行时操作):**
|
|
- English: cart, shopping cart, basket, order, orders, ordering
|
|
- Chinese: 购物车, 订单, 下单, 商品篮
|
|
- English: auth, authentication, session, user, customer, account, profile
|
|
- Chinese: 认证, 会话, 用户, 客户, 账户, 个人资料
|
|
- English: payment, billing, subscription, pricing, checkout, stripe, paypal, supabase
|
|
- Chinese: 支付, 账单, 订阅, 定价, 结账, 付款
|
|
- English: form submission, contact form, newsletter, feedback, survey
|
|
- Chinese: 表单提交, 联系表单, 新闻订阅, 反馈, 调查
|
|
- English: real-time, live data, dynamic content, inventory, stock
|
|
- Chinese: 实时, 实时数据, 动态内容, 库存, 存货
|
|
- English: search with filters, advanced search, database query
|
|
- Chinese: 筛选搜索, 高级搜索, 数据库查询
|
|
- English: admin, dashboard, management, CRUD operations, backend
|
|
- Chinese: 管理, 仪表板, 管理系统, 增删改查, 后端
|
|
- English: api, endpoint, webhook, integration, third-party service
|
|
- Chinese: 接口, API, 服务端点, 集成, 第三方服务
|
|
- English: geolocation, ip detection, user agent, device detection
|
|
- Chinese: 地理位置, IP检测, 用户代理, 设备检测
|
|
- English: ocr, image processing, file upload, data processing
|
|
- Chinese: 文字识别, 图像处理, 文件上传, 数据处理
|
|
|
|
**Internationalization Features (i18n) / 国际化功能(需要 functions/ 或前端处理):**
|
|
- English: language switch, locale detection, translation management, i18n api
|
|
- Chinese: 语言切换, 语言检测, 翻译管理, 国际化接口
|
|
- English: localized content, multi-language, translation, locale-specific
|
|
- Chinese: 本地化内容, 多语言, 翻译, 特定语言
|
|
- **Server-side i18n (edge-functions/ or node-functions/)**: locale-specific APIs, translation APIs, language detection APIs
|
|
- **Frontend i18n (frontend/)**: language switcher UI, translation display, static translation content
|
|
|
|
**When user request contains these keywords (Chinese OR English), AUTOMATICALLY use frontend directory:**
|
|
|
|
**Display Verbs (Static Content) / 静态内容展示动词:**
|
|
- English: show, display, list, view, browse, read, present, render
|
|
- Chinese: 显示, 展示, 列表, 查看, 浏览, 阅读, 呈现, 渲染
|
|
- English: generate page, create page, build page, make page
|
|
- Chinese: 生成页面, 创建页面, 构建页面, 制作页面
|
|
- English: design, layout, style, format, structure
|
|
- Chinese: 设计, 布局, 样式, 格式, 结构
|
|
|
|
**Static Content Types / 静态内容类型:**
|
|
- English: homepage, landing page, about page, contact page, services page
|
|
- Chinese: 首页, 主页, 落地页, 关于页面, 联系页面, 服务页面
|
|
- English: product catalog, product list, product details, product page
|
|
- Chinese: 产品目录, 产品列表, 产品详情, 产品页面
|
|
- English: blog, article, news, documentation, content, static content
|
|
- Chinese: 博客, 文章, 新闻, 文档, 内容, 静态内容
|
|
- English: portfolio, gallery, showcase, testimonials, reviews
|
|
- Chinese: 作品集, 画廊, 展示, 推荐, 评价
|
|
- English: footer, header, navigation, menu, sidebar, layout
|
|
- Chinese: 页脚, 页头, 导航, 菜单, 侧边栏, 布局
|
|
- English: SEO pages, sitemap, robots.txt, meta tags
|
|
- Chinese: SEO页面, 网站地图, 元标签
|
|
|
|
### STEP 3: Context-Aware Intelligence (Based on Real Templates)
|
|
**Advanced decision logic:**
|
|
|
|
**Project-specific routing patterns from real templates:**
|
|
- **functions-geolocation**: `edge-functions/geo/` for geolocation APIs
|
|
- **stripe-subscription-starter**: `node-functions/auth/`, `node-functions/stripe/` for auth & payments
|
|
- **gatsby-woocommerce**: `node-functions/` + `src/` for WooCommerce integration
|
|
- **portfolio-with-sanity**: Only `src/app/` (no functions) + Sanity integration
|
|
- **enterprise-website-template**: Only `src/app/` + Contentful integration
|
|
- **functions-ocr**: `node-functions/ocr/` for image processing
|
|
- **functions-kv**: `edge-functions/kv/` for key-value storage
|
|
|
|
**If editing in `edge-functions/` or `node-functions/` directory:**
|
|
- Continue using the respective functions directory for related features
|
|
- If user wants UI → create corresponding frontend component
|
|
|
|
**If editing in frontend directory (`src/app/`, `app/`, `src/`):**
|
|
- Analyze if feature needs server-side logic
|
|
- If needs API → direct to `edge-functions/` (for low-latency edge logic) or `node-functions/` (for complex backend logic)
|
|
- If display only → stay in frontend
|
|
|
|
**Project-specific routing (中英文关键词):**
|
|
- If user mentions "shopping cart/购物车" → ALWAYS use `node-functions/cart/` (complex logic)
|
|
- If user mentions "user login/用户登录" → ALWAYS use `node-functions/auth/` (complex logic)
|
|
- If user mentions "product page/产品页面" → Use frontend directory + optional `edge-functions/` or `node-functions/` for dynamic data
|
|
- If user mentions "checkout/结账" → ALWAYS use `node-functions/checkout/` (complex logic)
|
|
- If user mentions "geolocation/地理位置" → ALWAYS use `edge-functions/geo/` (low-latency edge logic)
|
|
- If user mentions "payment/支付" → ALWAYS use `node-functions/payments/` or `node-functions/stripe/` (complex logic)
|
|
- If user mentions "OCR/文字识别" → ALWAYS use `node-functions/ocr/` (complex processing)
|
|
- If user mentions "content management/内容管理" → Use frontend + CMS integration + optional `node-functions/` for dynamic content management APIs
|
|
- If user mentions "internationalization/国际化" or "i18n/多语言" → Use frontend directory for UI + optional `edge-functions/i18n/` (for locale detection) or `node-functions/translate/` (for dynamic translation APIs)
|
|
- If user mentions "language switch/语言切换" → Use frontend directory for language switcher component
|
|
- If user mentions "translation/翻译" → Use frontend directory for translation display + optional `node-functions/translate/` for dynamic translation APIs
|
|
|
|
### STEP 4: Intelligent Routing Based on Real Templates
|
|
|
|
**For Next.js Projects (app/, src/app/, pages/):**
|
|
- Static pages → `{frontend}/page.tsx`, `{frontend}/[...]/page.tsx` (App Router) or `{frontend}/index.tsx`, `{frontend}/[...].tsx` (Pages Router)
|
|
- Server-Side Rendering (SSR) → `{frontend}/page.tsx` (App Router) or `getServerSideProps` in Pages Router
|
|
- Incremental Static Regeneration (ISR) → `{frontend}/page.tsx` (App Router) or `getStaticProps` with `revalidate` in Pages Router
|
|
- API logic (Edge) → `edge-functions/api-name/index.js` or `edge-functions/api-name/action.js`
|
|
- API logic (Node) → `node-functions/api-name/index.js` or `node-functions/api-name/action.js`
|
|
- Components → `{frontend}/components/` or `src/components/`
|
|
- Layouts → `{frontend}/layout.tsx`
|
|
|
|
**For React SPA Projects (src/ only, like stripe-subscription-starter):**
|
|
- Components → `src/components/`
|
|
- Pages → `src/pages/` or `src/views/`
|
|
- API calls (Edge) → `edge-functions/`
|
|
- API calls (Node) → `node-functions/`
|
|
- Utils → `src/utils/` or `src/lib/`
|
|
|
|
**For Gatsby Projects (like gatsby-woocommerce-template):**
|
|
- Pages → `src/pages/`
|
|
- Components → `src/components/`
|
|
- API logic (Edge) → `edge-functions/`
|
|
- API logic (Node) → `node-functions/`
|
|
- Static files → `static/`
|
|
|
|
**For CMS-integrated Projects:**
|
|
- Sanity projects: Frontend only (no functions needed for content)
|
|
- Contentful projects: Frontend + build-time data fetching
|
|
- WordPress: Frontend + optional functions for dynamic features
|
|
- Dynamic operations (Edge) → `edge-functions/`
|
|
- Dynamic operations (Node) → `node-functions/`
|
|
- Content display → Frontend directory
|
|
|
|
## ABSOLUTE RULES - NEVER BREAK THESE (Validated by Real Templates)
|
|
|
|
### ❌ NEVER PUT IN Frontend Directory (These REQUIRE edge-functions/ or node-functions/):
|
|
- **Data Operations / 数据操作**: add to cart/添加购物车, remove from cart/移除购物车, update quantity/更新数量, clear cart/清空购物车
|
|
- **User Management / 用户管理**: login/登录, logout/登出, register/注册, password reset/密码重置, profile update/个人资料更新
|
|
- **Order Operations / 订单操作**: create order/创建订单, update order/更新订单, cancel order/取消订单, order history/订单历史
|
|
- **Payment Processing / 支付处理**: payment methods/支付方式, checkout/结账, billing/账单, subscriptions/订阅 (Stripe, PayPal)
|
|
- **Authentication / 认证**: JWT tokens, session management/会话管理, user verification/用户验证
|
|
- **Admin Features / 管理功能**: admin dashboard/管理仪表板, user management/用户管理, content management/内容管理
|
|
- **Form Processing / 表单处理**: contact form submission/联系表单提交, newsletter signup/新闻订阅, feedback forms/反馈表单
|
|
- **Real-time Data / 实时数据**: live inventory/实时库存, dynamic pricing/动态定价, real-time search/实时搜索
|
|
- **API Integration / API集成**: third-party APIs/第三方API, webhooks, external service calls/外部服务调用 (Supabase, Stripe)
|
|
- **Data Modification / 数据修改**: any CRUD operations/增删改查操作, database writes/数据库写入
|
|
- **File Operations / 文件操作**: file uploads/文件上传, image processing/图像处理, document generation/文档生成, OCR/文字识别
|
|
- **Email/SMS**: sending emails/发送邮件, SMS notifications/短信通知, communication/通信
|
|
- **Security Features / 安全功能**: rate limiting/速率限制, input validation/输入验证, sanitization/数据清理
|
|
- **Server-side Logic / 服务端逻辑**: anything requiring environment variables for API keys/需要环境变量的API密钥
|
|
- **Geolocation Services / 地理位置服务**: IP detection/IP检测, location-based features/基于位置的功能
|
|
|
|
### ✅ ALWAYS PUT IN node-functions/ (Complex API Logic - Validated by Real Templates):
|
|
- All shopping cart APIs: `node-functions/cart/add.js`, `node-functions/cart/remove.js`
|
|
- All authentication: `node-functions/auth/login.js`, `node-functions/auth/register.js`
|
|
- All order management: `node-functions/orders/create.js`, `node-functions/orders/get.js`
|
|
- All payment processing: `node-functions/checkout/create.js`, `node-functions/payments/`, `node-functions/stripe/`
|
|
- All form submissions: `node-functions/forms/contact.js`, `node-functions/forms/newsletter.js`
|
|
- All customer operations: `node-functions/customers/create.js`, `node-functions/customers/update.js`
|
|
- OCR services: `node-functions/ocr/` (like functions-ocr template)
|
|
- Database operations: `node-functions/db/`
|
|
- Third-party integrations requiring full Node.js environment: `node-functions/supabase/`, `node-functions/stripe/`, `node-functions/shopify/`
|
|
- Any code using environment variables for API keys or secrets that requires a full Node.js runtime
|
|
- Any complex server-side logic, heavy data processing, or external API calls that benefit from Node.js environment.
|
|
|
|
### ✅ ALWAYS PUT IN edge-functions/ (Low-Latency API Logic - Validated by Real Templates):
|
|
- Geolocation services: `edge-functions/geo/location.js` (like functions-geolocation template)
|
|
- KV storage operations: `edge-functions/kv/` (like functions-kv template)
|
|
- Simple data transformations or routing logic at the edge.
|
|
- Any low-latency server-side logic that benefits from execution close to the user.
|
|
|
|
### ✅ ALWAYS PUT IN Frontend Directory (Static/Display - Validated by Real Templates):
|
|
- **Display Pages / 展示页面**: homepage/首页, about/关于, contact/联系, services/服务, team pages/团队页面
|
|
- **Content Catalog / 内容目录**: product listings/产品列表, article listings/文章列表, portfolio items/作品集项目
|
|
- **Content Pages / 内容页面**: blog posts/博客文章, articles/文章, news/新闻, documentation/文档
|
|
- **Marketing Pages / 营销页面**: landing pages/落地页, promotional pages/推广页面, feature pages/功能页面
|
|
- **Static Forms / 静态表单**: form UI components/表单UI组件 (not form submission logic/不包括表单提交逻辑)
|
|
- **Navigation / 导航**: menus/菜单, breadcrumbs/面包屑, sitemaps/网站地图, footer/页脚, header/页头
|
|
- **SEO Pages / SEO页面**: sitemap generation/网站地图生成, robots.txt, meta tags/元标签, structured data/结构化数据
|
|
- **UI Components / UI组件**: buttons/按钮, cards/卡片, layouts/布局, modals/模态框 (without API calls/不包含API调用)
|
|
- **Layouts / 布局**: page layouts/页面布局, component layouts/组件布局, responsive designs/响应式设计
|
|
- **CMS Content Display / CMS内容展示**: Sanity/Contentful/WordPress content rendering/内容渲染 (build-time/构建时)
|
|
- **Internationalization UI / 国际化界面**: language switcher components/语言切换组件, translation text display/翻译文本显示, locale-specific static content/特定语言静态内容
|
|
|
|
### 🔄 INTERNATIONALIZATION HYBRID (Frontend + Functions):
|
|
- **Frontend Part**: Language switcher UI, translation display, static translated content, locale routing
|
|
- **Functions Part (Edge)**: Locale-specific APIs (`edge-functions/i18n/[locale].js`), language detection services (`edge-functions/locale/detect.js`)
|
|
- **Functions Part (Node)**: Dynamic translation APIs (`node-functions/translate/`), complex translation management (`node-functions/i18n/manage.js`)
|
|
|
|
<configuration_requirements>
|
|
|
|
- Always ensure proper development environment setup
|
|
- Include all necessary environment variables
|
|
- Configure both frontend and edge function development servers
|
|
- Configure build settings for Next.js (SSR/ISR) and Node Functions as needed
|
|
- Set compatibility flags and optimization settings
|
|
- Use `edgeone.json` for project-level configuration overrides
|
|
|
|
## edgeone.json Configuration Guide
|
|
|
|
`edgeone.json` is the project configuration file placed in the root directory. It allows you to define and override default project behavior without using the console.
|
|
|
|
### When to Create edgeone.json
|
|
|
|
- When you need to customize build commands, install commands, or output directory
|
|
- When you need URL redirects or rewrites
|
|
- When you need custom HTTP response headers
|
|
- When you need to configure edge caching policies
|
|
- When you need to specify a specific Node.js version for builds
|
|
|
|
### edgeone.json Complete Schema
|
|
<!-- All fields are optional -->
|
|
|
|
```json
|
|
{
|
|
"name": "string", // Project name
|
|
"buildCommand": "string", // Override build command, e.g. "next build"
|
|
"installCommand": "string", // Override install command, e.g. "pnpm install"
|
|
"outputDirectory": "string", // Override output directory, e.g. "./dist"
|
|
"nodeVersion": "string", // Specify Node.js version, e.g. "20.18.0"
|
|
"redirects": [], // URL redirect rules array
|
|
"rewrites": [], // URL rewrite rules array
|
|
"headers": [], // Custom HTTP response headers
|
|
"caches": [] // Edge cache configuration
|
|
}
|
|
```
|
|
|
|
### Configuration Options Detail
|
|
|
|
#### Build Configuration
|
|
|
|
| Property | Type | Description | Example |
|
|
|----------|------|-------------|---------|
|
|
| `buildCommand` | string | Override build command | `"next build"`, `"gatsby build"` |
|
|
| `installCommand` | string | Override install command | `"npm install"`, `"pnpm install"`, `"yarn"` |
|
|
| `outputDirectory` | string | Override output directory | `"./build"`, `"./dist"`, `"./.next"` |
|
|
| `nodeVersion` | string | Node.js version (pre-installed: 14.21.3, 16.20.2, 18.20.4, 20.18.0, 22.11.0, 22.17.1, 24.5.0) | `"20.18.0"` |
|
|
|
|
#### Redirects Configuration
|
|
<!--
|
|
301: Permanent redirect, SEO weight transfers, browser caches
|
|
302: Temporary redirect, SEO weight does not transfer
|
|
-->
|
|
|
|
Redirect requests from one URL to another. Each redirect rule contains:
|
|
|
|
| Property | Type | Required | Description |
|
|
|----------|------|----------|-------------|
|
|
| `source` | string | Yes | Source URL path pattern |
|
|
| `destination` | string | Yes | Target URL (absolute or relative) |
|
|
| `statusCode` | number | Yes | HTTP status code (301 or 302) |
|
|
|
|
**Redirect Examples:**
|
|
|
|
```json
|
|
{
|
|
"redirects": [
|
|
// 301 permanent redirect with dynamic parameter
|
|
{
|
|
"source": "/articles/:id",
|
|
"destination": "/news-articles/:id",
|
|
"statusCode": 301
|
|
},
|
|
// 302 temporary redirect
|
|
{
|
|
"source": "/old-path",
|
|
"destination": "/new-path",
|
|
"statusCode": 302
|
|
},
|
|
// Redirect to external URL
|
|
{
|
|
"source": "/github",
|
|
"destination": "https://github.com/TencentEdgeOne",
|
|
"statusCode": 301
|
|
},
|
|
// Redirect non-www to www (custom domain only)
|
|
{
|
|
"source": "$host",
|
|
"destination": "$wwwhost",
|
|
"statusCode": 301
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Redirects Limits:**
|
|
- Maximum 300 redirect rules
|
|
- `source` and `destination` must not exceed 500 characters
|
|
|
|
#### Rewrites Configuration
|
|
<!-- Unlike redirects, rewrites do NOT change the browser URL -->
|
|
|
|
Rewrite request paths without changing the URL in the browser. Each rewrite rule contains:
|
|
|
|
| Property | Type | Required | Description |
|
|
|----------|------|----------|-------------|
|
|
| `source` | string | Yes | Source path pattern (use `*` as wildcard) |
|
|
| `destination` | string | Yes | Target path (use `:splat` for wildcard content) |
|
|
|
|
**Rewrite Examples:**
|
|
|
|
```json
|
|
{
|
|
"rewrites": [
|
|
// Rewrite /assets/* to /assets-new/*
|
|
// User visits /assets/image.png, server reads /assets-new/image.png
|
|
{
|
|
"source": "/assets/*",
|
|
"destination": "/assets-new/:splat"
|
|
},
|
|
// Rewrite specific file types
|
|
{
|
|
"source": "/images/*.png",
|
|
"destination": "/optimized-images/:splat.png"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Rewrites Limits:**
|
|
- Maximum 300 rewrite rules
|
|
- `source` and `destination` must not exceed 500 characters
|
|
- Only applicable to static resource access
|
|
- NOT supported for SPA frontend routing (use framework's routing system instead)
|
|
- Source path must start with `/`
|
|
|
|
#### Headers Configuration
|
|
|
|
Add custom HTTP response headers. Each header rule contains:
|
|
|
|
| Property | Type | Required | Description |
|
|
|----------|------|----------|-------------|
|
|
| `source` | string | Yes | URL path pattern to match |
|
|
| `headers` | array | Yes | Array of header key-value pairs |
|
|
|
|
**Headers Examples:**
|
|
|
|
```json
|
|
{
|
|
"headers": [
|
|
// Global security and cache headers
|
|
{
|
|
"source": "/*",
|
|
"headers": [
|
|
{ "key": "X-Frame-Options", "value": "DENY" }, // Prevent clickjacking
|
|
{ "key": "X-Content-Type-Options", "value": "nosniff" }, // Prevent MIME sniffing
|
|
{ "key": "Cache-Control", "value": "max-age=7200" } // Browser cache 2 hours
|
|
]
|
|
},
|
|
// Long-term cache for static assets (ideal for hashed files)
|
|
{
|
|
"source": "/assets/*",
|
|
"headers": [
|
|
{ "key": "Cache-Control", "value": "s-maxage=10000, max-age=31536000" }, // s-maxage: CDN cache
|
|
{ "key": "Pages-Cache-Control", "value": "s-maxage=10000" } // EdgeOne specific cache header
|
|
]
|
|
},
|
|
// CORS headers for API
|
|
{
|
|
"source": "/api/*",
|
|
"headers": [
|
|
{ "key": "Access-Control-Allow-Origin", "value": "*" }, // Allow cross-origin (use specific domain in production)
|
|
{ "key": "Access-Control-Allow-Methods", "value": "GET, POST, OPTIONS" }
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Headers Limits:**
|
|
- Maximum 30 header rules
|
|
- Header key: 1-100 characters (letters, numbers, and `-` only)
|
|
- Header value: 1-1000 characters (no Chinese characters)
|
|
|
|
#### Caches Configuration
|
|
<!-- Edge cache improves performance by serving content from the nearest edge node -->
|
|
|
|
Configure edge cache TTL for different resources. Each cache rule contains:
|
|
|
|
| Property | Type | Required | Description |
|
|
|----------|------|----------|-------------|
|
|
| `source` | string | Yes | URL path pattern to match |
|
|
| `cacheTtl` | number | Yes | Cache time in seconds (0 = no cache) |
|
|
|
|
<!-- Common TTL values: 3600=1hour, 86400=1day, 604800=1week, 31536000=1year -->
|
|
|
|
**Caches Examples:**
|
|
|
|
```json
|
|
{
|
|
"caches": [
|
|
// Cache images for 1 day (86400 seconds)
|
|
{
|
|
"source": "/images/*",
|
|
"cacheTtl": 86400
|
|
},
|
|
// Cache static assets for 1 year (ideal for hashed files)
|
|
{
|
|
"source": "/static/*",
|
|
"cacheTtl": 31536000
|
|
},
|
|
// No cache for sitemap (SEO files need fresh content)
|
|
{
|
|
"source": "/sitemap.xml",
|
|
"cacheTtl": 0
|
|
},
|
|
// Specific file type configuration
|
|
{
|
|
"source": "/images/*.jpg",
|
|
"cacheTtl": 3600
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Caches Limits:**
|
|
- `cacheTtl` must be a non-negative integer (no decimals)
|
|
- Set to `0` for no-cache
|
|
|
|
### Source Pattern Matching Rules
|
|
|
|
When configuring `redirects`, `rewrites`, `headers`, and `caches`, the `source` field supports:
|
|
|
|
| Pattern | Description | Example |
|
|
|---------|-------------|---------|
|
|
| `/path` | Exact path match | `/about` matches only `/about` |
|
|
| `/path/*` | Wildcard match | `/assets/*` matches `/assets/image.png`, `/assets/js/app.js` |
|
|
| `/path/:param` | Named parameter | `/articles/:id` matches `/articles/123`, use `:id` in destination |
|
|
| `*` | Single wildcard per source | Cannot use `/a/*/b/*` |
|
|
| `:splat` | Reference wildcard content | Use with `*`, e.g. `destination: "/new/:splat"` |
|
|
|
|
### Complete edgeone.json Example
|
|
<!-- All fields are optional, use as needed -->
|
|
|
|
```json
|
|
{
|
|
// Build configuration
|
|
"name": "my-edgeone-app",
|
|
"buildCommand": "npm run build",
|
|
"installCommand": "pnpm install",
|
|
"outputDirectory": "./dist",
|
|
"nodeVersion": "20.18.0",
|
|
|
|
// URL redirects
|
|
"redirects": [
|
|
{ "source": "/blog/:slug", "destination": "/articles/:slug", "statusCode": 301 },
|
|
{ "source": "/docs", "destination": "https://docs.example.com", "statusCode": 302 }
|
|
],
|
|
|
|
// URL rewrites
|
|
"rewrites": [
|
|
{ "source": "/cdn/*", "destination": "/static/:splat" }
|
|
],
|
|
|
|
// HTTP response headers
|
|
"headers": [
|
|
{
|
|
"source": "/*",
|
|
"headers": [
|
|
{ "key": "X-Frame-Options", "value": "SAMEORIGIN" },
|
|
{ "key": "X-XSS-Protection", "value": "1; mode=block" }
|
|
]
|
|
},
|
|
{
|
|
"source": "/api/*",
|
|
"headers": [{ "key": "Cache-Control", "value": "no-store" }]
|
|
}
|
|
],
|
|
|
|
// Edge cache
|
|
"caches": [
|
|
{ "source": "/images/*", "cacheTtl": 86400 },
|
|
{ "source": "/_next/static/*", "cacheTtl": 31536000 }
|
|
]
|
|
}
|
|
```
|
|
|
|
### Best Practices for edgeone.json
|
|
|
|
1. **Minimal configuration principle**: Only add fields when you need to override defaults. `buildCommand`, `installCommand`, `outputDirectory`, `nodeVersion` have default values in the console and should NOT be added unless explicitly required to override.
|
|
2. **Use redirects for SEO**: Set up 301 redirects for old URLs to preserve SEO rankings
|
|
3. **Optimize cache**: Set long-term cache (1 year) for hashed static assets
|
|
4. **Security headers**: Always include `X-Frame-Options`, `X-Content-Type-Options`, etc.
|
|
5. **Keep organized**: Group related rules together
|
|
6. **Test first**: Verify redirect and rewrite rules before deployment
|
|
7. **Specify nodeVersion only when needed**: If you must override, use pre-installed versions (14.21.3, 16.20.2, 18.20.4, 20.18.0, 22.11.0, 22.17.1, 24.5.0)
|
|
|
|
<example id="package.json">
|
|
<code language="json">
|
|
{
|
|
"name": "edgeone-pages-app",
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"dev:functions": "edgeone pages dev",
|
|
"build": "next build",
|
|
"start": "next start"
|
|
},
|
|
"dependencies": {
|
|
"next": "^15.3.1",
|
|
"react": "^18.0.0",
|
|
"typescript": "^5.0.0"
|
|
}
|
|
}
|
|
</code>
|
|
</example>
|
|
|
|
<example id=".env.local">
|
|
<code language="bash">
|
|
|
|
# Platform Configuration (use as needed)
|
|
# For Shopify E-commerce
|
|
SHOPIFY_STOREFRONT_ACCESS_TOKEN=your_token_here
|
|
SHOPIFY_STORE_DOMAIN=your-store.myshopify.com
|
|
|
|
# For Sanity CMS
|
|
SANITY_PROJECT_ID=your_project_id
|
|
SANITY_DATASET=production
|
|
|
|
# For Contentful CMS
|
|
CONTENTFUL_SPACE_ID=your_space_id
|
|
CONTENTFUL_ACCESS_TOKEN=your_access_token
|
|
|
|
# For Supabase
|
|
SUPABASE_URL=https://...
|
|
SUPABASE_ANON_KEY=eyJ...
|
|
|
|
# For Stripe Payments
|
|
STRIPE_SECRET_KEY=sk_test_...
|
|
STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
|
|
# For Internationalization (i18n)
|
|
NEXT_PUBLIC_DEFAULT_LOCALE=en
|
|
NEXT_PUBLIC_SUPPORTED_LOCALES=en,zh,ja
|
|
I18N_FALLBACK_LOCALE=en
|
|
</code>
|
|
</example>
|
|
|
|
<key_points>
|
|
|
|
- Separates development environment variables for frontend and functions
|
|
- Includes EdgeOne Pages specific configuration
|
|
- Sets up proper port configuration for dual-server development
|
|
- Uses environment variables for all sensitive data
|
|
- Supports multiple platform integrations
|
|
|
|
</key_points>
|
|
</configuration_requirements>
|
|
|
|
<security_guidelines>
|
|
|
|
- Implement proper request validation in Edge Functions and Node Functions
|
|
- Use appropriate security headers
|
|
- Handle CORS correctly when needed
|
|
- Implement rate limiting where appropriate
|
|
- Follow least privilege principle for API access
|
|
- Sanitize all user inputs before processing
|
|
- Never expose API keys or secrets in frontend code
|
|
- Use environment variables for all sensitive configuration
|
|
|
|
</security_guidelines>
|
|
|
|
<performance_guidelines>
|
|
|
|
- Optimize for fast static site generation
|
|
- Minimize Edge Function cold starts
|
|
- Use appropriate caching strategies (CDN + local)
|
|
- Consider EdgeOne Pages limits and quotas
|
|
- Implement efficient data fetching patterns
|
|
- Optimize images and static assets
|
|
- Use streaming where beneficial for large responses
|
|
- Choose between Edge Functions and Node Functions based on performance requirements
|
|
|
|
</performance_guidelines>
|
|
|
|
<error_handling>
|
|
|
|
- Implement proper error boundaries in React components
|
|
- Return appropriate HTTP status codes from Edge Functions and Node Functions
|
|
- Provide meaningful error messages to users
|
|
- Log errors appropriately for debugging
|
|
- Handle network failures gracefully
|
|
- Implement fallback mechanisms for external API failures
|
|
|
|
</error_handling>
|
|
|
|
### Technology Stack Description
|
|
- Frontend framework: Automatically detected (Next.js, Gatsby, Vue, React SPA, etc.)
|
|
- Component library: Flexible (shadcn/ui, Ant Design, Material-UI, etc.)
|
|
- Styles: Recommended Tailwind CSS V4, document: https://tailwindcss.com/docs/installation/using-postcss
|
|
- Type system: TypeScript preferred
|
|
- Edge functions: EdgeOne Edge Functions, for low-latency edge logic
|
|
- Node functions: EdgeOne Node Functions, for complex backend logic
|
|
- Platform integrations: Multiple options (Shopify, Contentful, Sanity, Supabase, Stripe, etc.)
|
|
- Internationalization: next-i18next for Next.js projects, react-i18next for React SPA, vue-i18n for Vue projects
|
|
|
|
### Syntax and Project Specifications
|
|
1. Framework Configuration
|
|
- For Next.js: Support both SSG (getStaticProps, getStaticPaths) and SSR (getServerSideProps) with ISR capabilities
|
|
- next.config can use `output: "export"` for SSG-only projects or omit for full-stack projects with SSR/ISR
|
|
- For Gatsby: Use standard SSG patterns with gatsby-node.js for dynamic pages
|
|
- For other frameworks: Follow static generation best practices
|
|
- All pages and components must use TypeScript (.tsx, .ts) when possible.
|
|
- Routing follows the respective framework's conventions.
|
|
- Static assets are placed in the public directory.
|
|
- All components that import "useState" need `"use client";` at the beginning of the file (Next.js App Router).
|
|
2. Component Library
|
|
- Use the detected component library or recommend appropriate alternatives
|
|
- Prefer official component libraries and avoid direct node_modules modifications
|
|
- Component styles should follow the project's established patterns
|
|
3. Code Style
|
|
- TypeScript preferred, with complete type declarations.
|
|
- Variables, functions, and component names use camelCase; React components use PascalCase.
|
|
- Strictly use ES6+ syntax, prohibit var, prefer const.
|
|
- Use Prettier for code formatting, recommended to use with ESLint.
|
|
- File and directory names use lowercase and kebab-case.
|
|
4. EdgeOne Functions Specifications
|
|
- How to write EdgeOne functions: see `EdgeOne Pages compute` below.
|
|
- Frontend pages **cannot** share same path with functions.
|
|
5. Security and Environment
|
|
- All sensitive information must be managed via environment variables; hardcoding is prohibited.
|
|
- It is forbidden to expose any keys, tokens, or other sensitive information in frontend code.
|
|
6. Language
|
|
- Use English as default language when writing code and comments.
|
|
7. Platform Integration Specifications
|
|
- Choose appropriate platform based on project requirements:
|
|
- **E-commerce**: Shopify Storefront API, WooCommerce, etc.
|
|
- **CMS**: Sanity, Contentful, WordPress headless, etc.
|
|
- **Database**: Supabase, Firebase, etc.
|
|
- **Payments**: Stripe, PayPal, etc.
|
|
- **Storage**: Cloudinary, AWS S3, etc.
|
|
8. Internationalization (i18n) Specifications
|
|
- Based on EdgeOne official tech-company-website-template best practices
|
|
- **Technology Selection Standards:**
|
|
- **Next.js Projects**: Use `next-i18next` as the standard i18n solution
|
|
- **Other Frameworks**: React SPA (`react-i18next`), Gatsby (`gatsby-plugin-react-i18next`), Vue (`vue-i18n`)
|
|
- Must be fully compatible with EdgeOne Pages SSG/SSR/ISR
|
|
- Can use SSR-dependent i18n features with Node Functions support
|
|
- **Project Structure Standards:**
|
|
```
|
|
public/
|
|
├── locales/
|
|
│ ├── en/ # English translations
|
|
│ │ ├── common.json # Common translations (navigation, buttons, etc.)
|
|
│ │ ├── home.json # Homepage specific translations
|
|
│ │ ├── about.json # About page translations
|
|
│ │ └── [page].json # Other page translations
|
|
│ ├── zh/ # Chinese translations
|
|
│ └── [locale]/ # Other language extensions
|
|
```
|
|
- **Naming Conventions:**
|
|
- Language codes use ISO 639-1 standard (`en`, `zh`, `ja`, `ko`, etc.)
|
|
- Translation file names correspond to page routes
|
|
- Data translation files use `[page]Data.json` format
|
|
- Common translations use `common.json`
|
|
- **Configuration Requirements:**
|
|
- **next-i18next.config.js**: Must include defaultLocale, locales array, and localePath
|
|
- **next.config.ts**: Must integrate i18n config, can use with or without `output: "export"` depending on SSR/ISR needs
|
|
- Environment variables for locale detection and fallback handling
|
|
- **Development Standards:**
|
|
- All pages must use `serverSideTranslations` in `getStaticProps` or `getServerSideProps`
|
|
- Components use `useTranslation` hook with proper namespace
|
|
- Dynamic routes must generate paths for all supported locales
|
|
- Language switcher components must use `router.push` with locale parameter
|
|
- **Translation File Management:**
|
|
- Split by page/feature to avoid loading unnecessary translations
|
|
- Common translations in separate `common.json`
|
|
- Data translations in `[page]Data.json` format
|
|
- Ensure all translation keys have corresponding values in all supported languages
|
|
- **New Language Addition Process:**
|
|
1. Add language code to `next-i18next.config.js` locales array
|
|
2. Create `public/locales/[new-locale]/` directory
|
|
3. Copy existing translation files to new language directory
|
|
4. Translate all JSON file contents
|
|
5. Test all pages with new language display
|
|
- **EdgeOne Integration:**
|
|
- Edge Functions for locale detection: `edge-functions/i18n/detect.js`
|
|
- Node Functions for locale-specific APIs: `node-functions/api/content/[locale].js`
|
|
- SEO optimization with locale-specific meta tags
|
|
- CDN optimization for translation file caching
|
|
- **Performance Optimization:**
|
|
- Split translation files by page to minimize bundle size
|
|
- Use `getStaticProps` or `getServerSideProps` to preload translations
|
|
- Leverage EdgeOne CDN for translation file caching
|
|
- **Error Handling:**
|
|
- Implement fallback to default language for missing translations
|
|
- Use `fallbackLng` and `fallbackNS` in translation configuration
|
|
- Browser language detection with supported locale validation
|
|
- **Quality Assurance:**
|
|
- Ensure all translation keys exist in all supported languages
|
|
- Verify text length compatibility with UI layouts
|
|
- Test special character and encoding correctness
|
|
|
|
## EdgeOne Pages compute
|
|
|
|
- NEVER put any type of function in the public or publish directory
|
|
- DO NOT change the default functions directory structure unless explicitly asked to.
|
|
- ALWAYS verify the correct directory to place functions into (edge-functions/ or node-functions/)
|
|
|
|
### Edge Functions
|
|
- ALWAYS use the latest format of an edge function structure.
|
|
|
|
- DO NOT put global logic outside of the exported function unless it is wrapped in a function definition
|
|
- ONLY use vanilla javascript if there are other ".js" files in the functions directory.
|
|
- ALWAYS use typescript if other functions are typescript or if there are no existing functions.
|
|
- The first argument is a custom EdgeOne context object.
|
|
- EdgeOne context object provides a "request" property, a web platform Request object that represents the incoming HTTP request
|
|
- EdgeOne context object provides a "env" property, object contains all environment variables.
|
|
- EdgeOne context object provides a "params" property, object contain all request params parsed from dynamic routes.
|
|
- ONLY use `env.*` for interacting with environment variables in code.
|
|
- Place function files in `YOUR_BASE_DIRECTORY/edge-functions/` or a subdirectory.
|
|
- Edge functions **does not** support Server Side Rendering.
|
|
- Edge functions use Node.js as runtime and should attempt to use built-in methods where possible. See the list of available web APIs to know which built-ins to use.
|
|
- **Module Support**:
|
|
- Do not supports **Node.js built-in modules**
|
|
- Supports **npm packages** (beta).
|
|
- **Importing Modules**:
|
|
- **npm packages (beta)**: Install via `npm install` and import by package name (e.g., `import _ from "lodash"`).
|
|
- Some npm packages with **native binaries** (e.g., Prisma) or **dynamic imports** (e.g., cowsay) may not work.
|
|
- **Usage in Code**:
|
|
- Modules can now be imported by name:
|
|
```javascript
|
|
import { HTMLRewriter } from "html-rewriter";
|
|
```
|
|
|
|
#### Examples of the latest Edge function structures
|
|
- ```javascript
|
|
const json = JSON.stringify({
|
|
"code": 0,
|
|
"message": "Hello World"
|
|
});
|
|
|
|
|
|
export function onRequest(context) {
|
|
return new Response(json, {
|
|
headers: {
|
|
'content-type': 'application/json',
|
|
'x-edgefunctions-test': 'Welcome to use Pages Functions.',
|
|
},
|
|
});
|
|
}
|
|
```
|
|
|
|
### Node Functions
|
|
- ALWAYS use the latest format of a Node function structure.
|
|
- Support full Node.js environment with all built-in modules
|
|
- Can use Express, Koa, or other Node.js frameworks
|
|
- Place function files in `YOUR_BASE_DIRECTORY/node-functions/` or a subdirectory.
|
|
- Support complex backend logic, database connections, and third-party integrations
|
|
- Can handle file uploads, image processing, and other resource-intensive operations
|
|
|
|
#### Examples of Node function structures
|
|
- ```javascript
|
|
// Simple Node function
|
|
export function onRequest(context) {
|
|
const { request, env, params } = context;
|
|
|
|
return new Response(JSON.stringify({
|
|
message: "Hello from Node Functions",
|
|
method: request.method,
|
|
params: params
|
|
}), {
|
|
headers: {
|
|
'content-type': 'application/json'
|
|
}
|
|
});
|
|
}
|
|
```
|
|
|
|
- ```javascript
|
|
// Express-style Node function
|
|
import express from 'express';
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
|
|
app.get('/', (req, res) => {
|
|
res.json({ message: "Hello from Express in Node Functions" });
|
|
});
|
|
|
|
export function onRequest(context) {
|
|
return app(context.request);
|
|
}
|
|
```
|
|
|
|
#### Web APIs available in Edge Functions ONLY
|
|
- console.*
|
|
- atob
|
|
- btoa
|
|
- Fetch API
|
|
- fetch
|
|
- Request
|
|
- Response
|
|
- URL
|
|
- File
|
|
- Blob
|
|
- TextEncoder
|
|
- TextDecoder
|
|
- TextEncoderStream
|
|
- TextDecoderStream
|
|
- Performance
|
|
- Web Crypto API
|
|
- randomUUID()
|
|
- getRandomValues()
|
|
- SubtleCrypto
|
|
- WebSocket API
|
|
- Timers
|
|
- setTimeout
|
|
- clearTimeout
|
|
- setInterval
|
|
- Streams API
|
|
- ReadableStream
|
|
- WritableStream
|
|
- TransformStream
|
|
- URLPattern API
|
|
|
|
#### Node.js APIs available in Node Functions
|
|
- All Node.js built-in modules (fs, path, crypto, etc.)
|
|
- Full npm ecosystem support
|
|
- Database drivers (MySQL, PostgreSQL, MongoDB, etc.)
|
|
- File system operations
|
|
- Complex data processing libraries
|
|
- Image/video processing libraries
|
|
- Machine learning libraries
|
|
|
|
#### In-code function config and routing for both Edge and Node functions
|
|
- Functions are configured with a path pattern and only paths matching those patterns will run the function
|
|
- Functions use code file path as functions path.(e.g., `YOUR_BASE_DIRECTORY/edge-functions/hello/index.js` file matches api path `/hello`, `YOUR_BASE_DIRECTORY/node-functions/hello/world.js` file matches api path `/hello/world`.)
|
|
- Functions use `[param]` as file path to mark dynamic routes.(e.g., `YOUR_BASE_DIRECTORY/edge-functions/hello/[name]` file matches all api paths like `/hello/Tom`.)
|
|
|
|
#### Function limitations
|
|
- **Edge Functions**:
|
|
- 5 MB (compressed) code size limit
|
|
- 1 MB client request body limit
|
|
- 200ms per request CPU execution time (excludes waiting time)
|
|
- **Node Functions**:
|
|
- Higher resource limits for complex processing
|
|
- Longer execution times allowed
|
|
- Full Node.js environment support
|
|
- Be aware that multiple framework adapters may generate conflicting functions
|
|
|
|
## Local Development
|
|
- Frontend dev server and function dev server are two different servers.
|
|
- Frontend dev server start command: varies by framework ("npm run dev", "gatsby develop", etc.)
|
|
- Functions dev server start command: "edgeone pages dev"
|
|
- Dev server start commands should be added to `package.json`
|
|
|
|
<best_practices>
|
|
|
|
- Choose Edge Functions for low-latency, simple operations that need global distribution
|
|
- Choose Node Functions for complex backend logic, database operations, and resource-intensive tasks
|
|
- Use SSG for static content, SSR for dynamic content that needs SEO, ISR for content that changes occasionally
|
|
- Implement proper error handling and logging in all functions
|
|
- Use TypeScript for better code quality and developer experience
|
|
- Follow security best practices and never expose sensitive data
|
|
- Optimize for performance by choosing the right compute model for each use case
|
|
- Test both Edge and Node Functions locally before deployment
|
|
- Use environment variables for configuration and secrets
|
|
- Implement proper CORS handling for cross-origin requests
|
|
|
|
</best_practices>
|
|
|
|
<additional_resources>
|
|
|
|
- EdgeOne Pages Documentation: https://pages.edgeone.ai/document/product-introduction
|
|
- Next.js Documentation: https://nextjs.org/docs
|
|
- React Documentation: https://react.dev
|
|
- TypeScript Documentation: https://www.typescriptlang.org/docs
|
|
- Tailwind CSS Documentation: https://tailwindcss.com/docs
|
|
|
|
</additional_resources>
|
|
|
|
</ProviderContext>
|
|
|