FAST Element `shadowOptions` 配置完全指南:控制自定义元素 Shadow DOM 的创建方式
前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载导读shadowOptions是microsoft/fast-element中PartialFASTElementDefinition的核心配置属性它决定了 FAST 自定义元素创建 Shadow DOM 的方式默认开放open模式、封闭closed模式或是直接渲染到 Light DOM。本文将以 fast-element.partialfastelementdefinition.shadowoptions.md 为骨架结合 fast-definitions.ts 与 element-controller.ts 的源码实现完整讲解该属性的签名、默认值语义、三种取值行为、与attachShadow的对应关系以及实际组件中的配置范例。属性签名与定义位置shadowOptions是PartialFASTElementDefinition接口的成员属性该接口位于 fast-definitions.ts。其类型签名如下readonly shadowOptions?: PartialShadowRootOptions | null;几个关键点readonly该属性在定义阶段只读用于向FASTElementDefinition提供元数据不会在运行期被用户代码直接修改。PartialShadowRootOptions只需提供与默认值有差异的字段未提供的字段会与框架默认值合并。| null显式传入null表示不使用 Shadow DOM元素模板将渲染到 Light DOM。值得留意的是仓库源码中的ShadowRootOptions接口比浏览器原生ShadowRootInit多扩展了一个registry字段见 fast-definitions.ts用于为 shadow root 提供自定义元素注册表beta能力export interface ShadowRootOptions extends ShadowRootInit { /** * A registry that provides the custom elements visible * from within this shadow root. * beta */ registry?: CustomElementRegistry; }在 1.x API 文档中PartialFASTElementDefinition对该属性的表述为 Options controlling the creation of the custom elements shadow DOM控制自定义元素 Shadow DOM 创建的选项与源码注释完全一致。三种取值的语义与默认行为源码构造函数对shadowOptions的归一化逻辑是理解该属性的钥匙见 fast-definitions.tsthis.shadowOptions nameOrConfig.shadowOptions void 0 ? defaultShadowOptions : nameOrConfig.shadowOptions null ? void 0 : { ...defaultShadowOptions, ...nameOrConfig.shadowOptions };而模块顶部的默认值定义为const defaultShadowOptions: ShadowRootInit { mode: open };由此可以归纳出三种取值行为取值行为结果未提供undefined使用默认值以mode: open创建开放的 Shadow Root{ mode: closed }等配置对象与defaultShadowOptions浅合并以用户指定选项创建 Shadow Rootnull归一化为void 0不创建 Shadow DOM模板渲染到 Light DOM注意合并方向{ ...defaultShadowOptions, ...nameOrConfig.shadowOptions }意味着用户配置会覆盖默认值因此只需写出与默认不同的字段即可例如shadowOptions: { mode: closed }会自动继承mode之外的其余默认语义此处默认值仅含mode。源码级验证ElementController 如何消费该配置shadowOptions从定义流向运行时的桥梁是ElementController。在其构造函数中element-controller.ts定义中的配置被写入控制器public constructor(element: TElement, definition: FASTElementDefinition) { this._notifier new PropertyChangeNotifier(element); this.source element; this.definition definition; this.shadowOptions definition.shadowOptions; ... }随后在shadowOptions的 setter 中element-controller.ts执行实际的 Shadow DOM 挂载逻辑public set shadowOptions(value: ShadowRootOptions | undefined) { // options on the shadowRoot can only be set once if (this._shadowRootOptions void 0 value ! void 0) { this._shadowRootOptions value; let shadowRoot this.source.shadowRoot; if (shadowRoot) { this.hasExistingShadowRoot true; } else { shadowRoot this.source.attachShadow(value); if (value.mode closed) { shadowRoots.set(this.source, shadowRoot); } } } }这段代码揭示了三个实现细节Shadow Root 只允许创建一次注释 options on the shadowRoot can only be set once 表明一旦_shadowRootOptions被赋值后续赋值会被忽略——这是浏览器规范中attachShadow不可重复调用的直接映射。closed模式的内部跟踪当mode: closed时浏览器不会暴露element.shadowRoot因此 FAST 内部用shadowRoots一个WeakMapElement, ShadowRoot见 element-controller.ts保存引用供框架内部如样式注入、shadowRootFor查询见该文件 L36 与 L948 附近注释继续访问。null配置Light DOM不会触发attachShadow因为value为undefined时整个分支被跳过模板改由 Light DOM 路径渲染。在customElement装饰器中使用shadowOptions最常见的消费入口是customElement装饰器。该装饰器定义于 fast-element.ts其参数类型正是string | PartialFASTElementDefinitionexport function customElement(nameOrDef: string | PartialFASTElementDefinition) { return function (type: ConstructableHTMLElement) { define(type, nameOrDef); }; }默认开放 Shadow DOM以下写法不提供shadowOptionsFAST 会以默认的{ mode: open }创建 Shadow Root模板渲染进 Shadow DOMimport { FASTElement, customElement, attr, html } from microsoft/fast-element; const template htmlNameTag div classheader h3${x x.greeting.toUpperCase()}/h3 /div div classbody slot/slot /div ; customElement({ name: name-tag, template }) export class NameTag extends FASTElement { attr greeting: string Hello; }封闭模式shadowOptions: { mode: closed }customElement({ name: name-tag, template, shadowOptions: { mode: closed } }) export class NameTag extends FASTElement { attr greeting: string Hello; }需要注意官方文档 working-with-shadow-dom.md 的提醒Avoid usingclosedmode since it affects event propagation and makes custom elements less inspectable. 尽量避免使用closed模式因为它会影响事件传播并降低自定义元素的可检查性。这正对应前述源码行为closed模式下外部无法通过element.shadowRoot访问内部 DOMcomposedPath()中 Shadow DOM 内部目标也不会出现详见 working-with-shadow-dom.md事件路径看起来就像自定义元素本身是第一个 target。Light DOM 渲染shadowOptions: nullcustomElement({ name: name-tag, template, shadowOptions: null }) export class NameTag extends FASTElement { attr greeting: string Hello; }官方文档同时给出了重要约束working-with-shadow-dom.mdIf you choose to render to the Light DOM, you will not be able to compose the content, use slots, or leverage encapsulated styles. Light DOM rendering is not recommended for reusable components. It may have some limited use as the root component of a small app. 如果选择渲染到 Light DOM将无法组合内容、使用 slot也无法获得样式封装。Light DOM 渲染不建议用于可复用组件仅适合作为小型应用的根组件等有限场景。与原生attachShadow选项的完整对应shadowOptions的PartialShadowRootOptions类型意味着它暴露了标准Element.attachShadow()的全部选项。官方文档 working-with-shadow-dom.md 明确指出除 mode 之外还可以指定如delegatesFocus: true等新选项且只需写出与默认值不同的字段。标准ShadowRootInit支持的核心选项均由shadowOptions透传给attachShadow选项类型作用modeopen \| closed控制 Shadow Root 的可见性FAST 默认opendelegatesFocusboolean焦点委托键盘焦点从 shadow host 委托给可聚焦的 shadow 内部元素slotAssignmentnamed \| manual控制 slot 分配模式较新浏览器支持clonableboolean允许cloneNode()时克隆 Shadow Root较新浏览器支持serializableboolean允许通过 Declarative Shadow DOM 序列化较新浏览器支持这些选项在较新浏览器中才可用且要求元素在构造时由 FAST 统一调用attachShadow完成挂载。以焦点管理为例配置方式如下customElement({ name: my-dialog, template, shadowOptions: { mode: open, delegatesFocus: true } }) export class MyDialog extends FASTElement { // 焦点将自动委托到 Shadow DOM 内第一个可聚焦元素 }组件库中的真实配置范例在仓库的组件文档中shadowOptions被广泛使用。例如 fast-components.fastbutton.md 与 fast-components.fasttoolbar.md 展示了fast-button、fast-toolbar等基础组件的定义片段以下为文档中呈现的形态customElement({ name: fast-button, template, styles, shadowOptions: { ... } })此外fast-components.allcomponents.md 汇总了fast-avatar、fast-search、fast-text-field、fast-anchor、fast-text-area、fast-number-field、fast-picker、fast-breadcrumb、fast-combobox等一系列组件的定义其中均包含shadowOptions字段。在 design-systems/creating-a-component-library.md 与 design-systems/fast-frame.md 的设计系统文档中也给出了shadowOptions在库级配置中的写法后者还提示更多 Shadow 选项的细节可参考原生Element.attachShadow()规范。若需要快速查阅速记形态resources/cheat-sheet.md 的速查表中也包含了带shadowOptions的组件定义示例。与FASTElementDefinition的关系Partial 到完整定义需要区分两个相关但不同的属性PartialFASTElementDefinition.shadowOptions本文主题类型为PartialShadowRootOptions | null是用户书写定义时提供的部分配置允许省略字段、允许传null。FASTElementDefinition.shadowOptions见 fast-element.fastelementdefinition.shadowoptions.md 与 fast-definitions.ts类型为ShadowRootOptions是归一化后的完整配置——由构造函数完成默认值合并再交付给ElementController执行attachShadow。这一Partial 输入 → 合并默认值 → 完整定义 → 控制器消费的链路正是shadowOptions设计的核心用户永远只需声明差异框架负责补齐默认语义默认mode: open。小结shadowOptions用极简的 API 覆盖了 Shadow DOM 创建的全部决策点省略→ 开放 Shadow DOM框架默认{ mode: closed }→ 封闭 Shadow DOM牺牲可检查性换取更强封装null→ Light DOM 渲染放弃 slot 组合与样式封装仅适用于根组件等场景其余attachShadow选项delegatesFocus等→ 按需透传只写差异项。其运行时行为可在 element-controller.ts 中验证Shadow Root 仅创建一次、closed模式由内部WeakMap跟踪、Light DOM 路径不触发attachShadow。理解了这三点你就能在 FAST 应用中精确掌控自定义元素的渲染域与封装边界。赞分享前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载相关推荐深入解析 fast-element 的 ComposableStyles自定义元素 Shadow DOM 的可组合样式类型深入解析 fast element 的 ComposableStyles自定义元素 Shadow DOM 的可组合样式类型 导读 ComposableStyl前端UI组件深入解析 fast-element 的 PartialFASTElementDefinition自定义元素元数据配置接口全指南深入解析 fast element 的 PartialFASTElementDefinition自定义元素元数据配置接口全指南 导读 PartialFASTE前端UI组件FASTElementDefinition 深度解析microsoft/fast-element 自定义元素元数据与注册机制完全指南FASTElementDefinition 深度解析microsoft/fast element 自定义元素元数据与注册机制完全指南 本文以 micros前端UI组件上一篇DXVK配置文件验证工具检查参数有效性下一篇终极GameFramework实战指南如何快速开发完整RPG游戏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Altium Designer层次化原理图设计:从模块划分到工程落地全指南

Altium Designer层次化原理图设计:从模块划分到工程落地全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 4:20:28 阅读更多 →
景点移动导游系统开题答辩复盘:从需求分析到技术选型全解析

景点移动导游系统开题答辩复盘:从需求分析到技术选型全解析

开题答辩最折磨人的地方,不是评委提问,而是你在台上回答的每一个字,都在替三个月后的自己立flag。我当时拿的课题是景点移动导游系统的设计与实现。本以为讲清楚功能模块就万事大吉,结果评委第一个问题就把我问住了:“…

2026/9/30 4:57:19 阅读更多 →
PyTorch全链路实战:从环境配置到LSTM与ONNX导出

PyTorch全链路实战:从环境配置到LSTM与ONNX导出

写PyTorch,最怕的就是一上来就讲nn.Module怎么用,把框架文档重新抄一遍。这套东西随便搜一下就有,根本没有信息增量。我这次换个路子,从实际使用经验出发,把从安装、环境隔离、核心原理到实战踩坑的整个链路梳理一遍&a…

2026/9/30 4:57:19 阅读更多 →

最新新闻

工控AI应用实战:六个场景切片赋能产线工程师

工控AI应用实战:六个场景切片赋能产线工程师

1. 这不是“学AI”,而是工控人重新校准职业坐标的实战课“工控国际举办全员AI应用能力提升专题培训”——看到这个标题,我第一反应不是点开看PPT长什么样,而是下意识摸了摸自己电脑里那几个常年没更新的PLC仿真软件、SCADA组态工程备份包&…

2026/9/30 5:32:29 阅读更多 →
从代码问答到任务执行:羲和Agent的架构设计与工程实践

从代码问答到任务执行:羲和Agent的架构设计与工程实践

1. 为什么多数AI编码助手止步于问答先讲个真实场景。上个月我给团队搭了一套代码知识库问答机器人,效果相当能打:仓库里几千个文件,问"订单超时重试的逻辑在哪个模块"、"支付回调幂等怎么做的",模型能把文件路…

2026/9/30 5:32:29 阅读更多 →
DTFT与DFT本质区别:连续频谱vs离散采样

DTFT与DFT本质区别:连续频谱vs离散采样

1. 从一张“信号快照”说起:为什么我们非得搞清楚DTFT和DFT的区别?你有没有试过用手机拍一张照片,然后放大再放大,最后发现边缘全是马赛克?或者用录音笔录下一段钢琴声,回放时总觉得少了点“空气感”&#…

2026/9/30 5:32:29 阅读更多 →
Redis 8 接入 AI 实战:内置向量检索与 RAG 应用指南

Redis 8 接入 AI 实战:内置向量检索与 RAG 应用指南

最近关于“Redis 已正式接入 AI”的讨论很多,我也花了不少时间把新版 Redis 真正用起来。这里说的“接入 AI”并不是什么玄学,而是两层现实:一是 Redis 8 开始把向量检索、AI 辅助操作直接内置成官方能力;二是大模型应用越来越普遍…

2026/9/30 5:32:29 阅读更多 →
本地大模型显存估算与硬件匹配:从扫描到量化选型

本地大模型显存估算与硬件匹配:从扫描到量化选型

1. 为什么“我的机器能不能跑这个模型”成了高频问题过去一年,我身边做开发的朋友、做产品的同事、甚至一些刚入门折腾本地模型的学生,问得最多的一句话就是:“我这个配置到底能跑多大的模型?”这个问题听起来简单,但真…

2026/9/30 5:32:29 阅读更多 →
证据驱动源码审阅:Cocos-Engine 静态工程分析实战

证据驱动源码审阅:Cocos-Engine 静态工程分析实战

1. 为什么我要用"证据驱动"的方式审阅 Cocos-Engine 源码第一次听说"静态工程审阅"这个词,很多人的反应是"不就是看代码吗"。但真正做过大型开源项目源码分析的人都知道,漫无目的地翻代码和带着证据链去审阅,完…

2026/9/30 5:31:29 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →