@cloudcannon/editable-regions

中文文档
0.0.22发布于 2026/10/15MITTypeScriptESM + CJS构建来源已验证近 30 天下载 1.3万

CloudCannon CMS的视觉编辑.

中文使用文档
文档目录30 节
  1. 目录
  2. 安装
  3. 快速启动
  4. 天体
  5. 十一号
  6. 乌戈
  7. 反应
  8. 丝绒
  9. 阴道
  10. 下一个.js
  11. 斯维尔特基特
  12. 坚果
  13. 可编辑区域如何工作
  14. 定义可编辑区域
  15. 向可编辑区域传递值
  16. 价值区域
  17. 文本
  18. 图像
  19. 结构区域
  20. 构成部分
  21. 阵列和阵列项目
  22. 道具选择者如何组成
  23. 页面大楼
  24. 参考外部数据
  25. 文学道具
  26. 来源区域
  27. 他们如何工作
  28. 限制
  29. 什么时候用
  30. 选项

可编辑区域

图像编辑 云冈 CMS (中文(简体) ).

version badge

可编辑区域允许您标记带有属性(或网络组件)的 HTML 输出, 向 CloudCannon 的可视化编辑器精确显示可编辑的内容: 文本、 图像、 阵列、 组件和硬码源标记 。 编辑重新将预览直播,并将您的更改写回结构化的数据或源文件.

目录

关于特定集成设置和选项检查,专用文件页:

安装

从 npm 安装软件包 :

npm install @cloudcannon/editable-regions

对于雨果站点,在被固定的版本中安装模块:

hugo mod get github.com/CloudCannon/editable-regions@<version>

快速启动

天体

添加集成到 astro.config.mjs数字 :

import { defineConfig } from "astro/config";
import editableRegions from "@cloudcannon/editable-regions/astro-integration";

export default defineConfig({
  integrations: [editableRegions()],
});

创建一个注册脚本,用于导入和注册您想要运行的每个组件 :

// src/scripts/register-components.js
import { registerAstroComponent } from "@cloudcannon/editable-regions/astro";
import CTA from "../components/CTA.astro";

registerAstroComponent("cta", CTA);

从您的布局装入脚本 :

<script>
  // Check that the page is loaded in CloudCannon before loading your Editable Components
  if (window.inEditorMode) {
    import("../scripts/register-components.js").catch((error) => {
      console.warn("Failed to load CloudCannon component registration:", error);
    });
  }
</script>

如果您的 Astro 组件包含 React, Svelte, 或 Vue 组件, 请将匹配的副作用渲染器导入到相同的注册文件中 :

import "@cloudcannon/editable-regions/astro-react-renderer";
import "@cloudcannon/editable-regions/astro-svelte-renderer";
import "@cloudcannon/editable-regions/astro-vue-renderer";

然后标记您的模板 :

<h1 data-editable="text" data-prop="title">{title}</h1>
<editable-component data-component="cta" data-prop="cta">
  <CTA {...cta} />
</editable-component>

十一号

将插件添加到 eleventy.config.mjs数字 :

import editableRegions from "@cloudcannon/editable-regions/eleventy";

export default function (eleventyConfig) {
  eleventyConfig.addPlugin(editableRegions);

  return {
    dir: { input: "src", includes: "_includes", output: "_site" },
  };
}

在普通JS配置上,使用需要替换:

const editableRegions = require("@cloudcannon/editable-regions/eleventy");

module.exports = function (eleventyConfig) {
  eleventyConfig.addPlugin(editableRegions);

  return {
    dir: { input: "src", includes: "_includes", output: "_site" },
  };
};

每次构建后, 插件都会发出 register-components.js 输入输出目录、包含客户端液体引擎的捆绑、过滤器/短码/tag(自动从您真实的"十一"配置中取出)以及包含模板的捆绑。 装入您的布局 :

<script>
  // Check that the page is loaded in CloudCannon before loading your Editable Components
  if (window.inEditorMode) {
    import("/register-components.js").catch((error) => {
      console.warn("Failed to load CloudCannon component registration:", error);
    });
  }
