在"开始"部分,我们看到 Deno 可以执行来自 URL 的脚本。与浏览器 JavaScript 一样,Deno 可以直接从 URL 导入库。此示例使用 URL 导入断言库:
test.ts
import { assertEquals } from "https://deno.land/std@0.95.0/testing/asserts.ts";
assertEquals("hello", "hello");
assertEquals("world", "world");
console.log("Asserted! ✓");
尝试运行它:
$ deno run test.ts
Compile file:///mnt/f9/Projects/github.com/denoland/deno/docs/test.ts
Download https://deno.land/std@0.95.0/testing/asserts.ts
Download https://deno.land/std@0.95.0/fmt/colors.ts
Download https://deno.land/std@0.95.0/testing/diff.ts
Asserted! ✓
请注意,我们不必为此程序提供标志,但它访问网络。运行时具有下载导入并缓存到磁盘的特殊访问权限。--allow-net
Deno 将远程导入缓存到环境变量指定的特殊目录中。如果不指定,则会默认为系统缓存目录。下次运行程序时,不会进行下载。如果程序没有改变,它也不会被重新编译。默认目录是:DENO_DIR``DENO_DIR
- Linux/Redox:
$XDG_CACHE_HOME/deno
或$HOME/.cache/deno
- Windows:
%LOCALAPPDATA%/deno
(%LOCALAPPDATA%
=FOLDERID_LocalAppData
) - macOS:
$HOME/Library/Caches/deno
- 如果某事失败了,它就会回落到
$HOME/.deno
常见问题
如何导入模块的特定版本?
在URL中指定版本。例如,此 URL 完全指定正在运行的代码:.https://unpkg.com/liltest@0.0.5/dist/liltest.js
到处导入网址似乎很笨拙。
如果其中一个网址链接到一个微妙的不同版本的库呢?
在大型项目中,在任何地方维护网址都不容易出错吗?
解决方案是在中央文件中导入和转口外部库(其用途与节点文件相同)。例如,假设您在大型项目中使用了上述断言库。您可以创建一个输出第三方代码的文件,而不是随处导入:deps.ts``package.json``"https://deno.land/std@0.95.0/testing/asserts.ts"``deps.ts
deps.ts
export {
assert,
assertEquals,
assertStrContains,
} from "https://deno.land/std@0.95.0/testing/asserts.ts";
在整个相同的项目中,您可以从该项目导入并避免多次引用相同的URL:deps.ts
import { assertEquals, runTests, test } from "./deps.ts";
此设计规避了包管理软件、集中代码存储库和多余文件格式产生的大量复杂性。
如何信任可能会更改的网址?
通过使用锁定文件(带有命令行标志),您可以确保从 URL 中拉出的代码与初始开发期间相同。你可以在这里了解更多关于这一点。--lock
但是,如果URL的主机出现问题,该怎么办?源将不可用。
与上述情况一样,这是任何远程依赖系统所面临的问题。依靠外部服务器便于开发,但生产脆弱。生产软件应始终供应商其依赖关系。在节点中,这是通过检查源控制来完成的。在 Deno 中,这是通过在运行时指向某些项目本地目录,并同样将该目录签入源控制来完成的:node_modules``$DENO_DIR
# Download the dependencies.
DENO_DIR=./deno_dir deno cache src/deps.ts
# Make sure the variable is set for any command which invokes the cache.
DENO_DIR=./deno_dir deno test src
# Check the directory into source control.
git add -u deno_dir
git commit