Deno打包时如何替换代码中的Deno.env调用
Deno打包时静态替换环境变量问题解答
Deno 内置的打包逻辑默认不会自动将构建阶段传入的环境变量静态替换到代码中,你遇到的现象是符合预期的:
deno bundle执行时加的--allow-env是运行时权限配置,仅用于授予代码运行阶段读取环境变量的权限,不会触发构建阶段的代码替换逻辑- 浏览器环境不存在
Deno全局对象,未做替换的打包产物直接在浏览器运行会直接抛出Deno is not defined异常
实现静态替换的方法
内置方案:使用 --define 构建参数
Deno 原生构建、打包命令支持 --define 参数,可在构建阶段将指定表达式静态替换为常量值,不需要引入第三方工具就能实现你的需求。
你的示例场景源码如下:
// mod.ts console.log(Deno.env.get('MY_VAR'));
在终端执行如下打包命令即可完成静态注入:
MY_VAR=hello deno bundle \ --define "Deno.env.get=(key) => key === 'MY_VAR' ? 'hello' : undefined" \ mod.ts bundle.js
打包完成后,产物中对应的代码会被静态优化为你预期的形式:
// bundle.js 对应代码片段 console.log("hello");
如果需要替换多个环境变量,可以提前写简单的逻辑批量生成--define的配置内容,不需要手动逐个声明。
简易替代方案
如果场景比较简单,也可以在打包前先读取构建环境的变量值,通过正则匹配把源码中Deno.env.get('对应键名')格式的调用直接替换为字面量值,再执行打包流程即可。
注意:构建阶段传入的环境变量存在于你执行打包命令的本地环境,和最终用户打开网页的浏览器环境完全隔离,不可能在浏览器运行时再读取到你本地终端传入的变量,必须在构建阶段完成值的注入。
内容的提问来源于stack exchange,提问作者kemicofa
相关产品推荐
相关产品推荐

