PostCSS 嵌套 CSS 变量在 Tailwind CSS & Next.js 中不起作用

PostCSS nesting with CSS variables isn't working in Tailwind CSS & Next.js

我正在尝试使用 PostCSS 嵌套 CSS 变量,但它根本不会转换 CSS 变量。

相反,它在 DOM 中为 CSS 变量显示 Invalid property value

我的 tailwind.css 文件包含一堆 CSS 变量:

tailwind.css

@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

@layer base {
  :root {
    --font-mono: 'Fira Mono, monospace';

    --text-1: '12px';
    --text-2: '14px';

    --colors-black: 'rgba(19, 19, 21, 1)';
    --colors-white: 'rgba(255, 255, 255, 1)';
    --colors-gray: 'rgba(128, 128, 128, 1)';
    --colors-blue: 'rgba(3, 136, 252, 1)';
    --colors-red: 'rgba(249, 16, 74, 1)';
    --colors-yellow: 'rgba(255, 221, 0, 1)';
    --colors-pink: 'rgba(232, 141, 163, 1)';
    --colors-turq: 'rgba(0, 245, 196, 1)';
    --colors-orange: 'rgba(255, 135, 31, 1)';

    --space-1: '4px';
    --space-2: '8px';
    --space-3: '16px';

    --radii-1: '2px';
    --radii-2: '4px';
  }

  pre {
    --background: 'hsla(206 12% 89.5% / 5%)';
    --text: var('--colors-white');
    --syntax1: var('--colors-orange');
    --syntax2: var('--colors-turq');
    --syntax3: var('--colors-pink');
    --syntax4: var('--colors-pink');
    --comment: var('--colors-gray');
    --removed: var('--colors-red');
    --added: var('--colors-turq');

    box-sizing: 'border-box';
    padding: var('--space-3');
    overflow: 'auto';
    font-family: var('--font-mono');
    font-size: var('--text-2');
    line-height: var('--space-3');
    whitespace: 'pre';
    background-color: var('--background');
    color: var('--text');

    '& > code': {
      display: 'block';
    }

    '.token.parameter': {
      color: var('--text');
    }

    '.token.tag, .token.class-name, .token.selector, .token.selector .class, .token.function': {
      color: var('--syntax1');
    }

    '.token.attr-value, .token.class, .token.string, .token.number, .token.unit, .token.color': {
      color: var('--syntax2');
    }

    '.token.attr-name, .token.keyword, .token.rule, .token.operator, .token.pseudo-class, .token.important': {
      color: var('--syntax3');
    }

    '.token.punctuation, .token.module, .token.property': {
      color: var('--syntax4');
    }

    '.token.comment': {
      color: var('--comment');
    }

    '.token.atapply .token:not(.rule):not(.important)': {
      color: 'inherit';
    }

    '.language-shell .token:not(.comment)': {
      color: 'inherit';
    }

    '.language-css .token.function': {
      color: 'inherit';
    }

    '.token.deleted:not(.prefix), .token.inserted:not(.prefix)': {
      display: 'block';
      px: '';
      mx: '-';
    }

    '.token.deleted:not(.prefix)': {
      color: var('--removed');
    }

    '.token.inserted:not(.prefix)': {
      color: var('--added');
    }

    '.token.deleted.prefix, .token.inserted.prefix': {
      userselect: 'none';
    }
  }
}

我的 PostCSS 配置包含 postcss-preset-env already which should support for CSS nesting. I also installed postcss-nested & postcss-css-variables,以防万一。

postcss.config.js

module.exports = {
  plugins: [
    'postcss-import',
    'tailwindcss',
    'postcss-flexbugs-fixes',
    'postcss-nested',
    'postcss-css-variables',
    [
      'postcss-preset-env',
      {
        autoprefixer: {
          flexbox: 'no-2009',
        },
        stage: 3,
        features: {
          'custom-properties': false,
          'nesting-rules': true,
        },
      },
    ],
  ],
}

这里转载→https://github.com/deadcoder0904/postcss-tailwind-next-bug

