如何在 React 中找到未使用的样式定义?

Posted

技术标签:

【中文标题】如何在 React 中找到未使用的样式定义?【英文标题】:How to find unused style definitions in React? 【发布时间】:2017-08-14 18:53:25 【问题描述】:

有没有办法在基于 React 的项目中自动找到未使用的样式定义,就像这个例子一样?

之前:

const styles = StyleSheet.create(
  name: 
    color: '#e5e5e5'
  
);

const Hello = React.createClass(
  render: function() 
    return <Text style=styles.name>Hello this.props.name</Text>;
  
);

之后:

开发者更改了样式,不再需要“名称”。这种死气沉沉的代码怎么能自动找到呢?

const styles = StyleSheet.create(
  name:  // Redundant now!
    color: '#e5e5e5'
  ,
  foo: 
    color: '#e2e3b5'
  
);

const Hello = React.createClass(
  render: function() 
    return <Text style=styles.foo>Hello this.props.name</Text>;
  
);

【问题讨论】:

你试过 ESLint 吗?我不确定它是否会检测到这个特定示例,但它通常有助于识别未使用的变量和定义。 @MartinMihaylov 对 styles.name 的引用在 JSX/html 中,所以我很确定 Linter 将无法捕捉到它 =/ CSS 模块看起来很有前途medium.com/@pioul/… 【参考方案1】:

可能的解决方案

1) helpers.js

// helpers.js
import ReactTestUtils from 'react-addons-test-utils'

export function unusedStyles(component, styles) 
    const renderer = ReactTestUtils.createRenderer();
    renderer.render(component);
    const rendered = renderer.getRenderOutput();
    const myStylesInUse = stylesInUse(rendered);
    return filterStyles(styles, myStylesInUse);


function stylesInUse(el) 
    var arr = [];

    function go(el) 
        const  children, style  = el.props;
        const childrenType = Object.prototype.toString.call(children);
        style && arr.push(style)
        if(childrenType === '[object Object]') 
            go(children);
         else if(childrenType === '[object Array]') 
            children.forEach(child =>  go(child) );
        
    

    go(el);

    return arr;


function filterStyles(styles, compStyles) 
    const arr = [];

    for(let key in styles) 
        const found = compStyles.find(item => item === styles[key]);
        if(!found) arr.push(key)
    

    return arr;

2) 组件.js

import  unusedStyles  from './helpers';

const styles = StyleSheet.create(
  one: 
    color: 'one'
  ,
  two: 
    color: 'two'
  ,
  three: 
    color: 'three'
  
);

class Hello extends Component 

  render() 
    return (
      <div style=styles.one>
        <div style=style.two>Hello!</div>
      </div>
    )
  



// here you can test your styles
const myUnusedStyles = unusedStyles(<Hello />, styles)
// => ['three']

if(myUnusedStyles.length) 
  console.log('UNUSED STYLES DETECTED', myUnusedStyles);


export default Hello

【讨论】:

以上是关于如何在 React 中找到未使用的样式定义?的主要内容,如果未能解决你的问题,请参考以下文章

React-Stripe-Elements 元素未按预期呈现样式

React Antd 中如何修改覆盖默认样式及样式引用

React Antd 中如何修改覆盖默认样式及样式引用

react antd Tabs组件如何修改默认样式-友好的解决方法

在 React 中运行搜索后如何显示“未找到记录”

react-native-web 更新:TypeError:无法读取未定义的属性“样式”