尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FASTElementDefinition.shadowOptions 详解:用 FASTElement 精确控制 Shadow DOM 的创建

发布时间:2026/9/29 5:34:39

资讯中心
01
ARTICLE

FASTElementDefinition.shadowOptions 详解:用 FASTElement 精确控制 Shadow DOM 的创建

FASTElementDefinition.shadowOptions 详解:用 FASTElement 精确控制 Shadow DOM 的创建
前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载本篇技术指南围绕microsoft/fast-element中FASTElementDefinition.shadowOptions属性展开说明它是如何控制自定义元素 Shadow DOM 创建方式的。读者将掌握通过customElement装饰器配置open/closedShadow DOM、渲染到 Light DOM、以及使用delegatesFocus等标准ShadowRootInit选项的完整实战方法并理解这些配置在底层ElementController中的执行机制。属性签名与定位shadowOptions是FASTElementDefinition类上的一个只读属性位于 packages/fast-element/src/components/fast-definitions.ts。其官方 API 描述为Options controlling the creation of the custom elements shadow DOM.类型签名出自 sites/website/src/docs/1.x/api/fast-element.fastelementdefinition.shadowoptions.mdreadonly shadowOptions?: ShadowRootInit;ShadowRootInit是 Web 平台标准接口FASTElementDefinition对其进行了扩展见fast-definitions.ts中的ShadowRootOptions接口export interface ShadowRootOptions extends ShadowRootInit { /** * A registry that provides the custom elements visible * from within this shadow root. * beta */ registry?: CustomElementRegistry; }除标准ShadowRootInit字段外FAST 还额外支持一个registry字段标记为 beta用于指定该 shadow root 内部可见的自定义元素注册表。值得注意的是同一仓库的 1.x API 体系中PartialFASTElementDefinition.shadowOptions的类型是PartialShadowRootOptions | null见 fast-element.partialfastelementdefinition.shadowoptions.md即配置阶段允许传入部分选项或null而最终解析完成的FASTElementDefinition.shadowOptions类型为ShadowRootInit这说明配置在定义组装过程中已被补齐为完整值。默认行为自动创建 open 模式 Shadow RootFASTElement在元素实例化时会自动为组件创建 Shadow Root。从源码看默认配置由常量定义fast-definitions.tsconst defaultShadowOptions: ShadowRootInit { mode: open };在FASTElementDefinition构造函数中shadowOptions的解析逻辑如下this.shadowOptions nameOrConfig.shadowOptions void 0 ? defaultShadowOptions : nameOrConfig.shadowOptions null ? void 0 : { ...defaultShadowOptions, ...nameOrConfig.shadowOptions };三种取值对应三种行为配置值结果说明不提供undefined{ mode: open }默认创建 open 模式的 Shadow Rootnullundefined不创建 Shadow Root模板渲染到 Light DOM对象字面量与{ mode: open }浅合并未指定的字段继承默认值配置对象的合并采用浅合并spread因此你只需写出与默认值不同的字段。例如只写{ mode: closed }即可切换到封闭模式。底层执行机制ElementController 与 attachShadow定义中的shadowOptions并非直接生效而是由控制器在元素实例化时消费。ElementController构造函数将定义中的选项写入自身的shadowOptions字段element-controller.tsthis.shadowOptions definition.shadowOptions;随后在 setter 中完成 Shadow Root 的实际创建同一文件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 DOM 在元素构造函数阶段由控制器挂载官方文档也明确指出正是在构造函数中FASTElement为元素挂载 Shadow DOM见 working-with-shadow-dom.md 的 Shadow DOM and the element lifecycle 一节。只可设置一次setter 只在_shadowRootOptions尚未初始化时生效避免重复挂载。已有 Shadow Root 的复用如果元素上已存在 Shadow Root典型场景是服务端渲染/声明式模板预渲染控制器会记录hasExistingShadowRoot true并跳过attachShadow后续渲染逻辑会优先尝试水合hydration而非重建内容参见renderTemplate中hasPrerenderedContent的判定。closed 模式的特殊处理closed模式下浏览器不暴露element.shadowRoot因此 FAST 用模块级WeakMapshadowRoots保存对 Shadow Root 的引用保证内部渲染管线仍能访问到根节点getShadowRoot辅助函数优先返回element.shadowRoot取不到时再回退到WeakMap。通过 customElement 配置三种渲染模式shadowOptions的常规使用入口是customElement装饰器。以下示例均可在官方 1.x 文档 working-with-shadow-dom.md 中找到对应说明。1. open 模式默认import { FASTElement, customElement, attr, html } from microsoft/fast-element; const template htmlNameTag div classheader h3${x x.greeting.toUpperCase()}/h3 h4my name is/h4 /div div classbody slot/slot /div div classfooter/div ; customElement({ name: name-tag, template }) export class NameTag extends FASTElement { attr greeting: string Hello; }这是最常见的写法不传shadowOptions即可。open 模式下element.shadowRoot对外可见方便调试与测试。2. closed 模式customElement({ name: name-tag, template, shadowOptions: { mode: closed } }) export class NameTag extends FASTElement { attr greeting: string Hello; }官方文档给出的建议是尽量避免使用closed模式因为它会影响事件传播路径closed模式下 Shadow DOM 内的目标不会出现在composedPath()中并且让自定义元素更难以被开发者工具检视working-with-shadow-dom.md 的 Shadow DOM configuration 一节明确标注了该 tip。仓库中的控制器测试也对两种模式均有覆盖参见 element-controller.pw.spec.ts 中shadowOptions: { mode: closed }与{ mode: open }的用例。3. Light DOM不创建 Shadow RootcustomElement({ name: name-tag, template, shadowOptions: null }) export class NameTag extends FASTElement { attr greeting: string Hello; }传null时定义解析为undefined控制器不会调用attachShadow模板将直接渲染到元素自身的 Light DOM。官方文档对此给出了明确警告working-with-shadow-dom.md如果选择渲染到 Light DOM你将无法组合内容、使用 slot也无法利用封装的样式。Light DOM 渲染不建议用于可复用组件仅在小应用的根组件场景下有有限用途。从源码印证renderTemplate中渲染目标的选择正是通过getShadowRoot(element) ?? element实现的——没有 Shadow Root 时直接以元素自身为宿主element-controller.ts。使用其他 ShadowRootInit 选项delegatesFocus 等由于shadowOptions本质上是标准ShadowRootInit并可能被合并进默认mode: open你可以传入浏览器attachShadow支持的任何选项例如delegatesFocuscustomElement({ name: my-input, template, shadowOptions: { delegatesFocus: true } }) export class MyInput extends FASTElement { attr value: string ; }官方文档明确说明除了 Shadow DOM 模式之外shadowOptions暴露了所有可通过标准attachShadowAPI 设置的选项。这意味着你也可以用它指定delegatesFocus: true这样的新选项。你只需指定与上述默认值不同的选项即可。working-with-shadow-dom.mddelegatesFocus: true会让焦点委托到 Shadow DOM 内部的可聚焦元素对实现可访问性良好的表单控件如按钮、输入框非常实用。类似地slotAssignment控制 slot 分配算法等现代ShadowRootInit选项也可按需传入由于浅合并机制未提供的字段始终回落到{ mode: open }默认值。在组件库中的实际应用shadowOptions不仅在单个元素定义中使用也是 FAST 组件体系的重要配置面。1.x 文档的组件库设计指南creating-a-component-library.md指出FoundationElementDefinition允许组件作者检查聚合后的选项其中包括shadowOptions、elementOptions等。fast-components 系列组件的 API 文档如 fast-components.fastbutton.md、fast-components.fastanchor.md同样展示了shadowOptions: { mode: closed }之类的配置形态说明封闭模式在组件库中用于强化样式与结构隔离。此外测试代码中反复出现三种典型用法element-controller.pw.spec.ts// 显式 open static definition { name, shadowOptions: { mode: open } }; // Light DOM static definition { name, shadowOptions: null }; // closed shadowOptions: { mode: closed }这恰好对应前文三种渲染模式可以作为配置正确性的回归验证参考。小结与最佳实践需求场景shadowOptions 配置备注默认组件渲染省略该字段自动 open 模式需要element.shadowRoot外部可访问、便于调试{ mode: open }默认即此显式写出可增强可读性严格隔离内部结构{ mode: closed }官方建议慎用影响事件路径与可检查性小应用根组件、无需 slot/样式封装null渲染到 Light DOM不可用于可复用组件表单控件焦点委托{ delegatesFocus: true }与默认mode浅合并限定 shadow root 内部可见的自定义元素{ registry }betaFAST 对ShadowRootInit的扩展见ShadowRootOptions核心要点回顾FASTElementDefinition.shadowOptions是定义元数据的一部分类型为readonly shadowOptions?: ShadowRootInit控制 Shadow DOM 的创建方式。默认值为{ mode: open }传null则渲染到 Light DOM传对象时与默认值浅合并。实际创建由ElementController在构造函数阶段调用attachShadow完成且只执行一次closed模式下的 Shadow Root 引用由内部WeakMap维护。完整实战示例与使用边界可继续参阅 working-with-shadow-dom.md、fast-element.partialfastelementdefinition.shadowoptions.md 以及源码实现 fast-definitions.ts 和 element-controller.ts。赞分享前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载相关推荐CANN混合量化稀疏Flash MLA元数据aclnnMixedQuantSparseFlashMlaMetadata 查看源码 https://link.gitcode.com/i/ef68dba前端UI组件es-toolkit 兼容层 updateWith 详解用 customizer 精确控制嵌套对象路径的创建es toolkit 兼容层 updateWith 详解用 customizer 精确控制嵌套对象路径的创建 导读 本文以 es toolkit 兼容层co前端后端Flet Padding 详解用 Python 精确控制控件内边距Flet Padding 详解用 Python 精确控制控件内边距 Padding内边距是 Flet 布局体系中最高频使用的空间控制手段之一它决定了子控前端跨平台桌面应用移动开发上一篇5个现代Web开发痛点与Express.js的架构级解决方案下一篇pgFormatter安全部署指南CGI模式的安全配置和防护创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。