156 个版本 (79 个重大变更)

新增 0.81.3 2024年8月21日
0.81.0 2024年7月31日
0.69.10 2024年3月29日
0.62.3 2023年12月15日
0.12.0 2021年11月14日

#27WebAssembly

Download history 2185/week @ 2024-05-02 1998/week @ 2024-05-09 1948/week @ 2024-05-16 1716/week @ 2024-05-23 1488/week @ 2024-05-30 1352/week @ 2024-06-06 1757/week @ 2024-06-13 1899/week @ 2024-06-20 1239/week @ 2024-06-27 1345/week @ 2024-07-04 1558/week @ 2024-07-11 1033/week @ 2024-07-18 2108/week @ 2024-07-25 1607/week @ 2024-08-01 1479/week @ 2024-08-08 1145/week @ 2024-08-15

6,554 每月下载量
19 个crate中 使用 (17个直接使用)

MIT 许可证

4MB
25K SLoC

deno_graph

JSR Build Status - Cirrus Twitter handle Discord Chat

Deno CLI的模块图/依赖逻辑。

此仓库是一个Rust crate,提供了构建模块图的基础代码,遵循Deno CLI的模块解析逻辑。它还提供了一个Web Assembly接口,使得可以从JavaScript/TypeScript中利用逻辑,在Deno CLI之外。

Rust使用

ModuleGraph::新增(...)

ModuleGraph::new(GraphKind::All) 创建一个新的模块图。从那里,你可以使用 .build(...).await 方法添加根节点。该 build 方法需要图根模块指定符/URL和 source::Loader 特质的实现。它还可以选择实现 source::Resolver 特质。它将加载并解析根模块及其所有依赖项,异步返回一个结果 ModuleGraph

source::Loader 特质

实现此特性需要实现load()方法,并且可选地实现get_cache_into()方法。load()方法返回一个包含请求的模块指定符和结果加载响应的future。这允许模块图处理重定向、错误条件和本地及远程内容。

get_cache_info()是API,用于暴露关于模块指定符的额外元数据,因为它们驻留在缓存中,因此可以作为模块图信息的一部分。当构建图时,该方法将对图中的每个解析的模块进行调用,以查看是否提供了附加信息。

source::Resolver特性

此特性“替换”了模块图的默认解析逻辑。它的目的是允许像导入映射和替代解析逻辑这样的概念“插入”到模块图中。

它有两个方法,resolveresolve_types,这两个方法都有默认实现。resolve接受来自源和引用指定符的字符串指定符,并期望返回一个包含解析指定符的结果。

resolve_types接受一个指定符,并期望返回一个包含可选的模块指定符和可选的类型源范围的结果。例如,如果您尝试表示来自package.json文件的"typings"字段,当您在resolve_types上收到对包主模块的请求时,您将响应绝对指定符和类型,以及一个范围,该范围表示指向package.json的文件URL及其指定的范围。包括范围对于允许来自图的错误指示“依赖关系来自何处”很有用。

source::MemoryLoader结构

MemoryLoader是一个结构,它实现了source::Loader特性,并且设计得可以这样,即可以将模块缓存在内存中,以便在构建模块图时进行解析和检索。这对于测试目的或在模块内容已可用且动态加载它们不实际或不希望的情况下很有用。

一个最小示例看起来像这样

use deno_graph::ModuleSpecifier;
use deno_graph::ModuleGraph;
use deno_graph::GraphKind;
use deno_graph::source::MemoryLoader;
use deno_graph::source::Source;
use futures::executor::block_on;

fn main() {
  let mut loader = MemoryLoader::new(
    vec![
      (
        "file:///test.ts",
        Source::Module {
          specifier: "file:///test.ts",
          maybe_headers: None,
          content: "import * as a from \"./a.ts\";"
        }
      ),
      (
        "file:///a.ts",
        Source::Module {
          specifier: "file:///a.ts",
          maybe_headers: None,
          content: "export const a = \"a\";",
        }
      ),
    ],
    Vec::new(),
  );
  let roots = vec![ModuleSpecifier::parse("file:///test.ts").unwrap()];
  let future = async move {
    let mut graph = ModuleGraph::new(GraphKind::All);
    graph.build(roots, &loader, Default::default()).await;
    println!("{:#?}", graph);
  };
  block_on(future)
}

从Deno CLI或部署使用

js/README.md

构建Web Assembly

构建脚本(_build.ts)需要安装并可在路径中找到Deno CLI。如果它是,则以下命令应该“正常工作”

> deno task build

贡献

我们感谢您的帮助!

要贡献,请阅读我们的贡献说明

此存储库包含.devcontainer元数据,这将允许构建一个开发容器,其中包含所有开发先决条件,从而使贡献更容易。

依赖关系

~16–29MB
~531K SLoC