
本文介绍如何在 Vite/Rollup 构建流程中安全地排除非边缘兼容的依赖(如 mysql2),避免构建失败,同时保留开发时本地数据库连接能力,无需使用 eval 等危险方案。
本文介绍如何在 vite/rollup 构建流程中安全地排除非边缘兼容的依赖(如 `mysql2`),避免构建失败,同时保留开发时本地数据库连接能力,无需使用 `eval` 等危险方案。
在边缘运行时(如 Cloudflare Workers、Vercel Edge Functions)中,Node.js 标准库和大部分服务端驱动(如 mysql2)均不可用。但开发阶段又需便捷连接本地 MySQL 数据库进行快照备份或 CI 验证——这就要求:构建时完全剔除边缘不兼容代码,仅在开发环境动态加载。
关键在于利用构建工具的环境感知摇树(tree-shaking)能力。Vite 和 Rollup 默认会在生产构建(NODE_ENV=production)中静态分析并移除被 if (process.env.NODE_ENV === 'development') 包裹的代码块,包括其中的动态 import() 语句。这意味着:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
✅ import("mysql2/promise") 不会出现在生产产物中;
✅ 构建阶段不会尝试解析或打包 mysql2;
✅ 开发服务器(vite dev)可正常加载并使用该模块;
❌ 不需要 eval、条件导出 hack 或修改 dependencies/devDependencies 分类(Cloudflare 等平台不区分 --production,故 devDependencies 仍会被扫描)。
✅ 正确实现方式
// db.ts
let dbClient: any = null;
export async function connectToDatabase() {
if (import.meta.env.CONNECTOR === "mysql") {
// ✅ 安全:仅在开发环境执行,生产构建时整块被移除
if (process.env.NODE_ENV === "development") {
const { createConnection } = await import("mysql2/promise");
dbClient = await createConnection({
host: "localhost",
user: "root",
database: "myapp_test",
});
console.log("[DEV] Connected to local MySQL snapshot");
} else {
throw new Error("MySQL connector is disabled in production/edge");
}
} else if (import.meta.env.CONNECTOR === "planetscale") {
// ✅ 边缘安全:使用 PlanetScale 官方 edge-compatible connector
const { connect } = await import("@planetscale/database");
dbClient = connect({
url: import.meta.env.PLANETSCALE_URL,
});
}
return dbClient;
}⚠️ 注意事项
- 不要使用 import.meta.env 做运行时分支判断:import.meta.env 是构建时注入的静态值,但 import() 语句本身仍会被 Rollup/Vite 解析——除非包裹在 process.env.NODE_ENV 条件内,否则构建器无法安全剔除。
- 禁用 build.rollupOptions.treeshake.moduleSideEffects: "no":若手动配置了过于激进的摇树策略,可能误删合法的条件导入,请保持默认 true 或显式设为 "no-external"。
-
TypeScript 类型提示:为避免类型报错,可添加类型守卫或使用 // @ts-ignore(推荐前者):
if (process.env.NODE_ENV === "development") { const mysql = await import("mysql2/promise"); dbClient = await mysql.createConnection(/* ... */); }
? 总结
通过 process.env.NODE_ENV === "development" 包裹动态导入,你既能享受开发期的本地数据库调试便利,又能确保边缘构建零失败、零冗余依赖。这是 Vite/Rollup 生态的标准实践,安全、简洁、可维护——彻底告别 eval(import(...)) 这类反模式。

