</script>

插件自动将您的液体登记为组件 .

<div data-editable="component" data-component="author-card" data-prop-author-name="authorName">
  {% include "author-card", author-name: authorName %}
</div>

插件还注册一个 includeWith 用于将道具对象扩散到一个对象的标记包括:

<div data-editable="component" data-component="post-meta" data-prop="postMeta">
  {% includeWith "post-meta", postMeta %}
</div>

乌戈

将软件包安装为雨果模块 :

# hugo.toml
[module]
  [[module.imports]]
    path = "github.com/CloudCannon/editable-regions"

将部分包含在您的网站上 <head>数字 :

{{ partial "editable-regions" . }}

模块自动将雨果部分注册为组件 .

<div data-editable="component" data-component="card" data-prop="card">
  {{- partial "card" .Params.card -}}
</div>

反应

对于独立的React SPA,请在客户端入口注册您的组件:

// src/index.js
import { registerReactComponent } from "@cloudcannon/editable-regions/react";
import CTA from "./components/CTA.jsx";

registerReactComponent("cta", CTA);

然后标记您的模板 :

<editable-component data-component="cta" data-prop="cta">
  <CTA {...props.cta} />
</editable-component>

丝绒

对于独立的Svelte SPA,请在客户端入口注册您的组件:

// src/index.js
import { registerSvelteComponent } from "@cloudcannon/editable-regions/svelte";
import CTA from "./components/CTA.svelte";

registerSvelteComponent("cta", CTA);

然后标记您的模板 :

<editable-component data-component="cta" data-prop="cta">
  <CTA {...cta} />
</editable-component>

阴道

对于独立的Vue SPA,请在客户端入口注册您的组件:

// src/index.js
import { registerVueComponent } from "@cloudcannon/editable-regions/vue";
import CTA from "./components/CTA.vue";

registerVueComponent("cta", CTA);

然后标记您的模板 :

<editable-component data-component="cta" data-prop="cta">
  <CTA v-bind="cta" />
</editable-component>

下一个.js

在 Next.js app中,将页面内容包入 EditableRegions 根组件。 可编辑 内部区域只有在应用完成水分后才能连接:

// app/layout.js
import { EditableRegions } from "@cloudcannon/editable-regions/react";

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <EditableRegions tag="main">{children}</EditableRegions>
      </body>
    </html>
  );
}

然后标记您的模板——页面保留服务器组件,区域标记为平面 HTML :

// app/page.js
export default function Page() {
  return (
    <h1>
      <editable-text data-prop="title">Hello from Next.js</editable-text>
    </h1>
  );
}

从一个客户端组件注册您的组件, 闸门打开 window.inEditorMode 所以代码 远离生产捆绑:

// app/components/CloudCannon.js
"use client";

import { useEffect } from "react";
import { registerReactComponent } from "@cloudcannon/editable-regions/react";
import CTA from "./CTA.jsx";

export default function CloudCannon() {
  useEffect(() => {
    if (window.inEditorMode) {
      registerReactComponent("cta", CTA);
    }
  }, []);

  return null;
}

对于完全静态的站点,导出页面为平版 HTML ——该建筑将静态站点写入 out/ 不需要服务器运行时间 :

// next.config.js
const nextConfig = {
  output: "export",
};

export default nextConfig;

斯维尔特基特

在 SvelteKit 应用程序中,将路由页面包裹在 EditableRegions 根组件在根中 设置。 它内部的可编辑区域只有在应用程序完成水分后才能连接 :

<!-- src/routes/+layout.svelte -->
<script>
  import { onMount } from "svelte";
  import {
    EditableRegions,
    registerSvelteComponent,
  } from "@cloudcannon/editable-regions/svelte";
  import CTA from "$lib/components/CTA.svelte";

  let { children } = $props();

  onMount(() => {
    if (window.inEditorMode) {
      registerSvelteComponent("cta", CTA);
    }
  });
</script>

<EditableRegions tag="main">
  {@render children()}
</EditableRegions>

然后标记您的模板 :

