JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://cdn.jsdelivr.net/npm/three@0.141/build/three.min.js"></script>

CSS

body {
	  margin: 0;
}

JavaScript

let clock;
let scene, camera, renderer, mixer;

init();
animate();

function init() {

  scene = new THREE.Scene();

  //

  camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 1000);
  camera.position.set(4, 4, 4);
  camera.lookAt(scene.position);

  //

  const axesHelper = new THREE.AxesHelper();
  scene.add(axesHelper);

  //

  const geometry = new THREE.ConeGeometry(0.5, 2);
  geometry.rotateX(Math.PI * 0.5)
  const material = new THREE.MeshNormalMaterial();
  const mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh);

  // set up rotation about x axis
  const xAxis = new THREE.Vector3(0, 1, 0);

  const q1 = new THREE.Quaternion().setFromAxisAngle(xAxis, 0);
  const q2 = new THREE.Quaternion().setFromAxisAngle(xAxis, Math.PI);
  const q3 = new THREE.Quaternion().setFromAxisAngle(xAxis, Math.PI * 2);
  const quaternionKF = new THREE.QuaternionKeyframeTrack('.quaternion', [0, 1, 2], [q1.x, q1.y, q1.z, q1.w, q2.x, q2.y, q2.z, q2.w, q3.x, q3.y, q3.z, q3.w]);

  const clip = new THREE.AnimationClip('Action', 3, [quaternionKF]);

  mixer = new THREE.AnimationMixer(mesh);
  const clipAction = mixer.clipAction(clip);
  clipAction.play();

  //

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

  //

  clock = new THREE.Clock();

  //

  window.addEventListener('resize', onWindowResize);

}

function onWindowResize() {

  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();

  renderer.setSize(window.innerWidth, window.innerHeight);

}

function animate() {

  requestAnimationFrame(animate);

  render();

}

function render() {

  const delta = clock.getDelta();

  if (mixer) {

    mixer.update(delta);

  }

  renderer.render(scene, camera);

}