You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

封装@pigment-css/react的styled函数后渲染组件报错求助

问题:封装@pigment-css/react的styled函数后在Vite/Next.js中渲染报错

我尝试封装@pigment-css/react中的styled函数,最简代码如下:

import { styled } from "@pigment-css/react"

function myStyled(tag: "div" | "p" | "span") {
  return styled(tag)
}

const Root = myStyled("div")({
  margin: "auto",
  maxWidth: "36rem",
})

在Vite和Next.js环境中渲染Root组件时均出现错误。


原因分析

@pigment-css/react是编译时CSS-in-JS方案,它的styled函数依赖编译阶段的静态分析来提取样式、生成对应的CSS类名。直接简单封装styled(tag)会破坏编译器对styled调用的识别,导致无法正确处理样式的编译与注入,进而引发渲染错误。


解决方案

需要确保封装后的函数能被pigment-css的编译器正确识别,同时保留原styled函数的类型与功能。可以通过以下两种方式修复:

方式1:保留泛型与完整类型签名

import { styled } from "@pigment-css/react";

type ValidTags = "div" | "p" | "span";

function myStyled<T extends ValidTags>(tag: T) {
  return styled(tag);
}

const Root = myStyled("div")({
  margin: "auto",
  maxWidth: "36rem",
});

方式2:带自定义逻辑的高阶函数封装

如果需要添加自定义逻辑(比如默认样式),可通过嵌套函数传递参数,确保编译器仍能识别底层的styled调用:

import { styled } from "@pigment-css/react";

function myStyled(tag: "div" | "p" | "span") {
  return (styles: Record<string, string | number>) => {
    // 自定义逻辑:添加全局默认样式
    const defaultStyles = {
      boxSizing: "border-box",
    };
    return styled(tag)({...defaultStyles, ...styles});
  };
}

const Root = myStyled("div")({
  margin: "auto",
  maxWidth: "36rem",
});

关键注意点

  • 避免破坏styled函数的调用链,确保编译器能追踪到原始的styled调用
  • 保留类型定义,防止类型丢失导致的编译或运行时错误
  • 自定义逻辑需围绕样式对象展开,不要干扰pigment-css的静态分析流程

内容的提问来源于stack exchange,提问作者Scarass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:28:12