<!-- src/routes/+page.svelte -->
<h1>
  <editable-text data-prop="title">Hello from SvelteKit</editable-text>
</h1>

对于一个完全静态的站点,使用静态适配器并提前回复每条路线——建筑写道: 静态站点到 build/数字 :

// svelte.config.js
import adapter from "@sveltejs/adapter-static";

const config = {
  kit: {
    adapter: adapter(),
  },
};

export default config;
// src/routes/+layout.js
export const prerender = true;

坚果

在 Nuxt 应用程序中, 将路由页面包入 EditableRegions 布局中的根组件. 它内部的可编辑区域只有在应用程序完成水分后才能连接 :

<!-- app/layouts/default.vue -->
<script setup>
import { EditableRegions } from "@cloudcannon/editable-regions/vue";
</script>

<template>
  <EditableRegions tag="main">
    <slot />
  </EditableRegions>
</template>

告诉Vue治疗 editable-* 元素作为原生元素而不是组件:

// nuxt.config.ts
export default defineNuxtConfig({
  vue: {
    compilerOptions: {
      isCustomElement: (tag) => tag.startsWith("editable-"),
    },
  },
});

然后标记您的模板 :

<!-- app/pages/index.vue -->
<template>
  <h1>
    <editable-text data-prop="title">Hello from Nuxt</editable-text>
  </h1>
</template>

从一个客户端插件注册您的组件, 闸机已打开 window.inEditorMode 所以,代码保留 生产捆绑:

// app/plugins/cloudcannon.client.ts
import { registerVueComponent } from "@cloudcannon/editable-regions/vue";
import CTA from "../components/CTA.vue";

export default defineNuxtPlugin(() => {
  if (window.inEditorMode) {
    registerVueComponent("cta", CTA);
  }
});

对于一个完全静态的站点,配置硝基通过从索引页上爬行来预发站点, 然后用 nuxt generate ——建筑将静态站点写入 .output/public数字 :

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      crawlLinks: true,
      routes: ["/"],
    },
  },
});

可编辑区域如何工作

一个可编辑区域是您页面中的一块,视觉编辑器可以就地编辑. 当您在视觉编辑器中加载页面时, CloudCannon 将您的元素水化为可编辑区域 。 在 CloudCannon 之外, 您的元素是纯 HTML ; 您的用户会看到您所写的标记 .

可编辑区域可以编辑您 CloudCannon 站点中配置的任何结构化数据, 包括您的页面前题和内容, 您的数据集以及您的收藏 .

定义可编辑区域

您通过在已有元素中添加 HTML 属性, 或通过在等同的 Web 组件中包裹内容来定义其中之一 :

属性网络组件
data-editable="text"<editable-text>
data-editable="image"<editable-image>
data-editable="source"<editable-source>
data-editable="array"<editable-array>
data-editable="array-item"<editable-array-item>
data-editable="component"<editable-component>

两种形式是等同的。 数据属性在将可编辑区域附加到现有的标记上时是有用的,而当没有现有的标记来附加一个属性或者没有直接访问标记时,网页组件是有用的.

<h1 data-editable="text" data-prop="title">{title}</h1>

<editable-image data-prop-src="src">
    <MyFigureComponent src={src} />
</editable-image>

向可编辑区域传递值

每个可编辑区域通过一个区域获得编辑值 data-prop 选择器。 选择者指向您的数据, 相对于当前文件的根( 通常是其前题) 或 最近的可编辑祖先。区域会解决选择器和重交的值变化;编辑通过同一选择器回写.

<h4 data-editable="text" data-prop="name">{testimonial.name}</h4>

区域也可以通过 data-prop-* 属性。 属性后缀是值被传递到下方的名称,属性值是第二个选择器:

<img
  data-editable="image"
  data-prop-src="heroImage"
  data-prop-alt="heroImageAlt"
/>

在此图像区域得到两个值: src 从 heroImage,以及 alt 从 heroImageAlt。每个区域期望的值的名称和类型列于以下选项部分.

价值区域

值区域编辑一个值. 它们是你页面的叶子 不允许其他可编辑区域在其中筑巢.

