Nx Nuxt Storybook 配置生成器实战指南:从@nx/nuxt:storybook-configuration到交互测试与 Story 自动化生成
【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx
@nx/nuxt:storybook-configuration是 Nx 为 Nuxt 项目提供的 Storybook 配置生成器,它在底层复用@nx/vue:storybook-configuration生成器,并额外注入 Nuxt 特有的样式导入与tsconfig.storybook.json处理,帮助你一键为 Nuxt 应用搭建基于 Vue 3 + Vite 的 Storybook 环境。读完本文,你将掌握该生成器的全部交互提示与命令行参数(interactionTests、generateStories、ignorePaths、js、tsConfiguration、configureStaticServe等),理解其内部调用链与测试验证方式,并能结合仓库源码灵活定制 Story 的生成范围与文件格式。
生成器概述:Nuxt 项目里的 Storybook 骨架
该生成器会为你的Nuxt项目搭建完整的 Storybook 配置。它的设计哲学是"复用而非重造":@nx/nuxt:storybook-configuration在底层直接调用@nx/vue:storybook-configuration生成器(见 packages/nuxt/src/generators/storybook-configuration/configuration.ts),而 Vue 生成器又会调用@nx/storybook的configurationGenerator,最终形成一条完整的生成链路:
@nx/nuxt:storybook-configuration └─ @nx/vue:storybook-configuration ├─ @nx/storybook configurationGenerator(生成 .storybook/main.ts、preview 等) └─ @nx/vue storiesGenerator(为组件生成 .stories.ts)最基本的用法是在终端中执行:
nx g @nx/nuxt:storybook-configuration project-name其中project-name是你要生成配置的 Nuxt 项目名。运行生成器时,Nx 会以交互式提示(prompt)的方式向你询问以下问题:
- 项目
name:要为哪个项目生成 Storybook 配置(必填,否则生成器无法运行)。 - 是否启用 Storybook 交互测试(
interactionTests):选择yes后,会在你的 stories 中添加play函数,安装全部所需依赖,并在项目project.json中生成一个test-storybook目标,其命令用于调用 Storybooktest-runner。 - 是否为项目中的组件自动生成 stories(
generateStories):选择yes后,会在每个组件旁边生成对应的.stories.ts文件。
关于交互测试的完整细节(play函数写法、test-runner使用方式等),可参考 Nx 官方文档中 Storybook for Vue 概览页 与 Nx Storybook 交互测试文档 的相关章节(对应仓库中的 overview-vue.md 与 storybook-interaction-tests.md)。
重要默认行为:默认情况下,该生成器会自动启用 Storybook 交互测试。如果你不希望启用,可以显式传入
--interactionTests=false,但官方并不推荐这样做——交互测试是保证组件行为正确性的重要手段。
交互测试背后的依赖:test-storybook目标
在 schema 中,interactionTests的默认值为true(见 packages/nuxt/src/generators/storybook-configuration/schema.json)。启用后,生成器会:
- 在 stories 文件中注入
play函数,模拟用户交互并断言结果; - 自动安装
@storybook/test-runner等必要依赖; - 在项目
project.json中注册test-storybook目标,方便你随时通过nx test-storybook project-name运行回归测试。
生成器内部实现:Nuxt 特有的三步定制
与纯 Vue 生成器相比,Nuxt 版本在调用 Vue 生成器之后还做了三件关键的事(见 configuration.ts):
① 判断源码目录结构。生成器读取项目的sourceRoot,根据它以/app还是/src结尾来决定源码目录名——Nuxt v4 默认使用app/目录,Nuxt v3 使用src/,旧版本向后兼容时回退到src:
const sourceDir = sourceRoot?.endsWith('/app') ? 'app' : sourceRoot?.endsWith('/src') ? 'src' : 'src'; // default to src for backward compatibility② 写入 Nuxt 特有的样式导入。生成器在.storybook/目录下(根据tsConfiguration决定是preview.ts还是preview.js)写入一行 CSS 导入,把 Nuxt 应用入口的全局样式带进 Storybook:
tree.write( joinPathFragments(root, '.storybook', 'preview.' + (tsConfiguration ? 'ts' : 'js')), `import '../${sourceDir}/assets/css/styles.css';` );这就是测试快照中preview.ts内容为import '../src/assets/css/styles.css';的原因(见snapshots/configuration.spec.ts.snap)。
③ 修正tsconfig.storybook.json。将compilerOptions.composite强制设为true,确保 Storybook 的 TypeScript 项目引用(project references)能正常工作:
updateJson(tree, `${root}/tsconfig.storybook.json`, (json) => { json.compilerOptions = { ...json.compilerOptions, composite: true }; return json; });生成器注册与版本校验
该生成器在@nx/nuxt插件的generators.json中注册(见 packages/nuxt/generators.json),工厂函数指向./dist/src/generators/storybook-configuration/configuration,schema 指向同目录下的schema.json,并在examplesFile字段中引用了本文所对应的 storybook-configuration-examples.md。生成器执行前还会调用assertSupportedNuxtVersion(tree)(见 configuration.ts),确保当前工作区使用的 Nuxt 版本在插件支持范围内。
完整参数一览(schema 定义)
除交互式提示外,该生成器还支持通过命令行显式传入以下参数,完整定义见 packages/nuxt/src/generators/storybook-configuration/schema.json,TypeScript 类型见同目录的 schema.d.ts:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
project | string | —(必填) | 要生成 Storybook 配置的项目名,支持别名name、projectName,也是第一个位置参数 |
interactionTests | boolean | true | 是否启用 Storybook 交互测试,别名configureTestRunner |
generateStories | boolean | true | 是否为项目中的组件自动生成*.stories.ts文件 |
configureStaticServe | boolean | true | 是否配置静态文件服务器目标,用于加速 CI 构建/测试 |
js | boolean | false | 生成 JavaScript 故事文件(.stories.js)而非 TypeScript |
tsConfiguration | boolean | true | 是否使用 TypeScript 配置(生成main.ts/preview.ts而非main.js/preview.js) |
linter | string | — | 运行 lint 检查的工具,可选eslint或oxlint |
ignorePaths | string[] | ["*.stories.ts,*.stories.tsx,*.stories.js,*.stories.jsx,*.stories.mdx"] | 查找组件时需要忽略的路径(glob 模式数组) |
其中project是唯一必填参数,不提供name时生成器无法工作。
实战示例
示例一:生成 Storybook 配置(基础用法)
nx g @nx/nuxt:storybook-configuration ui这将为ui项目生成 Storybook 配置,并默认使用TypeScript编写 Storybook 配置文件——即.storybook目录下的文件为.storybook/main.ts等。生成的main.ts快照内容如下(见 configuration.spec.ts.snap):
import type { StorybookConfig } from '@storybook/vue3-vite'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import { mergeConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; const config: StorybookConfig = { stories: ['../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'], addons: [], framework: { name: '@storybook/vue3-vite', options: {}, }, viteFinal: async (config) => mergeConfig(config, { plugins: [vue(), nxViteTsPaths()], }), }; export default config;可以看到,Nuxt 项目的 Storybook 使用@storybook/vue3-vite作为 UI 框架(这个选择来自 Vue 生成器内部传入的uiFramework: '@storybook/vue3-vite',见 packages/vue/src/generators/storybook-configuration/configuration.ts),并通过viteFinal合并了@vitejs/plugin-vue与 Nx 的nxViteTsPaths插件(后者负责解析 Nx workspace 的 TypeScript 路径别名)。同时生成的tsconfig.storybook.json会继承项目 tsconfig,开启composite,并把 stories 文件与.storybook/*.ts纳入编译范围(见 configuration.spec.ts.snap)。
示例二:生成 stories 时忽略特定路径
nx g @nx/nuxt:storybook-configuration ui --generateStories=true --ignorePaths="libs/ui/src/not-stories/**,**/**/src/**/*.other.*,apps/my-app/**/*.something.ts"这个命令会为ui项目生成 Storybook 配置,并为libs/ui/src/lib目录下的组件生成 stories,但会跳过以下三类文件:
libs/ui/src/not-stories目录下的组件;apps/my-app目录下以.something.ts结尾的文件;- 文件名符合
*.other.*模式的组件。
这一能力在"项目里包含不适合独立展示的组件(通常作为更大组件的一部分使用)"时非常有用。忽略规则基于 picomatch)。
默认忽略规则:Nx 默认会忽略所有已存在的 Story 文件本身,避免重复生成:
*.stories.ts, *.stories.tsx, *.stories.js, *.stories.jsx, *.stories.mdx不过,你可以像上面的例子一样轻松覆盖这一行为。
示例三:用 JavaScript 生成 stories
nx g @nx/nuxt:storybook-configuration ui --generateStories=true --js=true这会为ui项目中所有组件生成JavaScript版本的 stories 文件——即在组件旁边生成.stories.js而非.stories.ts。底层 stories 生成器在生成文件时会根据js参数从files/ts或files/js模板目录中选择对应模板(见 packages/vue/src/generators/stories/lib/component-story.ts)。
示例四:用 JavaScript 编写 Storybook 配置
nx g @nx/nuxt:storybook-configuration ui --tsConfiguration=false默认情况下生成器使用 TypeScript 编写 Storybook 配置文件。传入--tsConfiguration=false后,.storybook目录下生成的文件将是 JavaScript 版本(如.storybook/main.js)。tsConfiguration同样会影响 Nuxt 特有样式导入文件的命名——当其为false时,生成器写入的是.storybook/preview.js(见 configuration.ts)。
深入原理:组件发现、props 解析与"只给组件生成 stories"
理解生成器"如何找到组件、如何生成 stories"有助于你在复杂项目里预判结果。底层@nx/vue的 stories 生成器(见 stories.ts)会扫描以下三类目录:
{sourceRoot}/app:应用默认组件目录(Nuxt v4 的app/结构);{sourceRoot}/lib:库默认组件目录;{sourceRoot}/components:Nuxt 特有的附加组件目录。
扫描时会跳过以_开头的私有文件、命中ignorePaths的文件,以及已经存在.stories.js/.stories.ts的文件,只对*.vue文件生成 stories。
页面不会生成 stories——这一点有测试明确验证:在 configuration.spec.ts 中,测试在src/components/my-component/my-component.vue旁生成组件 story(断言.stories.ts存在),而src/pages/about.vue则被确认不会生成 story。这与 Nuxt 的"页面是路由单元、组件才是可复用 UI 单元"的理念一致。
props 自动提取:从defineProps到 Storybook args
生成 stories 时,生成器会解析组件源码中的defineProps类型(或props选项对象),把每个 prop 提取出来并生成对应的默认值(见 packages/vue/src/generators/stories/lib/utils.ts):string类型默认值取'<prop名>',boolean取false,number取0。随后这些 props 会被写入 Story 的args,让你在 Storybook 面板中直接调节属性。组件名中的连字符也会被转换为驼峰命名(camelCase),作为 Story 名使用。
这解释了为什么测试用例中的组件defineProps<{ name: string; displayAge: boolean; age: number }>()会对应生成三个带默认值的 args。
生成器行为验证:测试与快照
该生成器由 configuration.spec.ts 覆盖,核心测试断言:
- Vue 3 框架与样式导入:运行生成器后,
main.ts(使用@storybook/vue3-vite框架)、preview.ts(包含import '../src/assets/css/styles.css';)与tsconfig.storybook.json(composite: true)均与快照一致(configuration.spec.ts); - 只给组件生成 stories:
src/components下的组件生成.stories.ts,src/pages下的页面不生成(configuration.spec.ts)。
测试通过createTreeWithEmptyWorkspace构建空工作区,依次运行applicationGenerator与componentGenerator准备测试项目,再执行storybookConfigurationGenerator断言产物,整个流程可作为你排查生成器行为异常的参考。
小结与推荐用法
@nx/nuxt:storybook-configuration把 Nuxt、Vue、Storybook 三者无缝衔接:它继承了 Vue 生成器的全部能力(Vue 3 + Vite 框架、交互测试、Story 自动化生成、ignorePaths过滤、JS/TS 双格式),并针对 Nuxt 增加了全局样式导入、app/与src/双目录适配以及tsconfig.storybook.json修正。
推荐的日常用法组合:
# 基础:为 ui 项目生成 TypeScript 配置 + 交互测试 + 自动生成 stories nx g @nx/nuxt:storybook-configuration ui # 定制:跳过不适合独立展示的组件目录,同时改用 JavaScript 生成 stories nx g @nx/nuxt:storybook-configuration ui --ignorePaths="libs/ui/src/not-stories/**" --js=true # 运行生成的交互测试 nx test-storybook ui如果你需要更细粒度的控制——例如只给组件生成 stories 而不想改动 Storybook 主配置,也可以直接调用底层生成器:nx g @nx/vue:storybook-configuration <project>(不含 Nuxt 特有定制)或nx g @nx/vue:stories <project>(仅生成 stories)。结合本文的参数表与源码链路,你可以按项目实际情况灵活组合,快速搭建出一套可维护、可测试的 Nuxt 组件文档环境。
【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考