运行 应用程序并检查 DOM 以在显示 Invalid property value.

的样式面板中查看 CSS 变量

如何获取 CSS 变量以与 Tailwind CSS 一起使用?

完整的解决方案是删除 CSS 中的引号和对象符号。我从 CSS-in-JS 复制了整个东西,但忘了删除引号和对象符号,也就是 :

tailwind.css

@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

@layer base {
  :root {
    --font-mono: 'Fira Mono, monospace';

    --text-1: 12px;
    --text-2: 14px;

    --colors-black: rgba(19, 19, 21, 1);
    --colors-white: rgba(255, 255, 255, 1);
    --colors-gray: rgba(128, 128, 128, 1);
    --colors-blue: rgba(3, 136, 252, 1);
    --colors-red: rgba(249, 16, 74, 1);
    --colors-yellow: rgba(255, 221, 0, 1);
    --colors-pink: rgba(232, 141, 163, 1);
    --colors-turq: rgba(0, 245, 196, 1);
    --colors-orange: rgba(255, 135, 31, 1);

    --space-1: 4px;
    --space-2: 8px;
    --space-3: 16px;

    --radii-1: 2px;
    --radii-2: 4px;
  }

  pre {
    --background: hsla(206 12% 89.5% / 5%);
    --text: var(--colors-white);
    --syntax1: var(--colors-orange);
    --syntax2: var(--colors-turq);
    --syntax3: var(--colors-pink);
    --syntax4: var(--colors-pink);
    --comment: var(--colors-gray);
    --removed: var(--colors-red);
    --added: var(--colors-turq);

    box-sizing: border-box;
    padding: var(--space-3);
    overflow: auto;
    font-family: var(--font-mono);
    font-size: var(--text-2);
    line-height: var(--space-3);
    white-space: pre;
    background-color: var(--background);
    color: var(--text);

    & > code {
      display: block;
    }

    .token.parameter {
      color: var(--text);
    }

    .token.tag,
    .token.class-name,
    .token.selector,
    .token.selector .class,
    .token.function {
      color: var(--syntax1);
    }

    .token.attr-value,
    .token.class,
    .token.string,
    .token.number,
    .token.unit,
    .token.color {
      color: var(--syntax2);
    }

    .token.attr-name,
    .token.keyword,
    .token.rule,
    .token.operator,
    .token.pseudo-class,
    .token.important {
      color: var(--syntax3);
    }

    .token.punctuation,
    .token.module,
    .token.property {
      color: var(--syntax4);
    }

    .token.comment {
      color: var(--comment);
    }

    .token.atapply .token:not(.rule):not(.important) {
      color: inherit;
    }

    .language-shell .token:not(.comment) {
      color: inherit;
    }

    .language-css .token.function {
      color: inherit;
    }

    .token.deleted:not(.prefix),
    .token.inserted:not(.prefix) {
      display: block;
      px: ;
      mx: -;
    }

    .token.deleted:not(.prefix) {
      color: var(--removed);
    }

    .token.inserted:not(.prefix) {
      color: var(--added);
    }

    .token.deleted.prefix,
    .token.inserted.prefix {
      userselect: none;
    }
  }
}

出于某种原因,在我的一个项目中,postcss-preset-env 没有工作,所以我不得不在 postcss.config.js 中使用 postcss-nested & postcss-css-variables

postcss.config.js

module.exports = {
    plugins: [
        'postcss-import',
        'tailwindcss',
        'postcss-flexbugs-fixes',
        'postcss-nested',
        'postcss-custom-properties',
        'autoprefixer',
        // [
        //  'postcss-preset-env',
        //  {
        //      autoprefixer: {
        //          flexbox: 'no-2009',
        //      },
        //      stage: 3,
        //      features: {
        //          'custom-properties': true,
        //          'nesting-rules': true,
        //      },
        //  },
        // ],
    ],
}

但是 postcss-preset-env 在另一个具有相同配置的项目中工作。我已经通过清理缓存、重新安装依赖项和复制粘贴相同的配置对其进行了多次测试,所以我很确定这不是我项目的问题。