reactjs - Tailwind css 在构建和部署后无法在 Vercel 上运行
问题描述
我正在使用 Tailwind CSS 来设置我的 Web 应用程序的样式,在本地,它运行良好,但是当我构建我的 GitHub 存储库并将其部署在 Vercel 上时,它不起作用,问题出在哪里?
我的一个上校:
<div
className={`${classes.allTechnicalList} flex flex-wrap items-center justify-center px-0`}
>
<Col
lg={2}
md={6}
sm={6}
xs={12}
className={`lg:px-0.5 md:pr-0 md:pl-8 py-4 ${classes.allTechnicalListCol}`}
>
<div className="imgBorder text-center rounded-lg shadow block flex-wrap justify-center items-center px-5 pt-8 pb-16 lg:mb-12 h-44 lg:w-48">
<Image
className="max-w-full h-full m-auto"
alt=""
src="/php-icon.png"
/>
<p className="text-sm space-x-1 m-0 pt-2 pb-4">PHP</p>
</div>
</Col>
.
.
.
如您所见,在本地col
显示flex
在服务器上,但在服务器上却不是。
这是我的 taiwlind 配置:
module.exports = {
purge: ["./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.
{js,ts,jsx,tsx}"],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {
transitionDuration: ["hover", "focus"],
},
fontSize: {
sm: ["15px"],
base: ["16px", "24px"],
lg: ["25px", "28px"],
xl: "40px",
},
},
variants: {
extend: {},
},
corePlugins: {
container: false,
},
plugins: [
function ({ addComponents }) {
addComponents({
".container": {
maxWidth: "100%",
"@screen sm": {
maxWidth: "600px",
},
"@screen md": {
maxWidth: "765px",
},
"@screen lg": {
maxWidth: "1320px",
},
"@screen xl": {
maxWidth: "1320px",
},
},
});
},
],
};
这是 postccs.config.js:
module.exports = {
plugins: [
"tailwindcss",
"postcss-flexbugs-fixes",
[
"postcss-preset-env",
{
autoprefixer: {
flexbox: "no-2009",
},
stage: 3,
features: {
"custom-properties": false,
},
},
],
],
};
解决方案
这很可能是因为 purging 而发生的, tailwind 有一个功能,它可以清除项目中未使用的类。
要验证是否是这种情况,并排除Vercel 作为问题点,您可以:
- 使用创建新导出
npm run build && npm run export
- 服务导出,您可以使用简单的 http 服务器或hot-reload-server等工具来执行此操作
- 在本地测试一下
如果您看到本地也缺少相同的类,那么肯定是由以下行引起的;
{`lg:px-0.5 md:pr-0 md:pl-8 py-4 ${classes.allTechnicalListCol}`}
您会看到,当您将 css 作为模块加载(next.js 功能)时,如果您随后使用串联生成模块类和静态类混合的动态字符串,tailwind 会错过动态导入,因为它不了解 next.js 的构建方式作为模块导入的每个文件的随机类名,如果您检查任何 next.js dom,您会看到您的类的名称附加了一些哈希/随机字符串。
如果您导入一个名为 LoginPage.scss 的文件并使用它的 loginButton 类,
import loginStyles from 'styles/LoginPage.scss'
function fun() {
return <>
<button className={loginStyles.loginButton}>Login</button>
</>
}
LoginPage_LoginButton__1Auw8
next 生成的类基本上看起来像这样{moduleName}_{className}_{randomString}
。
为了解决这个问题;您需要将单个模块类附加到每个 className 道具,以便尾风可以正确推断类,将静态类和模块类分解为两个不同的 div 相应地应用样式。
<!-- wrong method -->
<div className={`mx-auto font-lato ${myModule.myClass}`}></div>
<!-- right method, use encapsulating divs to have one moduleClass passed as a single prop -->
<div className={`mx-auto font-lato`}>
<div className={myModule.myClass}>
</div>
</div>
如果必须将这些类应用于同一个 div,请考虑在样式模块中创建一个新类并直接导入它。
阅读有关编写可清除 HTML的更多信息
推荐阅读
- java - 如何从 ArrayList (Java) 中存储另一个数组的 ArrayList 获取数据?
- sql - Bigquery - 如何根据聚合列选择前 50 个元素,分组为 3 列
- python - 为什么 Django rest 框架是 restful?
- android - 在android中的类内的对话框片段的线性布局中添加textview
- docker - 无法运行 mopidy docker
- python - 为什么我不能使用 cartopy 绘制同一数据集的某些时间平均值?
- python - 在 Python 中为类提供可选函数的最佳实践
- email - 退回、阅读和送达回执以及电子邮件标题
- php - Laravel Service Provider - 从方法链中的中间方法获取类实例
- python - 如何在python中让程序每天在特定时间提醒我?