# @azure-net/kit 中文文档

规范地址：https://npmcn.com/package/%40azure-net/kit/

版本：6\.0\.0
npm 元数据更新时间：2026-11-01T07:31:38.223Z
中文译文更新时间：2026-11-07T18:13:28.512Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40azure-net/kit
原文对照：https://npmcn.com/package/%40azure-net/kit/?lang=original
项目主页：https://github.com/Pixel1917/azure-net-kit
源码仓库：https://github.com/Pixel1917/azure-net-kit

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：307 kB，148 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：1 个
- peer 依赖：svelte \>=5\.57\.1，@sveltejs/kit \>=3\.0\.0
- 首次发布：2025-06-21T21:06:33.182Z
- 最新版本发布：2026-11-01T07:31:38.063Z
- 近 30 天下载量：3248（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：144（近 12 个月 63 个）

## 中文简介

作为Azure-net生态系统的一部分开发的通用工具包和图书馆收藏

## 安装

```sh
npm install @azure-net/kit
```

也可以使用：`pnpm add @azure-net/kit`、`yarn add @azure-net/kit`、`bun add @azure-net/kit`

## README

# 欢迎光临 **@azure-net/ kit (英语)**

#### [文档](https://svelte.kit.azure-net.ru/)

## 第6版整合

配置 `AzureNetPlugin()` 从 `@azure-net/kit/plugin` 和维特的斯维尔特基特一起, 然后导出 `{ register }` 从 `createApp(...)` 内 `src/program.ts`。 。 。 . 打电话 `register()` root布局初始化时同步. `useClient` 可能 同步:同步安装了导航订阅,以及 中间软件在 an `await` 仅从此开始适用。 处理 如果客户端初始化失败, 返回的保证 。 客户端中间软件本身 必须保持同步.

插件只提供虚拟钩. 它不创建或重写页面/显示 模块。 手动 `hooks.server`, (中文(简体) ), `hooks.client` 财务报告和审定财务报表 `hooks` 文件被禁止. 初始请求状态通过斯韦尔特可水分一次被水分;后期导航为客户端所拥有.

`program.ts` 通用: 仅输入静态服务器并不安全 因为它在内部使用 `useServer`。使用明确的构建时浏览器守护 并保留SvelteKit的构建检查.

### 应用结构

```text
src/app/
  Contexts/{Orders,Identity,SharedKernel}/
    Domain/{Entities,Ports,Enums}
    Infrastructure/Repositories
    Application/UseCases
  Presentation/{Admin,Public,Shared}/
    Ui/
    Scopes/
    Shell/
  Platform/
    Foundation/{Datasource,Response,Schema,DI}
    Bootstrap/{Routes,Localization}
```

没有工作空间, `Ui`, (中文(简体) ), `Scopes` 财务报告和审定财务报表 `Shell` 直接坐在楼下 `Presentation`。 。 。 . 中央移民局住在这里 `Platform/Foundation/DI/ApplicationProvider.ts`. 背景可能 导入 `SharedKernel`但互不相见 演示范围可以构成任何 环境。 工作空间可能导入 `Shared`但互不相见.

\* 边界提供者按安保部门改革请求缓存其代理、登记和服务, 并非全球范围。 浏览器实例会缓存到清理为止 。 工厂和 `boot` 是同步的. `await cleanupProvider(name)` 明确处置即时 服务并重置缓存;请求补全不会自动引用.

单独安装 CLI `npm i -D @azure-net/cli`。它的交火工具命令 配置 Pretier 不安装承诺包 . `azure-net commit` 承诺 分阶段修改; `azure-net push` 检查,阶段,承诺和推. `--no-check` 跳过检查。 审查 `.gitignore` 开始之前.

## 类导师 助动器

导入 `createAsyncResource` 财务报告和审定财务报表 `createAsyncAction` 直接从 `@azure-net/kit/delivery`。帮助者执行一次行动并提供支持 `beforeSend`, (中文(简体) ), `onSuccess`, (中文(简体) ), `onError` 财务报告和审定财务报表 `fallbackResponse`4\. 额外资源 `reject`。 。 。 . Schema 失败由本地转换为 `error.validation`。没有全球 错误解析器, `useAzureNetKitError`,或帮助级重试。 被丢弃的例外 `onSuccess` 或者说 `onError` 宣传没有改变,没有重放动作.

