# @ecopages/scripts-injector 中文文档

规范地址：https://npmcn.com/package/%40ecopages/scripts-injector/

版本：0\.1\.5
npm 元数据更新时间：2026-03-04T20:16:50.690Z
中文译文更新时间：2026-11-13T06:08:22.388Z
软件包许可：未声明

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

原始 npm 页面：https://www.npmjs.com/package/%40ecopages/scripts-injector
原文对照：https://npmcn.com/package/%40ecopages/scripts-injector/?lang=original
项目主页：https://github.com/ecopages/scripts-injector#readme
源码仓库：https://github.com/ecopages/scripts-injector

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

- 包体积（解压后）：25.1 kB，6 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：typescript ^5\.0\.0
- 首次发布：2024-06-02T09:33:50.324Z
- 最新版本发布：2026-03-04T20:16:50.346Z
- 近 30 天下载量：4621（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：6（近 12 个月 4 个）

## 中文简介

脚本注射器是一个自定义元素,旨在将脚本动态地加载到您的网页中. 它提供了根据某些条件和事件加载脚本的方法.

## 安装

```sh
npm install @ecopages/scripts-injector
```

也可以使用：`pnpm add @ecopages/scripts-injector`、`yarn add @ecopages/scripts-injector`、`bun add @ecopages/scripts-injector`

## README

# 脚本喷出器

脚本注射器是一个自定义元素,旨在将脚本动态地加载到您的网页中. 它提供了根据某些条件和事件加载脚本的方法.

## 使用量

要使用脚本喷出器, 您需要将其包含在 HTML 中 :

```tsx
<scripts-injector></scripts-injector>
```

## Web 组件示例

### 装入闲置

```tsx
<scripts-injector scripts="/analytics.js" on:idle>
    <div>Content</div>
</scripts-injector>
```

### 装入交互

```tsx
<scripts-injector scripts="/heavy-chart.js" on:interaction="mouseenter,focusin">
    <button>Open chart</button>
</scripts-injector>
```

### 使用注射器地图加载

```html
<scripts-injector>
    <script type="ecopages/injector-map">
        {
            "on:idle": { "scripts": ["/_assets/tracker.js"] },
            "on:interaction": {
                "value": "click",
                "scripts": ["/_assets/heavy-ui.js"]
            }
        }
    </script>
    <div class="my-component">...</div>
</scripts-injector>
```

## 全球注射器实例( 无网络组件)

### (1) 定义全球触发图

```html
<script type="ecopages/global-injector-map">
{
    "analytics-trigger": {
        "on:idle": { "scripts": ["/_assets/tracker.js"] }
    },
    "card-trigger": {
        "on:interaction": {
            "value": "click",
            "scripts": ["/_assets/card-interactions.js"]
        }
    }
}
</script>
```

### (2) 将标准元素与 `data-eco-trigger`

```html
<div data-eco-trigger="analytics-trigger"></div>
<button data-eco-trigger="card-trigger">Open Card</button>
```

### (3) 初始化

```ts
import { initGlobalInjector } from '@ecopages/scripts-injector/global';

const injector = initGlobalInjector();

// Call after SPA route changes / page swaps when new trigger-map tags or
// new [data-eco-trigger] elements are inserted by your framework.
injector.refresh();

// Call during app teardown if needed.
injector.cleanup();
```

`initGlobalInjector()` 返回控点,使用:

-   `refresh()` - 重新绘制所有全球地图,并将任何不受约束的元素与 `data-eco-trigger`
-   `cleanup()` ——断开观察器,并禁用进一步的刷新工作

## 道具

脚本喷出器类型定义了可用于控制脚本-喷出器自定义元素的行为的属性. 以下是可用的属性 :

`"on:idle"`: 此可选布尔属性决定 DOM 准备好后是否应该加载脚本 。 譬如说, `<scripts-injector on:idle></scripts-injector>` dOM 准备好后, 立即装入脚本 .

`"on:interaction"`: 此可选属性允许您指定一系列会触发脚本加载的事件 。 可以是"touchstart, click",也可以是"mouseenter, focusin". 譬如说, `<scripts-injector on:interaction="mouseenter, focusin"></scripts-injector>` 当用户在元素上方鼠标或聚焦时,会加载脚本.

`"on:visible"`: 此可选属性可以是字符串或布尔 。 如果它是一个字符串,它应该指定一个截面观察器的根边距,当元素被看到时会加载脚本. 如果它是布尔并是真的,则当元素以默认的根边距被查看时,脚本会被加载. 譬如说, `<scripts-injector on:visible="50px 1px"></scripts-injector>` 将在元素进入视图时加载脚本,根边距为50px 1px.

`scripts`: 此属性应该是要装入的以逗号分隔的脚本字符串 。 譬如说, `<scripts-injector scripts="script1.js,script2.js"></scripts-injector>` 将载入脚本1.js和脚本2.js.

## 最新特征

### 完整事件与财产保存重放

对所有交互事件,脚本喷出器会截取初始事件,防止默认动作,加载所需的脚本,然后 **重放该事件** 并保留了所有原始财产。 这保证了用户动作永远不会丢失,即使它们在脚本被完全加载之前发生.