文本

添加 data-editable="text" (单位:千美元) data-prop 命名要编辑的结构化数据密钥 :

<h4 data-editable="text" data-prop="name">{testimonial.name}</h4>

或者用那个 editable-text 网络组件 :

<h4><editable-text data-prop="name">{testimonial.name}</editable-text></h4>

编辑文件内容

如果您想要编辑的元素是文件的正文内容( Markdown/HTML 内容而不是前题密钥), 您可以使用特殊 @content 语法( 见 参考外部数据 更多信息).

<div data-editable="text" data-prop="@content">
    <Content />
</div>

默认 @content 指的是当前页面的内容。 如果您想要引用另一页面的内容, 您可以将其与其它外部数据选择器合并, 如 @file。 。 。 .

<div data-editable="text" data-prop="@file[README.md].@content">
    <Content />
</div>

选项

选项类型需求说明
data-prop选择器对要编辑的数据,所选值必须是字符串.
data-type"span" | "text" | "block"没有控制编辑表面 : span 编辑纯文本, text 编辑段落级别丰富的文本,以及 block 编辑多段丰富的文本.
data-defer-mount布尔没有设定时,编辑器只初始化了第一次被点击的区域,而不是在页面负载上. 默认为 false。 。 。 .

这个 data-type 默认从编辑的值中计算: 区域编辑内容丰富的文本-源区域, @content,或配置了丰富文本输入的值——默认为 block 或者说 text默认值为 span如果该值没有配置输入, CloudCannon 将返回到主机元素的家族(例如 an) h2 表现为 text页:1 div 作为 block) (中文(简体) ).

图像

添加 data-editable="image" (或围绕) <img> 元素并绑定其属性 data-prop-*数字 :

<img
  data-editable="image"
  data-prop-src="heroImage"
  data-prop-alt="heroImageAlt"
  data-prop-title="heroImageTitle"
  src={heroImage}
  alt={heroImageAlt}
  title={heroImageTitle}
/>

或者用那个 editable-image 网络组件 :

<editable-image data-prop-src="heroImage" data-prop-alt="heroImageAlt">
  <img src={heroImage} alt={heroImageAlt} />
</editable-image>

该区域必须包含 <img> 要素,无论是作为儿童还是作为要素本身.

单击图像区域打开 编辑图像 visual Editor 中的面板: 从您的机器上传, 从仓库或 DAM 中选择一个已有的文件, 并编辑 alt/ title 细节 .

编辑图片元素

图像区域也可以覆盖 <picture> 键。 将区域属性设置在 <picture>; 当图像改变时, CloudCannon 更新预览 URL <source> 要素以及 <img>数字 :

<picture data-editable="image" data-prop-src="heroImage" data-prop-alt="heroImageAlt">
  <source srcset={heroImageAvif} type="image/avif" />
  <img src={heroImage} alt={heroImageAlt} />
</picture>

选项

选项类型需求说明
data-prop选择器 : 字符串, 备选案文 ? : 字符串, 标题 ? : 字符串没有选择一个持有图像细节的对象。 每个图像属性绑定在 <selector>.src, (中文(简体) ), <selector>.alt,以及 <selector>.title。 。 。 .
data-prop-src选择器没有为图像源选择数据.
data-prop-alt选择器没有为备选案文文本选择数据.
data-prop-title选择器没有为标题文本选择数据.

需要至少一个选择器 。 当将对象绑定时 data-prop,其值只应包含 src, (中文(简体) ), alt,以及 title 密钥; 其它任何东西都会产生一个错误卡, 建议您删除额外的绑定值 .

结构区域

结构区域定义页面的形状,而不是单一的值。 与可编辑价值区域不同的是,可编辑结构区域可以让其他可编辑区域嵌入其中并相互作曲.

构成部分

一个组成区域将一块标记绑在 登记 组件,编辑器可以随着数据的变化而重新发送.

<editable-component data-component="cta" data-prop="cta">
  <CTA {...cta} />
</editable-component>

选项