```ts
import { RegisterProvider, createAsyncResource } from '@azure-net/kit/delivery';
import { ApplicationProvider } from '#platform/Foundation/DI';
import type { OrdersUseCases } from '#contexts/Orders/Application/UseCases/OrdersUseCases';

export class OrdersPresenter {
    constructor(private readonly useCases: OrdersUseCases) {}

    collection() {
        return createAsyncResource(() => this.useCases.collection());
    }
}

export const useOrdersPresenter = RegisterProvider(
    () => {
        const { Orders } = ApplicationProvider();
        return new OrdersPresenter(Orders);
    },
    { lifecycle: 'scoped', bindMethods: true };
});
```

打电话 `useOrdersPresenter()` 在组件初始化时,而不是在模块范围. 登记本身在模块范围是安全的,不能解决依赖性问题. `RegisterProvider` 返回实际的类实例,没有代理。 可选 第二个参数是一个选项对象: `{ lifecycle?: ..., bindMethods?: ... }`。 。 。 . 默认为 `lifecycle: 'scoped'` 财务报告和审定财务报表 `bindMethods: false`。旧的字符串参数 不再支持。 由于装订已禁用,方法和财产描述符 一直没动过.

使用 `bindMethods: true` 以绑定函数值数据属性,包括继承 方法,或 `bindMethods: ['collection']` 以选择打入的方法名称。 绑定运行 只有在工厂返回后,每个新建实例一次。 访问者是 从未评估或替换,包括Svelte rune访问器。 建筑师和 原型方法被排除在外。 选定的访问器( 甚至有一个返回 a) 函数),缺少方法,或者保护属性抛出而不是默默地失败. TypeScript 无法区分函数返回获取器与方法,所以 访问器检查也发生在运行时 .

方法引用在绑定后是稳定的. 无法冻结/ 无法扩展的情况 接受继承的约束方法。 任意代理和异地内置物体 不支持约束性目标。 函数值字段也与 `true`· ; 如果实例中包含组件构造器或其他可调用设备,则使用明确的列表 依赖性。 没有全局缓存保留实例或约束函数 。 约束没有 追溯适用于在建造过程中捕获的回调或后来被替换的方法. 使用 Svelte 运算符的类 `$state` 必须在 `.svelte.ts` 模块 (或Svelte组件内申报),非常规 `.ts` 文档.

| 生命周期 | 服务器 | 浏览器 |
| --- | --- | --- |
| `scoped` (默认) | 每项请求每次登记一次 | 每个呼叫的新实例 |
| `transient` | 每个呼叫的新实例 | 每个呼叫的新实例 |
| `singleton` | 每项请求每次登记一次 | 每次登记一次 |

服务器缓存要求 `AzureNetPlugin` 请求上下文并失败 在外边。 没有全过程服务器单通. 请求缓存有弱点 键,不保留已完成的请求。 登记不需要姓名, 斯维尔特语上下文,水合,或状态序列化. 工厂召回必须 同步; 递归性构造被拒绝 .

此 API 不拥有效果、 订阅、 定时器或 `dispose()`保留 在组件寿命实例中组件自有效果; 缓存浏览器单通 不得依赖要求它的第一个组件所拥有的效果。 安全部门改革 孤立不会将状态序列化到浏览器,也不能保护可变 模块级状态被用户工厂捕获.

**@azure-net/ kit (英语)** 是一个通用的工具包和图书馆藏书,作为《公约》的一部分 **阿苏雷网** 生态系统。 其设计旨在加快现代应用开发,减少锅炉板码,并维持统一的工程架构.

## 这是什么?

**@azure-net/ kit (英语)** 不仅仅是收集公用事业或部件。 这是完整的 **结构** (Azure-net architecture) 基于 **DDD (域- 驱动设计)** 原则,帮助您建立结构清晰的可扩展和可维护的项目.

## 包括什么内容?

