我正在探索具有角度的Nx (这两者都是比较新的),并试图找出如何生成这样一个组件库:
理想的设置是这样的:
repo
|--apps
|--normal-app (can import just card or button, without pulling in both)
|--libs
|--ui (lists individually exportable components, and has a servable Storybook)
|--.storybook
|--card
|--button
在介绍了如何创建共享组件库的一般Nx教程以及设置Nx故事书的指南之后,我为该库目录生成了一个UI库,并设置了一个故事簿示意图(如果这是正确的话)。
希望我的所有共享组件都在一个库中,并将Storybook设置为自动生成每个组件并为每个组件提供故事--但这样就能够单独地将组件从这个库中拉到其他应用程序中,而不必占用整个庞大的UI库。
我成功地构建了一个UI库和其中的两个组件。我成功地在那个库里建立了故事簿。然后,我从UI库中的UIModule
文件(公共API)中导入了index.ts
,并使用了模板中的两个组件之一。
但是,当我构建导入库的应用程序时,产品构建包含了两个组件,尽管我使用了一个组件。这是有道理的,因为我正在导入UiModule
。然而,这是不理想的。
我希望创建一个安装程序,允许库中的组件与Storybook安装程序并置,可以单独导入。
有没有办法做到这一点,而不彻底改变NX设置?到目前为止,我已经探索了两种主要的选择。一是将所有组件分解到自己的UI库中,将它们全部导入到为Storybook设置的一个单独的应用程序中,然后将它们单独导入到一个主应用程序中。就像这样(尝试#1):
repo
|--apps
|--storybook-app (imports all)
|--other-app (imports just button)
|--libs
|--button
|--card
不过,这并不理想,原因有几点:
作为第二次尝试(#2),我尝试将每个组件作为共享目录中的单独库生成:
repo
|--apps
|--storybook-app (imports all)
|--other-app (imports just button)
|--libs
|--ui (just a directory; not a "project")
|--button (module; has separate component dir beneath)
|--card
这本身有一些缺点:
ui
目录中,但是因为这不是一个“项目”,所以当我尝试使用VSCode NX扩展时,我会得到一个VSCode。我可以构建上面描述的一个版本(可能是#2),但我怀疑对于一个看似常见的用例,有一些最佳实践。我的困惑似乎很大程度上源于角度依赖注入。(在React应用程序中,您只需导入一个组件,但在角度上,每个组件属于一个模块,具体而言,也需要注入该组件。拥有特定于组件的模块是一种糟糕的实践吗?)
有谁知道满足这些理想规格的惯用/最佳实践方法(有单独导出组件的共享故事书库,还是在NX中使用自动生成故事的拆分组件)?
发布于 2020-04-01 16:14:56
对于这个问题,我还没有找到一个完全令人满意的解决方案,但我最后还是这样做了。它接近于上面的第二条:
libs/ui
目录(不是项目)component-lib
库。(而不是应用程序,因为Storybook有自己独立的运行命令)。libs/ui
目录下的所有libs/ui
文件。这样,component-lib
目录就会自动添加每个新的组件,每当我添加一个组件时,我就不用担心一堆样板了。另外,每个组件都可以单独导入,而无需在包中拖动。
我不会共享我的整个组件生成器脚本,但是它是一个基本的JS文件
ui
dir中生成库。fs
在库中编写适当的.stories.ts
文件。然后,在我的component-lib
目录中,我修改了.storybook/config.js
中的最后一行,以要求ui
库下的所有故事:
configure(require.context('../../ui', true, /\.stories\.tsx?$/), module);
这感觉有点烦人,特别是生成器脚本。但很管用!
发布于 2020-04-15 10:11:23
您还可以使用您的初始方法,为您想要提供的每个组件集(甚至只有一个组件)生成一个模块(而不是库)。然后导出index.ts中的所有模块
nrwl/nx中的角库必须至少包含一个模块(异常是数据库),就像您的常规角度项目必须包含app.module一样。但这并不意味着在库中不能有多个模块导出。使用多个模块,您可以从库中独立导入它们。
示例
import { module1 } from '@mylib'
import { module2 } from '@mylib'
发布于 2022-08-28 10:29:29
您可以在NX https://nx.dev/storybook/overview-angular中找到解决方案。
一步一步的小步骤:
yarn add --dev @nrwl/storybook
nx g @nrwl/angular:storybook-configuration project-name
nx run project-name:storybook
在任何组件附近创建*stries.ts
。
不要忘记向main.js和tsconfig.json添加到故事文件的链接
https://stackoverflow.com/questions/60939889
复制相似问题