选项类型需求说明
data-component字符串对该组件的密钥登记在下(如在雨果,部分路径加扩展,如:. card.html) (中文(简体) ).
data-prop选择器没有数据作为道具传递给组件.

在组件自身的文件中,为其文本,图像和嵌入式阵列添加更多可编辑区域. 当用户在Visual Editor中编辑组件数据时,已注册的渲染器会重新发送组件并更新结果到位.

阵列和阵列项目

一个阵列区域定义了从重复元素列表中构建的标记区域. 数组项目区域定义该数组中单个元素的边界。 阵列和阵列项区域总是作为一对进行工作,作为拇指规则,它们将被定位在您模板中循环的任意一面.

<ul data-editable="array" data-prop="testimonials">
  {testimonials.map((testimonial) => (
    <li data-editable="array-item">
      <h4 data-editable="text" data-prop="name">{testimonial.name}</h4>
      <p data-editable="text" data-prop="quote">{testimonial.quote}</p>
    </li>
  ))}
</ul>

向数组添加项目

当用户在"视觉编辑器"中添加一个项目时,编辑器必须发明新项目的标记. 这取决于阵列的设置方式:

具有组件的同源数组

如果数组将一个组件命名为 data-component,每个项目由该组件提供。 创建一个新项目作为光阵列项目,注册组件仅从项目数据中产生;不需要模板标记.

<ul data-editable="array" data-prop="testimonials" data-component="testimonial">
  {testimonials.map(() => (
    <li data-editable="array-item" data-component="testimonial">
      <Testimonial />
    </li>
  ))}
</ul>
带有模板的同源数组

A 类 <template> 矩阵区域内的元素是新项目的蓝图。 没有模板 data-id 每个新项目的蓝图:

<ul data-editable="array" data-prop="features">
  <template>
    <li>
      <h4 data-editable="text" data-prop="title"></h4>
      <p data-editable="text" data-prop="description"></p>
    </li>
  </template>
</ul>

多根模板自动被包裹在一个 editable-array-item。既无模板,也无组件,编辑器会复制一个已存在的项目的标记;如果阵列是空的,也没有,则会获得一个出错卡来命名要添加的内容.

带有 id 密钥和组件密钥的异质数组

当项目有不同的形状时,每个项目都命名自己的组件. 数组的 data-id-key 财务报告和审定财务报表 data-component-key 告诉编辑器哪个项键持有 id 和组件名称;见 页面结构 下面是一个完整的设置。 创建一个新项目,作为光子阵列项目,其组件使其:

<main data-editable="array" data-prop="contentBlocks" data-component-key="_name">
  <section data-editable="array-item" data-id="HeroBlock" data-component="HeroBlock">
    <h2 data-editable="text" data-prop="title"></h2>
  </section>
</main>

每个项目 _name 值既用作其代号,也用作其组成部分,因此一个新项目命名为 HeroBlock 由注册人提供 HeroBlock 组件.

带有 id 密钥和模板的异质数组

一个按键 <template data-id="…"> 是带有此标识的新项目的蓝图;每个新项目的形状从正确的模板中选择。 此项的ID来自数组 data-id-key; 平原 <template> (无) data-id)是无按键模板的id的倒置.

<ul data-editable="array" data-prop="blocks" data-id-key="type">
  <template data-id="hero">
    <section class="hero">
      <h2 data-editable="text" data-prop="title"></h2>
    </section>
  </template>
  <template data-id="stats">
    <section class="stats"><!-- ... --></section>
  </template>
</ul>

特殊道具

两个选择器由数组结构本身提供,而不是由您的数据提供:

  • @length ——由阵列区域提供;项目计数.
  • @index ——由每个阵列项提供;项目的位置.

和任何其他选择者一样参考 data-prop="@length" 或者说 data-prop="@index"。 。 。 .

选项

阵列区域 :