-   **反应状态类** 请求同位化服务器实例和浏览器单通 `RegisterProvider`。 。 。 .
-   **本地化和翻译**:内置的基于 rune 的i18n 有请求范围 SSR 实例. 没有边缘或外部翻译依赖性.
-   **大型公用事业** 用于文本、对象、日期和共同任务.
-   **数据验证** ——方便规则和验证人.
-   **可重复使用的基础抽象** —— 说 `Repositories`, (中文(简体) ), `Services`, (中文(简体) ), `Providers`,以及 `Datasources` 用于快速设置和再利用.
-   **统一的架构办法** ——这套方案提供了坚实的项目结构,有助于实施一致的发展标准.

## 为什么用它?

通过使用 **@azure-net/ kit (英语)**,您可以得到一个现成的项目框架:

-   减少锅炉板代码,
-   加速发展,
-   简化测试,
-   支持一个明确和可预测的架构.

这对中大规模应用的团队工作特别有用.

## {\\fn华文楷体\\fs16\\1cHE0E0E0}学习更多

在这个指南中,你会发现:

-   分步设置和配置指令.
-   建筑图案的详细解释.
-   使用内置商店和翻译的例子.
-   组织守则的建议 `Repositories`, (中文(简体) ), `Services`,以及 `Datasources`。 。 。 .

## 开始吧

