JSFiddle - React, Tailwind, and code Playground

HTML

<div class="calls"></div>

CSS

body {
	  margin: 0;
}

.calls {
  position: fixed; top: 0; left: 0; color: white;
}

JavaScript

import * as THREE from 'https://cdn.skypack.dev/three'

let camera, scene, renderer;
let geometry, material, mesh;

let calls = document.querySelector(".calls");

init();

function init() {

    camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
    camera.position.z = 1;

    scene = new THREE.Scene();
    
    geometry = new THREE.PlaneGeometry( 1, 1 );
    material = new THREE.MeshNormalMaterial();

    mesh = new THREE.Mesh( geometry, material );
    mesh.position.z = -1;
    scene.add( mesh );

    geometry = new THREE.BoxGeometry( 0.2, 0.2, 0.2 );
    material = new THREE.MeshNormalMaterial({
    	opacity: 0.5, side: THREE.DoubleSide, transparent: true
    });

    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );
    
    // hacky-hacky
    let hack = true;
    mesh.onBeforeRender = function() {
    	hack = false;
    };
    
    Object.defineProperty(material, 'transparent', {
      get: function() {
      	let t = hack; hack = true; return t
      }
    });

    renderer = new THREE.WebGLRenderer( { antialias: true } );
    renderer.setSize( window.innerWidth, window.innerHeight );
    renderer.setAnimationLoop( animation );
    document.body.appendChild( renderer.domElement );

}

function animation( time ) {

    mesh.rotation.x = time / 2000;
    mesh.rotation.y = time / 1000;

    renderer.render( scene, camera );
    
    calls.textContent = renderer.info.render.calls;

}