选项类型需求说明
data-prop选择器对要编辑的阵列 .
data-id-key字符串没有持有每个项目唯一标识符的项目密钥 。 见 页面结构。 。 。 .
data-component字符串没有从组件键中生成无法解析组件的已注册组件 .
data-component-key字符串没有包含注册部件名称的项目密钥以制成每个项目.
data-direction"row" | "column" | "row-reverse" | "column-reverse"没有物品的行走方向,所以物品控制和拖放工作正确. 当元素是弹性容器时默认其弹性方向, 否则 column。 。 。 .

矩阵项目区域 :

选项类型需求说明
data-id字符串没有用于匹配项目到 <template> 当项目移动时,设计并调节 DOM。 通常来自数组 data-id-key。 。 。 .
data-component字符串没有用于制作此项目的已登记部件。 通常来自数组 data-component-key。 。 。 .

阵列区域指定每个项目 data-prop (物品的指数)在水合时;你没有自己设置. 阵列项区域必须是阵列元素的即时子——使对子尽可能相近.

在区域到位后,编辑器可以添加,复制,删除,重排,并拖动项目——同时进行预览更新直播.

道具选择者如何组成

每个 data-prop 选择器是相对于最近的可编辑祖先的值。 链从页上起下:

<main data-editable="array" data-prop="blocks">
  {blocks.map((block, i) => (
    <section data-editable="array-item">
      <h2 data-editable="text" data-prop="title">{block.title}</h2>
      <img data-editable="image" data-prop-src="image" src={block.image} />
    </section>
  ))}
</main>

阅读区域内部:

  • 阵列区域 blocks 整个阵列.
  • 每个阵列项都会递出一个条目: 数组给出其项选择器 blocks.0, (中文(简体) ), blocks.1,, , , , , , , ,
  • 项目中的文本区域解析 title 与此值相对应: blocks.0.title。 。 。 .

写作逆行行同一行. 编辑 <h2> 发送更改事件 title; 每一个祖先会预先使用自己的部分,直到根区域执行 blocks.0.title = "New value" 与基础文件相对。 这也是为什么 最佳做法是增加 " 家长优先 " 的区域: 在一个阵列或组件内嵌入的区域,在祖先存在之前无法解决其选择器.

页面大楼

将不同的数组设置与已注册的组件合并,可以给您页面构建:数组中的每个项目都是内容块,编辑器可以添加,重排,并编辑块来构成页面.

<main
  data-editable="array"
  data-prop="contentBlocks"
  data-id-key="_name"
  data-component-key="_name"
>
  {contentBlocks.map((block) => {
    const Component = components[block._name];
    return (
      <section data-editable="array-item" data-id={block._name} data-component={block._name}>
        <Component {...block} />
      </section>
    );
  })}
</main>

前题有:

contentBlocks:
  - _name: HeroBlock
    title: We're on a mission
    description: Lorem ipsum dolor sit amet…
  - _name: StatsBlock
    stats:
      - figure: $200m
        text: Venture capital raised
      - figure: 40+
        text: Amazing team members
  - _name: ContactBlock
    text: Want to get in contact with us?
    button: Click here

注册每个块组件,编辑器可以添加任何块类型,重新排序,并编辑每个块的内容. 保存中 _name 由于id和组件键都是常见的和方便的,但是它们可以是独立的键. 如果两个密钥相同, 您只需要指定 data-component-key 财务报告和审定财务报表 data-id-key 将默认为同一值.

参考外部数据

data-prop 选择器相对当前文件(或最近的可编辑祖先). 要指向生活在别处的数据,请用 @ 参考文献 :

参考文献决定
@collections[blog]这个 blog 收藏——可直接用作数组区域值
@data[nav]这个 nav 数据集(在页面外管理的数据文件)
@file[about.md]另一个文件的结构化数据
@file[about.md].@content另一个文件的内容
@content当前文件的内容
<ul data-editable="array" data-prop="@collections[blog]">
  <li data-editable="array-item">
    <h4 data-editable="text" data-prop="title" />
  </li>
</ul>

