xiaohongshu
xiaohongshu
Why and how to use dynamic imports in LivestockAI server functions for Cloudflare Workers compatibility
Full skill instructions
LivestockAI requires dynamic imports in server functions for Cloudflare Workers compatibility. This skill explains the pattern and why it's necessary.
Cloudflare Workers doesn't support process.env at module load time. Environment variables are only available through the env binding from cloudflare:workers, and that binding is only accessible during request handling.
// ❌ This fails on Cloudflare Workers
// The import runs at module load time, before env is available
import { db } from '~/lib/db'
export const fn = createServerFn().handler(async () => {
return db.selectFrom('users').execute() // db is undefined or throws
})
Use dynamic imports inside the handler function:
// ✅ This works on Cloudflare Workers
export const fn = createServerFn().handler(async () => {
const { getDb } = await import('~/lib/db')
const db = await getDb()
return db.selectFrom('users').execute()
})
getDb() FunctionThe getDb() function in app/lib/db/index.ts handles environment detection:
async function getDatabaseUrl(): Promise<string | undefined> {
// Try process.env first (Node.js, Bun, Vite dev server)
if (typeof process !== 'undefined' && process.env?.DATABASE_URL) {
return process.env.DATABASE_URL
}
// Fall back to Cloudflare Workers env binding
try {
const { env } = await import('cloudflare:workers')
return env.DATABASE_URL
} catch {
return undefined
}
}
export async function getDb(): Promise<Kysely<Database>> {
if (!dbInstance) {
const databaseUrl = await getDatabaseUrl()
if (!databaseUrl) {
throw new Error('DATABASE_URL not set')
}
dbInstance = new Kysely<Database>({
dialect: new NeonDialect({ neon: neon(databaseUrl) }),
})
}
return dbInstance
}
export const createBatchFn = createServerFn({ method: 'POST' })
.inputValidator(schema)
.handler(async ({ data }) => {
// Dynamic import for auth
const { requireAuth } = await import('../auth/server-middleware')
const session = await requireAuth()
// Dynamic import for database
const { getDb } = await import('~/lib/db')
const db = await getDb()
// Dynamic import for utilities that need env
const { checkFarmAccess } = await import('../auth/utils')
await checkFarmAccess(session.user.id, data.farmId)
return insertBatch(db, data)
})
For seeders, migrations, and CLI scripts running in Node.js/Bun, use static imports:
// seeders/production.ts - runs in Node.js/Bun
import { db } from '~/lib/db'
await db.insertInto('users').values({...}).execute()
const { requireAuth } = await import('../auth/server-middleware')
const session = await requireAuth()
const { checkFarmAccess, getUserFarms } = await import('../auth/utils')
const hasAccess = await checkFarmAccess(userId, farmId)
const { getDb } = await import('~/lib/db')
const db = await getDb()
// ❌ Static import of db
import { db } from '~/lib/db'
// ❌ Old pattern - doesn't work
const { db } = await import('~/lib/db')
// ❌ Accessing process.env directly
const url = process.env.DATABASE_URL
Dynamic imports are cached by the JavaScript runtime. The first import loads the module, subsequent imports return the cached module. The getDb() function also maintains a singleton database instance.
neon-database - Database connection detailscloudflare-workers - Deployment environmenttanstack-start - Server function patternsxiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience