1、导入映射
为了让Deno解析像"react"
或"lodash"
这样的说明符, 需要被告知去哪里找"lodash"
是指npm模块还是是否映射到https URL上。
import lodash from "lodash";
Node和npm使用pack. json和node_modules文件夹来执行此解析。另一方面,Deno使用导入映射标准。
要使上面的import lodash from "lodash"能正常运行,请将以下内容添加到 deno.json配置文件。
{ "imports": { "lodash": "https://esm.sh/lodash@4.17.21" } }
deno. json文件是自动发现的,并充当导入映射。
这也适用于npm说明符。除了上述内容,我们还可以在deno. json配置文件中编写类似的内容:
{ "imports": { "lodash": "npm:lodash@^4.17" } }
示例-通过以下方式使用deno_std的fmt模块
deno.json
{ "imports": { "fmt/": "https://deno.land/std@0.204.0/fmt/" } }
color.ts
import { red } from "fmt/colors.ts"; console.log(red("hello world"));
示例-使用项目根目录进行绝对导入
要使用项目根目录进行绝对导入,请执行以下操作:
deno.json
{ "imports": { "/": "./", "./": "./" } }
main.ts
import { MyUtil } from "/util.ts";
这将导致从/
开始的导入说明符相对于 导入映射URL或文件路径。
覆盖导入
导入映射非常有用的另一种情况是覆盖特定模块中的导入。
假设您想覆盖从0.177.0到最新导入的所有模块中的deno_std导入,但对于https://deno.land/x/example/模块,您想使用本地patched目录中的文件。您可以通过使用导入映射中的范围来做到这一点,如下所示:
{ "imports": { "https://deno.land/std@0.177.0/": "https://deno.land/std@0.204.0/" }, "scopes": { "https://deno.land/x/example/": { "https://deno.land/std@0.177.0/": "./patched/" } } }
导入映射适用于应用
需要注意的是,导入map配置文件仅适用于Deno应用程序,而不是应用程序代码可能导入的各种库中。这让应用程序作者,对项目中包含哪些版本的库拥有最终决定权。
如果您正在开发一个库,您应该更喜欢使用管理依赖项中讨论的deps. ts模式。
2、环境变量
在Deno中有几种使用环境变量的方法:
内置 Deno.env
Deno运行时内置了对环境变量的支持。
Deno. env有getter和setter方法。这是示例用法:
Deno.env.set("FIREBASE_API_KEY", "examplekey123"); Deno.env.set("FIREBASE_AUTH_DOMAIN", "firebasedomain.com"); console.log(Deno.env.get("FIREBASE_API_KEY")); // examplekey123 console.log(Deno.env.get("FIREBASE_AUTH_DOMAIN")); // firebasedomain.com console.log(Deno.env.has("FIREBASE_AUTH_DOMAIN")); // true
.env
文件
您还可以将环境变量放在. env文件中,并在标准库中使用dotenv检索它们。
假设您有一个如下所示的. env文件:
PASSWORD=123456
要访问. env文件中的环境变量,请从标准库导入load函数
import { load } from "https://deno.land/std@0.204.0/dotenv/mod.ts"; const env = await load(); const password = env["PASSWORD"]; console.log(password); // "123456"
std/flags
Deno标准库有一个用于解析命令行参数的std/标记模块。
特殊环境变量
Deno运行时具有这些特殊的环境变量。
name | description |
DENO_AUTH_TOKENS | 从私有存储库获取远程模块时使用的bearer tokens和主机名的分号分隔列表 (e.g. abcde12345@deno.land;54321edcba@github.com ) |
DENO_TLS_CA_STORE | 以逗号分隔的顺序相关证书存储列表。 Possible values: system , mozilla . Defaults to mozilla . |
DENO_CERT | 从PEM编码文件加载证书颁发机构 |
DENO_DIR | 设置缓存目录 |
DENO_INSTALL_ROOT | 设置deno install的输出目录 (defaults to $HOME/.deno/bin ) |
DENO_REPL_HISTORY | 设置REPL历史文件路径值为空时禁用历史文件 (defaults to $DENO_DIR/deno_history.txt ) |
DENO_NO_PACKAGE_JSON | 禁用自动解析 package.json |
DENO_NO_PROMPT | 设置为禁用访问权限提示 (alternative to passing --no-prompt on invocation) |
DENO_NO_UPDATE_CHECK | 设置为禁用检查是否有更新的Deno版本可用 |
DENO_V8_FLAGS | 设置V8命令行选项 |
DENO_JOBS | 带有test子命令的并行工作数通过--parallel 标记默认为可用CPU数 |
HTTP_PROXY | HTTP请求的代理地址 (module downloads, fetch) |
HTTPS_PROXY | HTTPS请求的代理地址(module downloads, fetch) |
NPM_CONFIG_REGISTRY | 用于npm注册表的URL。 |
NO_COLOR | 设置为禁用颜色 |
NO_PROXY | 不使用代理的主机的逗号分隔列表 (module downloads, fetch) |
您还可以使用deno--help查看相同的内容。
3、调试代码
Deno支持Chrome、边和Node. js使用的V8检查器协议。这使得使用ChromeDevTools或其他支持该协议的客户端(例如VSCode)调试Deno程序成为可能。
要激活调试功能,请运行Deno,并使用--ynch-wait或--execy-brk标志。
通过--inspect标记,允许在任何时间点附加调试器,--inspect-wait标记将等待调试器附加并开始执行代码,--inspect-brk
标记将等待调试器附加并暂停第一行代码的执行。
如果你使用--inspect标记,代码将立即开始执行,如果你的程序很短,在程序完成执行之前,您可能没有足够的时间连接调试器,在这种情况下,尝试运行--inspect-wait或者--inspect-brk标记,或者在代码末尾添加延时。
Chrome Devtools
让我们尝试使用ChromeDevtools调试程序。为此,我们将使用来自std的file_server. ts,一个静态文件服务器。
使用--inspect-brk在第一行中断执行:
$ deno run --inspect-brk --allow-read --allow-net https://deno.land/std@0.204.0/http/file_server.ts
在Chromium衍生的浏览器,如谷歌Chrome或微软Edge浏览器,打开chrome://inspect,如下图所示:
单击目标旁边的Inspect,出现DevTools后,会自动跳转到断点位置:
您可能会注意到DevTools在assert_path.ts而不是file_server.ts的第一行暂停执行。这是由JavaScript中评估ES模块的方式引起的预期行为(assert_path.ts最左边、最下面依赖file_server.ts,因此首先评估它)。
接下来,在dirViewerTemplate方法中添加一个断点:
一旦我们添加了断点,DevTools就会自动打开源代码映射文件,这允许我们逐步浏览包含类型的实际源码。
现在我们已经设置了断点,我们可以恢复脚本的执行,以便我们可以检查传入的请求。点击“恢复脚本执行”按钮来执行此操作。您甚至可能需要点击两次!
运行我们的脚本后,尝试发送请求并在Devtools中检查它:
$ curl http://0.0.0.0:4507/
或者在浏览中,打开:
VSCode
该扩展提供与内置VSCode调试器的接入。您可以通过以下方式生成配置:转到运行和调试面板,单击创建launch. json文件并从可用的调试器选项中选择Deno选项。
默认情况下,配置将使用--inspect-wait标记,如果配置的Deno版本大于1.29,早于1.29的版本使用--inspect-brk标记,这可确保调试器有机会连接到您的程序并注册代码中指定的所有断点。