【问题标题】:Does React or CRA optimize static statement? How to prevent static statement from getting optimized?React 或 CRA 是否优化静态语句?如何防止静态语句得到优化?
【发布时间】:2021-03-09 12:34:51
【问题描述】:

让我们考虑下面的代码 sn-p,它是从React tutorial demo calculator 修改而来的。分别在赋值语句之前放置了两个日志记录调用。

export default class Button extends React.Component {
  // <= The newly added content
  static propTypes = (console.log("static statement executed"), {. 
    name: PropTypes.string,
    orange: PropTypes.bool,
    wide: PropTypes.bool,
    clickHandler: PropTypes.func,
  });
  // <= The newly added content
  member = (console.log("normal statement executed"), 1);  

  handleClick = () => {
    this.props.clickHandler(this.props.name);
  };

  render() {
    const className = [
      "component-button",
      this.props.orange ? "orange" : "",
      this.props.wide ? "wide" : "",
    ];

    return (
      <div className={className.join(" ").trim()}>
        <button onClick={this.handleClick}>{this.props.name}</button>
      </div>
    );
  }
}

在执行npm run build 并检查build/static/ 下的工件后,我发现与静态分配关联的第一个日志记录语句消失了,而第二个记录语句保留了下来。此外,查看页面的浏览器控制台确实记录了第二条消息,但没有记录第一条消息。

所以我想知道 React 或 CRA 是否优化了任何静态语句?如果是这样,如何防止这样的语句得到优化?

【问题讨论】:

  • 有趣的问题;为什么要阻止优化?
  • @ch271828n 您好,我正在使用 JavaScript 覆盖工具 nyc 来检测我的代码。 nyc 在代码行之前使用计数器来确定行是否被执行。在我上面的情况下,nyc 实际上在静态语句中插入了计数器,但是这些计数器在构建过程中消失了,并且生成的覆盖率数据是错误的。我想这与 react 或 cra 有关。为简单起见,我使用console.log 来演示我的问题

标签: javascript reactjs web babeljs create-react-app


【解决方案1】:

如果您正在创建生产版本,我相信 propTypes 已被剥离。 here你可以看到CRA的变化。使用的插件是babel-plugin-transform-react-remove-prop-types。因此,为什么您的第二个语句正在评估,而不是 propTypes 下的那个。

【讨论】:

  • 谢谢。我尝试使用提到的配置here,但它似乎对我不起作用,第一条语句仍然得到优化。还有其他方法可以禁用此插件吗?
  • 你能发布你的排除声明吗?确保它在 package.json 配置文件中
猜你喜欢
  • 2023-03-22
  • 2011-01-14
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2015-11-27
  • 2015-07-27
相关资源
最近更新 更多