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

如何修改Style Dictionary编译后变量名,去除父级目录前缀?

修改Style Dictionary变量命名规则,仅保留末级名称

要解决编译后变量名包含所有父级文件夹路径的问题,你需要注册一个自定义名称转换规则,让Style Dictionary只取token的末级节点名称作为变量名,具体步骤如下:

1. 添加自定义名称转换Transform

在你的transform-token.js中,新增一个name/only-last-part的transform,用来覆盖默认的名称生成逻辑:

StyleDictionary.registerTransform({
  name: 'name/only-last-part',
  type: 'name',
  transformer: (token) => {
    // token.path是包含从根到当前节点所有层级key的数组,比如['typography', 'typography', 'headers', 'subheaders', 'subheading1-400']
    const lastPart = token.path[token.path.length - 1];
    // 把连字符格式转成首字母大写的驼峰格式,匹配你期望的Subheading1400样式
    return lastPart.replace(/-([a-z0-9])/g, (match, char) => char.toUpperCase())
      .replace(/^[a-z]/, char => char.toUpperCase());
  }
});

2. 将自定义Transform加入Transform Group

把上面的transform替换掉transform group里默认的名称转换规则,以你定义的custom/css为例:

StyleDictionary.registerTransformGroup({
  name: 'custom/css',
  transforms: StyleDictionary.transformGroup['css'].map(transform => {
    // 替换所有默认的name类转换规则
    if (transform.startsWith('name/')) {
      return 'name/only-last-part';
    }
    return transform;
  }).concat([
    'size/px',
    'size/percent',
  ]),
});

如果你的配置里是生成JS变量,需要给JS平台单独注册transform group的话,可以参考:

// 可选:针对JS平台的自定义转换组
StyleDictionary.registerTransformGroup({
  name: 'custom/js',
  transforms: StyleDictionary.transformGroup['js'].map(transform => {
    if (transform.startsWith('name/')) {
      return 'name/only-last-part';
    }
    return transform;
  })
});

3. 完整修改后的transform-token.js

const StyleDictionary = require('style-dictionary');
const baseConfig = require('./style-dictionary.config.json');

// 自定义px单位转换
StyleDictionary.registerTransform({
  name: 'size/px',
  type: 'value',
  matcher: token => {
    return (token.unit === 'pixel' || token.type === 'dimension') && token.value !== 0;
  },
  transformer: token => {
    return `${token.value}px`;
  },
});

// 自定义百分比单位转换
StyleDictionary.registerTransform({
  name: 'size/percent',
  type: 'value',
  matcher: token => {
    return token.unit === 'percent' && token.value !== 0;
  },
  transformer: token => {
    return `${token.value}%`;
  },
});

// 自定义名称转换:仅保留末级节点名称
StyleDictionary.registerTransform({
  name: 'name/only-last-part',
  type: 'name',
  transformer: (token) => {
    const lastPart = token.path[token.path.length - 1];
    // 转驼峰并首字母大写,匹配你期望的Subheading1400格式
    return lastPart.replace(/-([a-z0-9])/g, (match, char) => char.toUpperCase())
      .replace(/^[a-z]/, char => char.toUpperCase());
  }
});

// 自定义CSS转换组,替换默认名称规则
StyleDictionary.registerTransformGroup({
  name: 'custom/css',
  transforms: StyleDictionary.transformGroup['css'].map(transform => {
    if (transform.startsWith('name/')) {
      return 'name/only-last-part';
    }
    return transform;
  }).concat([
    'size/px',
    'size/percent',
  ]),
});

// StyleDictionary.registerFilter({
//   name: 'validToken',
//   matcher: function(token) {
//     return ['dimension', 'string', 'number', 'color'].includes(token.type)
//   }
// });

StyleDictionary
  .extend(baseConfig)
  .buildAllPlatforms();

关键说明

  • token.path是Style Dictionary自动生成的层级数组,存储了当前token从根节点到自身的所有key,取最后一个元素即可得到末级名称。
  • 代码中的驼峰转换是为了匹配你期望的Subheading1400格式,如果不需要可以直接返回lastPart,或者根据需求调整转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:27