从我的图书馆顺风类NPM没有被拿起

ohfgkhjo  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(105)

我为React和Tailwind做了一个简单的组件库,我将发布到NPM。
我需要库使用从项目的顺风样式导入它。例如,如果颜色在项目中被覆盖,那么我需要组件使用这些颜色,而不是Tailwind的默认值。
当我导入一个组件时,它会正确地呈现在页面上,但是Tailwind编译器不会拾取这些类,所以这个组件没有样式化。
我可以通过在我的tailwind配置中添加库的路径来让它工作:

content: [
    "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
    "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
    "node_modules/my-library/*.{js,ts,jsx,tsx,mdx}", // Added this
  ],

然而,我不喜欢开发人员不得不这样做的经历。有更好的解决办法吗?

gr8qqesn

gr8qqesn1#

新增应答

我明白你的问题了。老实说,我想不出一个简单的解决办法。Tailwind不遵循依赖关系图--所以你必须像现在这样指定路径。
如果有多个这样的模块,你想从中提取样式,那么你可以写一个函数来为你附加路径。这将在一定程度上改善DX。

function getPathToModule(moduleName) {
    return `node_modules/${moduleName}/*.{js,ts,jsx,tsx,mdx}`
}

旧答案

当你构建你的组件库时,你会得到一个单独的.css输出,它捆绑了你的库所需的所有CSS。你可以在你的应用程序中导入CSS文件,样式就可以正常工作了。

// App.tsx
...
import 'my-library/styles.css'
...

如果您希望库样式与默认样式隔离,那么一个简单的解决方案是使用某个前缀修改库中的所有类。Tailwind提供了这个前缀配置,您可以将其用于此目的。此前缀配置将在您的库配置中,而不是实际的应用程序配置中。这只会修改您的内部库类,而应用程序中的类不会受到影响。这里不需要复杂的配置来覆盖类,因为类名是不同的(前缀)。因此不会有冲突。

vi4fp9gy

vi4fp9gy2#

更好的解决方案是在组件的样式中使用@apply指令来应用项目中的Tailwind类。
如果您的项目在Tailwind配置中定义了自定义配色方案,您可以使用@apply指令将这些颜色应用到组件的样式中,如下所示:

.btn {
  @apply bg-purple-500 text-white;
}

这将确保组件使用项目中的自定义颜色,而不是Tailwind的默认颜色。
另一个选择是在组件的CSS文件中使用Tailwind @layer指令。这将允许您使用项目的自定义颜色或其他自定义设置覆盖从库导入的任何Tailwind类。
如果你的库中有一个名为“MyButton”的组件,它使用Tailwind类bg-blue-500,你可以在你的项目的CSS文件中覆盖它,如下所示:

@layer components {
  .bg-blue-500 {
    background-color: red; // Use your project's custom color instead of Tailwind's default blue.
  }
}

将使用您的项目的自定义颜色,而不是Tailwind的默认颜色。但这只适用于从库导入的类。如果您在组件中使用自定义类或内联样式,它们将不受@layer指令的影响。

ibps3vxo

ibps3vxo3#

导入库时,您还需要导入在构建项目时由tailwindcss生成的CSS文件,您可以在build或dist文件夹中看到该文件。
import { MyLibrary } from 'my-library
import 'my-library/dist/style.css'
要使CSS文件可导入,在package.json中添加CSS文件的导出。

"exports": {    
  ".": {
    "import": "./dist/my-library.es.js"
   },
  "./dist/style.css": {   <--- add this
    "import": "./dist/style.css"
   }
},

你可以从这个npm库github repo中看到例子

相关问题