准备潜入吗? 看看这个 [文档](https://svelte.kit.azure-net.ru/) 并开始构建你的应用 更快和更可靠 **阿苏雷网**。 。 。 .

## 初始状态和 `useBoot`

`AzureNetPlugin()` 拥有一个工具包-本地Async LocalStorage范围. 这不取决于 边缘,串行存储,注入响应脚本或创建虚拟路由模块. 本版本中没有边缘商店/介绍出口或devtools出口. `RequestContext.current()` 仅曝光 `event` 财务报告和审定财务报表 `state`中,只有服务器,而且 在活动请求外抛出。 内部的DI/ERROR/生命周期缓存是私人的.

可转让状态 `src/app.d.ts` (优先选择CSR的可选字段):

```ts
import type { IUser } from '#contexts/Identity/Domain';
declare global {
    namespace App {
        interface RequestContextState {
            currentUser?: IUser | null;
        }
    }
}
export {};
```

```ts
import { createApp, ServerMiddlewareManager } from '@azure-net/kit';
import { RequestContext } from '@azure-net/kit/server-context';

export const { register } = createApp((app) => {
 app.useServer(async ({ event, resolve }) => {
            await new ServerMiddlewareManager([ServerAuth]).execute();
            return resolve(event);
        });
 app.useBoot(({ state }) => {
            useCurrentUser().setUser(state.currentUser ?? null);
        })
);
```

配置回调同步. 每个 `app.useX(...)` 返回时 `void`· ; 包含单独语句的注册钩,不连锁或 `return app`。 。 。 . 重复的注册和注册在召回完成后进行. 虎克处决仍然遵循框架生命周期,而不是登记令. 支持Aync工作的钩子保留着现有的Aync合同.

在根布局调用中 `register()` 在解决演讲者或州级课程之前. `useBoot` 同步运行,每服务器请求渲染一次,每次运行一次 浏览器应用程序初始化,在客户端生命周期回调之前. 等待所有服务器 国家准备前 `resolve`。不要在 翻译。 客户端导航和重复寄存器调用不会使状态回水. `useClientInit` 运行得更早,不能依赖这个快照。 无公司社会责任 接收 SSR 快照 `{}`; 初始化默认并明确获取缺失数据. 仅发布安全的 DTO, 不发布任何符号或整个请求/ 本地文件 。 个性化 HTML 不得公开缓存。 类,功能和服务不序列化.

Svelte 目前需要 Aync 模式用于 `hydratable`数字 :

```ts
sveltekit({ compilerOptions: { experimental: { async: true } } });
```

保持应用程序的 CSP 配置正确; Svelte 管理传输 剧本与连载. 工具包不使用自定义 HTML 解析器 .

## DI 名称

`createBoundaryProvider` 改为: `CreateServiceContainer` (无相容性别名):

```ts
const ApplicationProvider = CreateServiceContainer('ApplicationProvider', {
    register: () => ({ Users: () => new UsersUseCases(repository) })
});
const { Users } = ApplicationProvider();
```

进入器仍然懒惰、同步和按请求范围对安保部门改革进行审查. `RegisterProvider` 单个级工厂的注册; `singleton` 表示一个浏览器实例, 但是 服务器上每个请求一个实例,从来不是一个服务器进程单子.

内建i18n:见: [页:1](https://npmcn.com/package/%40azure-net/kit/I18N.md)登记a `new TranslationManager(options)` 结束 `app.useTranslations(manager)`. 服务器准备,地语水合和客户端词典加载在相应的用户钩之前自动运行. 不需要单独的翻译包或人工生命周期电话.

## 同步 SSR 水分

仅限客户端的信号保持同步. 用稳定的非空密钥选择 SSR :

```svelte
<script lang="ts">
    import { createAsyncSignal } from '@azure-net/kit';

    const result = await createAsyncSignal(() => loadProfile(), {
        server: true,
        key: 'profile:current-user'
    });
</script>

<p>{result.response?.name}</p>
<button onclick={() => result.refresh()}>Refresh</button>
```

在组件初始化时使用启用的 Svelte 实验 Async 调用 . 斯维尔特的 `hydratable` 将初始序列结果转移给浏览器, 用于不重复请求的重用; 之后的刷新会正常执行. 没有模块全局服务器请求状态 。 处理者必须同时工作 环境。 密钥必须匹配整个SSF/水分,并区分请求输入.

`beforeSend` 只运行实际请求; 成功/错误回调和 `ready` 解决办法适用于双方。 请求错误会生成错误状态信号 . `immediate: false` 保持信号闲置并禁用初始水分. 批次 工厂保持同步,明确拒绝 `server: true` 检查类型和 运行时间; 使用单个等待的服务器信号 .

见 [同步细节](https://npmcn.com/package/%40azure-net/kit/src/lib/svelte/async-signal/README.md) 寿命周期, 序列化,出错,取消,CSP,和批发行为.

## SvelteKit 3 钩子和阶级中端软件

错误回调使用本地受到歧视 `CaughtError` 合同来源 `@sveltejs/kit/hooks`。 。 。 . `status` 财务报告和审定财务报表 `message` 上层不再添加. 对于 `kind: 'app'`, (中文(简体) ), `'framework'` 或者说 `'validation'`读取 `error.status` 财务报告和审定财务报表 `error.message`用于 `kind: 'unknown'`, (中文(简体) ), `error` 遗 物 `unknown`: 缩小它之前 登录,而不将其潜在的私人信息还给客户。 验证 问题只存在于 `'validation'` 树枝。 返回时 `{ status, message }` 以覆盖公共响应,或者不返回任何保留 SvelteKit 默认值. 被除名者 `handleValidationError` 钩子没有生成 .

```ts
import { RemoteLogger } from '@azure-net/kit';

app.useServerError(({ kind, error }) => {
    if (kind === 'unknown') {
        RemoteLogger.log(error, {});
        return { status: 500, message: 'Internal Error' };
    }
    return error;
});
```

中间软件阵列现在包含 **构造器**,而不是函数或已有实例. 构造者必须接受任何必要的参数。 新建实例 只有在每次请求/导航时,才进行。 解决依赖关系 在该实例中,不输入模块级特定请求变量.

```ts
import {
    ServerMiddlewareManager,
    ClientMiddlewareManager,
    type IServerMiddleware,
    type ServerMiddlewareContext,
    type IClientMiddleware,
    type ClientMiddlewareContext
} from '@azure-net/kit';
import { beforeNavigate } from '$app/navigation';

class ServerAuth implements IServerMiddleware {
    async execute({ event, next }: ServerMiddlewareContext) {
        if (!event.cookies.get('session')) return next('/login', 303);
        next();
    }
}

class ClientGuard implements IClientMiddleware {
    execute({ next, to, navigation }: ClientMiddlewareContext): undefined {
        if (navigation?.shallow) return next();
        if (to.pathname === '/private') return next('/login', { replace: true });
        return next();
    }
}

const serverMiddlewares = new ServerMiddlewareManager([ServerAuth]);
const clientMiddlewares = new ClientMiddlewareManager([ClientGuard]);

app
    .useServer(async ({ event, resolve }) => {
        await serverMiddlewares.execute();
        return resolve(event);
    })
    .useClient(() => {
        beforeNavigate((navigation) => clientMiddlewares.execute(navigation));
    });

// Run the same checks without navigating or registering another subscription.
clientMiddlewares.execute();
```

管理员快取构造器列表并保留不请求数据或中间软件例,这样可以在模块范围中声明. `ServerMiddlewareManager.execute()` 每次解决当前请求. `ClientMiddlewareManager.execute()` 使用当前页面 URL; `from` 财务报告和审定财务报表 `navigation` 在手动运行中未定义。 客户端执行是SSY期间的禁用.

`createApp` 不再注射 `useMiddlewares` 或订阅导航本身。 登记册 `beforeNavigate` 内部同步 `useClient`,在任何时间之前 `await`。手动运行不会创建取消的导航:省略 `next()` 只是停止运行。 避免从它执行的中间软件中调用管理器,包括通过HTTP恢复间接调用. 重运行一个完整的链条也会重运行分析;如果只必须同步认证状态,则使用更小的管理器.

`IMiddleware<Context, Result>` 是共同接口。 客户端 `execute` 严格 同步( e)`undefined` 返回, 通常为 `return next()`; 服务器 `execute` 能够 返回时 `void` 或者说 `Promise<void>`. 弃权 `next()` 封锁链条。 也没有 链条或容器自动处理中件所拥有的订阅 : 保持中间软件的短寿命,不要将长寿命的听众附在那里.

客户端 `next(location, options)` 财务报告和审定财务报表 `useRedirect(...).clientRedirectSettings` 使用 SvelteKit 软件 `GotoOptions` 直接 : `replace`, (中文(简体) ), `reset`, (中文(简体) ), `refreshAll`, (中文(简体) ), `shallow`, (中文(简体) ), `persistState`, (中文(简体) ), `state` 财务报告和审定财务报表 `invalidate`。客户端导航数据包括本地 `navigation` 活动。 在 Kit 3 中,浅切换也会触发导航钩; 选择 明确警卫是否应该跳过它们. `goto` 用于应用路径, 而非外部 URL;外部导航应当使用浏览器位置API.

## 组成

`CreateServiceContainer` 保持不变. `CompositionRoot` 是个懒阶级 外表上,有一个独特的符号 作为其内部容器的身份。 它可以在模块中创建 范围; `resolve()` 解析当前 SSR 请求或浏览器 缓存, 从未被构建者捕获过的请求 .

```ts
import { CompositionRoot } from '@azure-net/kit';

export const Http = new CompositionRoot({
    register: () => ({ Api: () => new ApiDatasource() })
});

export const Identity = new CompositionRoot({
    dependsOn: { Http },
    register: ({ Http }) => ({
        Account: () => new AccountUseCases(new AccountRepository(Http.Api))
    })
});

// Inside a presenter factory or an active request:
const { Account } = Identity.resolve();
```

依附者接受其他两个 `CompositionRoot` 实例和现有 `CreateServiceContainer` 进入者。 服务类型通过链子推断. 只有注册元数据包; 服务周围没有额外的代理 没有新的缓存层。 重复解决保留了现有的集装箱/服务 身份证明 如果需要明确清理,请使用 `await cleanupProvider(Identity.name)`。 。 。 . 一次宣出根来, 而不是创造新的根 每一个成分成. `name` 现在是一个符号,而不是一个可序列的字符串。 它的描述用于诊断 只; 等同描述永远不会共享缓存 。 直接通过的现有字符串密钥 改为 `CreateServiceContainer` 财务报告和审定财务报表 `cleanupProvider` 继续支持.

## HTTP 检索

属于 `HttpServiceInstance`,包括直接通过使用 案例。 没有 `retry` 选项,不重复失败的请求. `limit` 计数 其他尝试: `limit: 1` 表示最多两次HTTP尝试.

```ts
// A separate session client: no authentication recovery hooks.
const sessionHttp = new HttpServiceInstance({ prefixUrl: apiUrl });

const http = new HttpServiceInstance({
    prefixUrl: apiUrl,
    onRequest(request) {
        const token = readAccessToken();
        if (token) request.headers.set('Authorization', `Bearer ${token}`);
    },
    retry: {
        limit: 1,
        statuses: [401],
        async shouldRetry({ error }) {
            if (!isExpiredAccessToken(error.data)) return false;
            const refreshed = await sessionHttp.post('/api/auth/refresh', {
                json: { refreshToken: readRefreshToken() }
            });
            saveTokens(refreshed.data);
            return true;
        }
    }
});
```

上面的托肯帮助是应用程序定义的 。 在当前范围内读取/写入符号 请求 SSR 时,从未处于共享模块级用户状态。 坐标并行 每个会话/请求酌情刷新; 通用 HTTP 客户端不刷新 执行符号旋转或交叉协调.

-   `{ limit: N }` 重试任何失败的 HTTP 尝试, 包括网络失败 .
-   `statuses` 将重试限制在这些错误状态下; `[]` 不允许.
-   `shouldRetry` 只在状态过滤后运行,而且预算还在. 同步和同步布尔均被接受.
-   按请求 `retry` 替换整个默认策略。 使用 `{ limit: 0 }` 改为 关掉它。 没有重试策略的单独会话客户端不会继承 应用程序客户端的重试或钩子.
-   `onRequest` 在每次尝试之前运行,如此刷新的证书会被再次读取. `onResponse` 成功一次运行; `onError` 运行一次终端 HTTP 失败, 不包括成功恢复的中间故障.
-   钩子的例外(包括: `shouldRetry`宣传不再进一步 复原。 他们没有被视为另一次运输失败.
-   取消的请求和流出的请求机构永远不会被重放. 取消 还停止等待恢复;召回必须管理取消 拥有基本的工作.
-   `limit` 必须是有限的非负式安全整数。 没有隐含的重试 延迟/后退。 每次HTTP尝试都分别应用超时.

复选是所有HTTP方法的选入. 网络后不要盲目重试 错误: 服务器可能已经应用过 。 使用狭义状态/ 代码策略 或后端支持的一能键。 数字 `retry: 3` 不再支持; 写入 `retry: { limit: 3 }` 换句话说.

HTTP 钩子使用这些签名 :

```ts
retry: {
 limit: 1,
 shouldRetry: async ({ error }) => {
  // Delegate refresh to your session service with a separate HTTP client.
  return false;
 }
},
onError: ({ error, request }) => {
 // Terminal failure notification / validation mapping. No http is exposed.
}
```

这是从位置改变的突破 `onError(error, request, http)`。 。 。 . 请求级的钩子覆盖使用相同的签名. 嵌入请求使用实例 设置加上他们自己的选项,而不是外部请求的身体或信号.

停止信号停止等待起钩以及运输业务。 任意 用户承诺不能强制终止:钩子必须合作停止 自身副作用. 虎克没有隐含的超时;提供并中止一个信号给 把他们的等待时间绑住 超时处理包括运输和身体 解析,包括自定义 `doFetch`与 `responseFormat: 'body'`时结束 读取/取消该流是呼叫者的工作. 计时员/听众在成功,失败,超时和取消时被删除.

JSON 序列化错误现在拒绝在发送之前而不是默发 虚空的身体。 默认 JSON 序列器不支持循环值或 BigInt; 提供 `stringifyJson` 如果需要自定义线条格式.

删除 `http` 从 `onError` 无法防止通过被捕获的客户端重现 在关闭。 不从错误处理器启动同样的失败操作 . 也没有 `shouldRetry` 也没有 `onError` 曝光HTTP客户端. 使用单独的 会话客户端没有恢复钩子用于刷新/登录 。 适用于 HTTP 的限制 调用,而不是任意嵌入式用户代码.

## 常见问题

### @azure-net/kit 是什么？

作为Azure-net生态系统的一部分开发的通用工具包和图书馆收藏

### 如何安装 @azure-net/kit？

在项目目录运行 npm install @azure-net/kit，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：svelte（\>=5\.57\.1）、@sveltejs/kit（\>=3\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @azure-net/kit 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @azure-net/kit 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @azure-net/kit 可以商用吗？

@azure-net/kit 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @azure-net/kit 的下载量有多少？

根据 npm 官方下载统计，@azure-net/kit 在 2026/10/08 – 2026/11/06 这 30 天内被下载 3,248 次，日均约 108 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @azure-net/kit 还在维护吗？

最新版本 6\.0\.0 发布于 2026/11/01（6 天前）；至今共发布 144 个版本，其中过去 12 个月发布了 63 个；首次发布于 2025/06/22。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