注释:

  • @content 在文本区域上,您可以在文件的Markdown/HTML正文上获得丰富的文本编辑器——见 编辑文件内容 详情和实例.
  • 在一个不合格的选择者之后 @ 参考文献(例如:. @file[about.md].seo.title继续到已解决对象.

文学道具

对于根本不存在于任何文件中的值, data-literal-prop-* 属性将字面值传递给一个区域。 属性后缀是值在下方传递的名称(参见 将数值移入可编辑区域:

<editable-component
  data-component="author-card"
  data-literal-prop-name="C. Kent"
  data-literal-prop-role="Support engineer"
/>

给 author-card 收到组件 { name: "C. Kent", role: "Support engineer" }。 。 。 .

解析为 JSON 的值作为结构值传递 :

<editable-component
  data-component="author-card"
  data-literal-prop-social='{"twitter": "@cloudcannon"}'
/>

在这里,组件收到 { social: { twitter: "@cloudcannon" } }。不解析为 JSON 的值会作为普通字符串传递.

来源区域

全部编辑值和结构区域 结构化数据,而您的模板则重新提交。 源区域是例外:它们编辑 模板文件本身的硬编码标记。 。 。 .

他们如何工作

<p
  data-editable="source"
  data-path="src/pages/about.astro"
  data-key="about-intro"
>
  We've been building websites since 2014.
</p>

当编辑器中的文件更改时,运行时间会获取文件的原始来源,通过查找元素 data-key 属性,然后在源文件中直接编辑其内容.

限制

  • 只有静态标记. 区域编辑文件中的字面HTML. 如果元素含有任何调试, 您必须配置匹配的片段, 否则编辑器无法安全解析 .
  • data-key 文件内的值必须是独一无二的,属性必须活入已建输出.
  • 由于源可编辑区域直接编辑源,一个区域的编辑会更新文件被引用的所有其他地点. 任何未被配置为片段的动态内容都会被以静态内容覆盖.

什么时候用

当文本后面没有结构化的数据密钥时使用源区域 。 例如:登陆页和有硬码副本的独立模板,或呼叫到动作被烘烤成布局. 是逃生舱门使得硬码的HTML可以编辑,而无需围绕数据文件调整你的模板.

狦 能够 将数值移动到前置物质或数据文件中, 选择文本区域: 数据驱动区域重新将您的内容保存在内容所属位置 .

选项

选项类型需求说明
data-path字符串对模板文件文本存在,相对于站点根. 领先 / 是可选的。 这是文件路径, 不是选择器 .
data-key字符串对在文件中识别此区域的名称 。 一定是独一无二的 data-key 在同一文件中的数值.
data-type"span" | "text" | "block"没有控制丰富的文本编辑表面,如同 文本区域。源内容作为 HTML 编辑.
data-input-configJSON 对象没有编辑器的内置输入配置,作为JSON对象. 胜过 data-input。 。 。 .
data-input字符串没有CloudCannon 输入配置中用于解决此区域的弹出, 当 data-input-config 没有设定.

版本与发布记录

@cloudcannon/editable-regions 共发布 24 个版本,首次发布于 2025/10/07;过去 12 个月发布了 19 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.22latest2026/10/1526 天前
0.0.212026/09/181 个月前
0.0.202026/09/171 个月前
0.0.20-rc.3rc2026/09/111 个月前
0.0.20-rc.22026/09/101 个月前
0.0.20-rc.12026/09/101 个月前

关于 @cloudcannon/editable-regions 的常见问题

@cloudcannon/editable-regions 是什么?

CloudCannon CMS的视觉编辑.

如何安装 @cloudcannon/editable-regions?

在项目目录运行 npm install @cloudcannon/editable-regions,或使用 pnpm add / yarn add / bun add。

@cloudcannon/editable-regions 支持 TypeScript 吗?

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

@cloudcannon/editable-regions 支持 ESM 还是 CommonJS?

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

@cloudcannon/editable-regions 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20.19.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@cloudcannon/editable-regions 可以商用吗?

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

@cloudcannon/editable-regions 的下载量有多少?

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

@cloudcannon/editable-regions 还在维护吗?

最新版本 0.0.22 发布于 2026/10/15(26 天前);至今共发布 24 个版本,其中过去 12 个月发布了 19 个;首次发布于 2025/10/07。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。