Tailwind 的 @apply 指令适用于前端,但不适用于 Angular Universal 的后端

Posted

技术标签:

【中文标题】Tailwind 的 @apply 指令适用于前端,但不适用于 Angular Universal 的后端【英文标题】:Tailwind's @apply directive works in frontend but not on backend with Angular Universal 【发布时间】:2021-01-30 05:02:21 【问题描述】:

我有一个 Angular 2 应用程序,版本 9.1,它使用 Angular Universal 的服务器端渲染功能来交付我们的页面。该应用程序还使用 Tailwind CSS 框架。为了支持 Tailwind,我们使用 @angular-builders/custom-webpack:browser builder 构建架构师和 @angular-builders/custom-webpack:dev-server 服务架构师。

对于 Tailwind 安装,我们只需向 Webpack 添加一条规则,该规则将合并到 Angular 自己的 Webpack 定义的末尾。下面列出的是我们添加的规则。


  test: /\.scss$/,
  use: [
    
      loader: 'postcss-loader',
      options: 
        ident: 'postcss',
        syntax: 'postcss-scss',
        plugins: () => [
          require('postcss-import'),
          require('tailwindcss')('apps/dec-mkt/tailwind.config.js'),
          require('autoprefixer'),
          purgecss
        ]
      
    
  ]

该应用程序在大多数情况下都可以正常运行。 Tailwind 的 purgecss 功能运行良好,最终一切都可以正确渲染,但 Tailwind 的一个重要功能似乎无法正确利用。 (@apply 功能)[https://tailwindcss.com/docs/extracting-components] 有效,但仅在浏览器呈现页面后在前端计算。作为一个例子,这里是从 s-s-r 服务器传递到文档中浏览器的 CSS 的 sn-p。

<style ng-transition="serverApp">
  .menu-item[_ngcontent-sc34]
      @apply flex flex-col items-center justify-center text-center px-0 mx-2 py-3 text-base font-bold;
      max-width: 120px;
  
</style>

如您所见,@apply 不是在服务器/构建时计算的。然而,在应用程序在浏览器中激活后,这些 @apply 引用确实会得到正确转换。然而,这个问题是每个使用 @apply 的 CSS 规则都没有设置样式,导致跳动。我觉得奇怪的是,这甚至可以在浏览器中工作,因为浏览器通常不打算进行这样的处理。有没有人了解 Angular 的构建过程是如何工作的,可能有助于解决这个问题?

【问题讨论】:

你找到解决办法了吗? @Starscream 我在下面提供了答案。 【参考方案1】:

Angular 11.2 现在默认完全支持顺风。

【讨论】:

【参考方案2】:

我有同样的症状。在服务器端计算样式中包含 @apply 指令对我来说是一个明确的信号,表明 tailwind 没有在服务器包上运行。

这很难诊断,因为主要样式包来自浏览器构建并按预期工作,但我的组件样式表中的所有样式都没有正确编译。

我意识到我忘了更新我的angular.json 服务器配置。通过自定义 webpack 配置配置 tailwind,这是正确的配置,也有效地将自定义 webpack 配置应用到服务器:

"server": 
  "builder": "@angular-builders/custom-webpack:server",
  "options": 
    "customWebpackConfig": 
      "path": "./webpack.config.ts"
    
    // ...
  ,
  // ...

请注意,如果您使用 Angular 的本机顺风支持(版本 11.2),您不必这样做,它可以开箱即用。

【讨论】:

以上是关于Tailwind 的 @apply 指令适用于前端,但不适用于 Angular Universal 的后端的主要内容,如果未能解决你的问题,请参考以下文章

提取组件时的 Tailwind @apply 指令与纯 CSS

Laravel Tailwind 抽象在使用 @apply 指令时没有生效

覆盖链式选择器上的 Tailwind CSS @apply 指令

WebPack / 复制 Tailwind CSS 的 @apply 指令以远离 SASS 中的 @extend 的方法

`@apply` 不能与 `.text-md` 一起使用

Tailwind+ Nuxt:@apply 不适用于所有课程