ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

在 Storybook 中为 @storybook/angular 配置 `enableIvy: false`:framework options 的作用与源码原理

在 Storybook 中为 @storybook/angular 配置 `enableIvy: false`:framework options 的作用与源码原理 在 Storybook 中为 storybook/angular 配置enableIvy: falseframework options 的作用与源码原理【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybook导读当 Storybook 通过storybook/angular渲染框架为 Angular 项目构建组件预览时.storybook/main.ts中的framework.options允许你对框架行为做精细调优。enableIvy: false就是其中一项与 Angular Ivy 编译增强相关的开关关闭它后Storybook 的 Angular webpack 预设将不再对模块解析与 Ivy 产物处理做默认增强。本文以官方代码片段为骨架结合当前仓库中code/frameworks/angular的实现源码说明该选项的两种配置写法、默认行为、底层触发逻辑以及何时才需要显式把它设为false。前置说明该选项仅作用于以 webpack 为构建器Angular 框架在 preset.ts 中默认固定使用storybook/builder-webpack5的渲染链路。一、官方配置示例两种语法继承配置位置固定在 Storybook 配置文件.storybook/main.ts把选项放进framework.options即可不需要修改 Angular 应用自身的tsconfig.json。当前仓库文档提供了两套等价写法分别对应 CSF 3 与实验性的 CSF Next 配置风格。写法一CSF 3 StorybookConfig类型使用import type { StorybookConfig } from storybook/angular进行类型标注这是当前最常见、类型提示最完整的写法import type { StorybookConfig } from storybook/angular; const config: StorybookConfig { stories: [ /* ... */ ], addons: [ /* ... */ ], framework: { name: storybook/angular, options: { enableIvy: false, }, }, }; export default config;写法二CSF Next实验特性采用defineMain从storybook/angular/node导入获得更强的类型推导与配置校验其余结构完全一致import { defineMain } from storybook/angular/node; const config defineMain({ stories: [ /* ... */ ], addons: [ /* ... */ ], framework: { name: storybook/angular, options: { enableIvy: false, }, }, }); export default config;需要注意stories与addons数组中的/* ... */只是示意占位实际配置时需替换为你的真实故事文件路径与所装插件。上述两种写法效果完全等价选择哪种只取决于你当前使用的 Storybook 配置体系。二、enableIvy在类型系统中的定义在框架选项的类型层面enableIvy是AngularOptions接口的成员。查看 code/frameworks/angular/src/types.ts#L47-L49export interface AngularOptions { enableIvy?: boolean; }这里有两个值得注意的信息点enableIvy?: boolean是可选布尔值意味着不写该字段时并不报错框架按默认逻辑处理见下文源码。该类型同时被组合进FrameworkOptions AngularOptions { builder?: BuilderOptions }types.ts#L16-L18所以framework.options下既可以放enableIvy也可以追加 webpack builder 的构建选项。由于类型是可选字段IDE 补全时不会强制你显式书写把它写成false属于“显式关闭默认增强”的防御性配置。三、enableIvy: false的实际作用从预设源码看默认值与分支逻辑这是整篇文档最关键的行为细节。官方注释与实现位于 code/frameworks/angular/src/server/framework-preset-angular-ivy.ts#L54-L70export const webpack async (webpackConfig: Configuration, options: PresetOptions) { const framework await options.presets.applyPreset(framework); const angularOptions (typeof framework object ? framework.options : {}) as AngularOptions; // Default to true, if undefined if (angularOptions.enableIvy false) { return webpackConfig; } return { ...webpackConfig, resolve: { ...webpackConfig.resolve, mainFields: [browser, module, main], }, }; };从源码可以确认三点事实默认值为启用。注释明确写着 “Default to true, if undefined”即只要你不写enableIvy就按开启处理显式false走短路分支。当enableIvy false时该 webpack 预设直接返回传入的原始webpackConfig不对resolve做任何改写开启时的唯一改动点是模块解析字段。启用状态下webpack 的resolve.mainFields会被设为[browser, module, main]即让打包器优先解析依赖包中的browser字段产物。换句话说关闭 Ivy 增强的实际可观察影响是让模块解析回退到你项目自身或默认配置指定的解析顺序。同一文件还导出了runNgcc辅助函数framework-preset-angular-ivy.ts#L36-L52其注释说明它用于 “Run ngcc for converting modules to ivy format before starting storybook”即通过angular/compiler-cli/ngcc的process()为node_modules生成 Ivy 入口格式产物。这份代码揭示了该预设文件承载的“Ivy 支持逻辑”的历史职责——但就当前仓库的调用链而言enableIvy: false分支在 webpack 预设层立即返回实际直接生效的部分是上述mainFields的解析调整。四、该预设何时被加载preset 注册机制为什么在main.ts里写一个enableIvy就会影响 webpack 配置原因是该文件本身是作为 Storybook 的 preset 被注册的。查看 code/frameworks/angular/src/preset.ts#L6-L9export const addons: PresetPropertyaddons [ fileURLToPath(import.meta.resolve(storybook/angular/server/framework-preset-angular-cli)), fileURLToPath(import.meta.resolve(storybook/angular/server/framework-preset-angular-ivy)), ];storybook/angular的 preset 会把 Angular CLI 预设与 Ivy 预设都挂载进 addons。因此当 Storybook 启动、webpack 配置流水线执行到 Ivy 预设的webpack导出时它就能读取到你在framework.options里写的enableIvy值并决定是否改写resolve.mainFields。补充一点框架的options解析发生在启动早期读取enableIvy时对值为false与未定义做了区分处理——只有严格等于false才触发短路而null或undefined一律视作默认开启。所以如果你希望关闭增强必须显式写false。五、什么场景才需要设置enableIvy: false从当前 Angular 生态与仓库代码可以归纳出如下判断含推断成分请结合你的实际依赖判断绝大多数现代 Angular 项目不需要此配置。自 Angular 全面采用 Ivy 编译器以来依赖生态与构建链默认按 Ivy 产物工作Storybook 的默认开启行为即为这些项目设计。显式关闭适合排查类问题。若你在 Storybook 预览中出现与模块解析相关的异常例如某个依赖因mainFields优先命中browser字段而导致运行时不一致可以临时把enableIvy: false作为对照实验观察是否为默认的mainFields调整所引起。配置应成对出现、便于回溯。该选项被设计成 framework 级开关与.storybook/main.ts中的其他 framework 选项写法见 angular-framework-options.md平级维护一旦设置建议在注释或变更说明中写明关闭原因避免未来维护者误删。关于历史上另一个与之相关的选项当前仓库docs/_snippets中还保留着enableNgcc的写法示例angular-framework-options-enable-ngcc-false.md用于展示同时关闭 ngcc 处理的形式。但需要注意的是当前仓库中AngularOptions类型实际只声明了enableIvy见上文 types.ts因此在以本仓库代码为准的版本里应以enableIvy作为主要可用的框架选项。六、小结enableIvy: false写在.storybook/main.ts的framework.options中存在 CSF 3StorybookConfig与 CSF NextdefineMain两种等价写法需原样继承上面的完整配置骨架。类型上它是可选的布尔字段未定义时默认按开启处理源码注释 “Default to true, if undefined”。开启状态下Ivy 预设会把 webpack 的resolve.mainFields调整为[browser, module, main]显式设为false则直接返回原始 webpack 配置不做任何解析改写framework-preset-angular-ivy.ts#L54-L70。该预设经 preset.ts 的 addons 列表自动注入这是它能在构建期读取框架选项的原因。现代 Angular 项目通常无需关闭它更适合作为模块解析异常时的显式对照选项并应与同目录其他 framework options 示例一并阅读维护。【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表