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

如何在SCSS文件中使用设计库导出的JS样式对象?

在SCSS中使用JS导出的设计系统对象

当然可以实现,下面是几种实用方案,比单纯转JSON更灵活:

方案1:Node.js脚本生成SCSS变量文件

写个简单的Node脚本,读取JS导出的样式对象,直接转换成SCSS变量/映射(map)文件,每次设计库更新时跑一遍脚本就行。

示例代码:
假设设计库导出的designTokens.js是这样:

export const typography = {
  fontFamily: {
    primary: '"Inter", sans-serif',
    secondary: '"Georgia", serif'
  },
  fontWeight: {
    regular: 400,
    bold: 700
  }
};

写个generate-scss-tokens.js脚本:

const fs = require('fs');
const { typography } = require('./designTokens.js');

// 转换为SCSS映射格式
let scssContent = '$typography: (\n';
Object.entries(typography.fontFamily).forEach(([key, value]) => {
  scssContent += `  fontFamily-${key}: ${value},\n`;
});
Object.entries(typography.fontWeight).forEach(([key, value]) => {
  scssContent += `  fontWeight-${key}: ${value},\n`;
});
scssContent += ');\n';

// 写入SCSS文件
fs.writeFileSync('./src/styles/design-tokens.scss', scssContent);

然后在package.json加个脚本:

"scripts": {
  "generate-tokens": "node generate-scss-tokens.js"
}

运行npm run generate-tokens就能生成可用的SCSS映射,之后在SCSS里用map-get($typography, fontFamily-primary)调用。

方案2:CSS Modules + 内联样式(混合场景)

如果你的项目用CSS Modules,也可以在JS组件里导入设计对象,把样式通过内联或者动态类名的方式应用,同时保留SCSS的其他样式逻辑。比如:

import { typography } from 'design-library';
import styles from './Component.module.scss';

function MyComponent() {
  return (
    <div className={styles.container} style={{ fontFamily: typography.fontFamily.primary }}>
      <h1 style={{ fontWeight: typography.fontWeight.bold }}>Hello</h1>
    </div>
  );
}

这种方式适合需要动态切换样式的场景,不用额外处理SCSS变量。

方案3:PostCSS插件自动转换

用postcss-js或者自定义PostCSS插件,在构建阶段把JS对象转换成CSS变量,然后在SCSS里直接引用这些变量。

比如先生成tokens.css:

const { typography } = require('./designTokens.js');
let cssContent = ':root {\n';
Object.entries(typography.fontFamily).forEach(([key, value]) => {
  cssContent += `  --font-family-${key}: ${value};\n`;
});
Object.entries(typography.fontWeight).forEach(([key, value]) => {
  cssContent += `  --font-weight-${key}: ${value};\n`;
});
cssContent += '}\n';
fs.writeFileSync('./src/styles/tokens.css', cssContent);

然后在SCSS里导入这个文件,用var(--font-family-primary)直接引用。

关于你试过的JSON方案补充

如果已经转成JSON,也可以用SCSS的json-decode函数(需要Dart Sass 1.33+)直接读取:

$tokens: json-decode(file-get('./design-tokens.json'));
body {
  font-family: map-get($tokens, 'fontFamily', 'primary');
  font-weight: map-get($tokens, 'fontWeight', 'bold');
}

不过这种方式每次编译都会读取文件,性能比预生成SCSS变量稍差,适合小体量的设计token。

内容的提问来源于stack exchange,提问作者shriprada.s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:42:35