javascript 从生成步骤中排除节点包

q8l4jmvw  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(79)

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标志,并且无论如何都可能在构建时抛出错误

qxsslcnc

qxsslcnc1#

如果你直接使用rollup或者在vite内部使用,你应该能够检查process.env.NODE_ENV,使某些代码只在开发环境中工作:

if (process.env.NODE_ENV === "development") {
  const mysql = await import("mysql2/promise");
}

在生产构建中应该删除此块,并且不应该有import

相关问题