-   **单击事件**: 使用本地语言 `.click()` 与链接和表格的最佳兼容性
-   **鼠标事件**: 保护 `clientX`, (中文(简体) ), `clientY`, (中文(简体) ), `screenX`, (中文(简体) ), `screenY`, (中文(简体) ), `button`, (中文(简体) ), `buttons`修改键
-   **键盘事件**: 保护 `key`, (中文(简体) ), `code`, (中文(简体) ), `location`, (中文(简体) ), `repeat`修改键
-   **重点活动**: 保护 `relatedTarget`
-   **触摸活动**: 保护 `touches`, (中文(简体) ), `targetTouches`, (中文(简体) ), `changedTouches`修改键

### 种族条件预防

多个请求同一脚本的脚本注射器会协调以防止重复加载. 目前正在加载的静态注册脚本,确保即使多个注射器同时触发时,也只发出一个网络请求.

### 装入原因跟踪

装入后,元素收到 `data-load-reason` 属性表示触发负载的内容 :

-   `idle` - 装入 `on:idle`
-   `visible` - 装入 `on:visible`
-   `interaction:click`, (中文(简体) ), `interaction:mouseenter`等 - 通过特定交互事件装入

### 跟踪错误

如果有任何脚本无法加载, 元素会收到一个 `data-error` 包含逗号分隔的失败脚本 URL 的属性。 这个 `DATA_LOADED` 事件还包括: `failedScripts` 详细排列.

```tsx
// Listen for load completion with error info
document.addEventListener('data-loaded', (event) => {
    const { loadedScripts, failedScripts } = event.detail;
    if (failedScripts.length > 0) {
        console.warn('Some scripts failed to load:', failedScripts);
    }
});
```

## 典型用途

本段为自定义元素提供了一个标准用例. 脚本的设计是当用户通过鼠标条目或焦点事件与其互动时加载. 如果有多个脚本注射器使用相同的脚本,则只有第一个会执行负载. 这是因为一旦一个脚本被加载,所有脚本注射器都会被通知,并随后去除脚本的加载责任.

```tsx
<scripts-injector on:interaction="mouseenter,focusin" scripts={['path/to/my/element']}>
    <lit-counter class="lit-counter" count={8}></lit-counter>
</scripts-injector>
```

## 替代用法: 多调试器配置

避免深陷其中 `<scripts-injector>` 当单个组件内不同的脚本需要不同的触发器时,可以使用JSON映射配置方法. 这样您就可以平整DOM结构,并同时在单个注射器元素上配置多个触发器:

```html
<scripts-injector>
    <script type="ecopages/injector-map">
        {
            "on:idle": { "scripts": ["/_assets/tracker.js"] },
            "on:interaction": {
                "value": "click",
                "scripts": ["/_assets/heavy-ui.js"]
            }
        }
    </script>
    <!-- Component Content -->
    <div class="my-component">...</div>
</scripts-injector>
```

## 支持的活动

这个 `on:interaction` 道克支持广泛的 DOM 事件,定义于 `InteractionEvent`。 。 。 .

-   **鼠标 :** `click`, (中文(简体) ), `dblclick`, (中文(简体) ), `mousedown`, (中文(简体) ), `mouseup`, (中文(简体) ), `mouseenter`, (中文(简体) ), `mouseleave`, (中文(简体) ), `mousemove`, (中文(简体) ), `mouseover`, (中文(简体) ), `mouseout`
-   **触觉 :** `touchstart`, (中文(简体) ), `touchend`, (中文(简体) ), `touchmove`, (中文(简体) ), `touchcancel`
-   **重点:** `focus`, (中文(简体) ), `blur`, (中文(简体) ), `focusin`, (中文(简体) ), `focusout`
-   **键盘 :** `keydown`, (中文(简体) ), `keypress`, (中文(简体) ), `keyup`
-   **表单 :** `input`, (中文(简体) ), `change`, (中文(简体) ), `submit`
-   **用户:** `scroll`, (中文(简体) ), `resize`

## 数据属性

完成脚本加载后,元素上设置了以下属性:

| 属性 | 说明 |
| --- | --- |
| `data-loaded` | 装入( 或尝试) 所有脚本时显示 |
| `data-load-reason` | 导致脚本加载的触发器( E)`idle`, (中文(简体) ), `visible`, (中文(简体) ), `interaction:<event>`(中文(简体) ) |
| `data-error` | 以逗号分隔的未加载脚本 URL 列表( 仅在出错时) |

## 灵感

无可否认,这在很大程度上受到 [11t/is-陆地](https://github.com/11ty/is-land), (中文(简体) ), [Astro岛](https://docs.astro.build/en/concepts/islands/) 以及"组件岛"概念,最初由埃特西的前端建筑师凯蒂·赛勒-米勒所引入.

## 常见问题

### @ecopages/scripts-injector 是什么？

脚本注射器是一个自定义元素,旨在将脚本动态地加载到您的网页中\. 它提供了根据某些条件和事件加载脚本的方法\.

### 如何安装 @ecopages/scripts-injector？

在项目目录运行 npm install @ecopages/scripts-injector，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：typescript（^5\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @ecopages/scripts-injector 支持 TypeScript 吗？

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

### @ecopages/scripts-injector 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @ecopages/scripts-injector 可以商用吗？

@ecopages/scripts-injector 使用 未声明 许可。package\.json 没有声明许可证。没有许可证的代码默认保留全部权利，商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括，不构成法律意见，请以许可原文为准。

### @ecopages/scripts-injector 的下载量有多少？

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

### @ecopages/scripts-injector 还在维护吗？

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

