此bounty已结束。此问题的答案有资格获得+50声望奖励。赏金宽限期11小时后结束。Kostas Xafis希望引起更多的注意这个问题。
我的Web应用程序运行在边缘环境中,其中许多节点库不受支持。
我使用的是支持edge的PlanetScale连接器,但最近出于安全原因,我需要开始存储数据库快照(免责声明:在此决定之前,没有数据库受到损害.....)+快速CI更容易。
要连接到我的本地数据库快照,我通常会使用mysql2。但问题是mysql2包不是edge兼容的,因此它的构建步骤失败了。
从逻辑上讲,我不希望边缘环境访问mysql连接器,我尝试像这样内联import
连接器:
...
let { CONNECTOR } = await import.meta.env
if (CONNECTOR === "mysql") {
const mysql = await import("mysql2/promise");
}
...
不幸的是,这也不起作用,并没有通过构建步骤。
我最后一个但非常非常错误的方法是这个令人憎恶的方法:
...
let { CONNECTOR } = await import.meta.env
if (CONNECTOR === "mysql") {
const mysql = await eval(`import("mysql2/promise")`);
}
...
虽然我从来没有对我的代码感到如此羞愧,但这令人惊讶地奏效了。它确实通过了构建步骤,在我的开发环境中使用它时也工作得很好。
我已经修修补补了一点与汇总和vite配置无济于事。有没有什么方法可以在没有eval
的情况下实现同样的目标?
请注意,将其作为开发依赖项移动也不会有帮助,因为Cloudflare不会传递--production
标志,并且无论如何都可能在构建时抛出错误
1条答案
按热度按时间qxsslcnc1#
如果你直接使用
rollup
或者在vite
内部使用,你应该能够检查process.env.NODE_ENV
,使某些代码只在开发环境中工作:在生产构建中应该删除此块,并且不应该有
import
。