【问题标题】:Error in static import three.js getting started静态导入三.js 入门报错
【发布时间】:2020-08-03 20:17:06
【问题描述】:

我希望为测试网站静态导入 three.js。我对 html/js 有点生疏,所以我在这里做错了。

尝试从 https://threejs.org/docs/#manual/en/introduction/Installation 跟踪静态导入

以下代码(全部在一个 html 文件中):

<script type="module">

          // Find the latest version by visiting https://unpkg.com/three. The URL will
          // redirect to the newest stable release.
          // import * as THREE from 'https://unpkg.com/three@<VERSION>/build/three.module.js'; 
          
          import * as THREE from 'https://unpkg.com/three@0.119.1/build/three.js';

          const scene = new THREE.Scene();

        </script>

    <script>

        //if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

        var camera, scene, renderer;

        init();

        function init() {

            
            
            scene = new THREE.Scene();
            scene.add( new THREE.AmbientLight( 0x999999 ) );

            camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 500 );

            // Z is up for objects intended to be 3D printed.

            camera.up.set( 0, 0, 1 );
            camera.position.set( 0, -9, 6 );

            camera.add( new THREE.PointLight( 0xffffff, 0.8 ) );

            scene.add( camera );

            var grid = new THREE.GridHelper( 25, 1.0, 0xffffff, 0x555555 );
            grid.rotateOnAxis( new THREE.Vector3( 1, 0, 0 ), 90 * ( Math.PI/180 ) );
            scene.add( grid );

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

            var loader = new THREE.AMFLoader();
            loader.load( './models/amf/rook.amf', function ( amfobject ) {

                scene.add( amfobject );
                render();

            } );

            var controls = new THREE.OrbitControls( camera, renderer.domElement );
            controls.addEventListener( 'change', render );
            controls.target.set( 0, 1.2, 2 );
            controls.update();

            window.addEventListener( 'resize', onWindowResize, false );

        }

        function onWindowResize() {

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

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

            render();

        }

        function render() {

            renderer.render( scene, camera );

        }

    </script>

我得到以下信息:

v1.html:78 Uncaught ReferenceError: THREE is not defined
    at init (v1.html:78)
    at v1.html:72
init @ v1.html:78
(anonymous) @ v1.html:72
v1.html:62 Uncaught TypeError: THREE.Scene is not a constructor
    at v1.html:62
(anonymous) @ v1.html:62

接下来我可以尝试什么?

【问题讨论】:

  • 您收到此错误是因为您的第二个&lt;script&gt; 标签上没有type='module',并且您没有像在第一个&lt;script&gt; 标签中那样导入THREE .只有第一个脚本标记具有您的代码所需的步骤来理解 scene = new THREE.Scene(); 的含义。

标签: javascript html three.js


【解决方案1】:

您应该使用普通的脚本标签而不是类型模块。这将解决您的问题。没有理由这样做。

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r119/three.min.js" integrity="sha512-E1+SnTWyHYoY5MN8wpL0SI4TYbpWN12sHXyEViwbzzEyq6GHxQrPFDzEeUDab4emXcf3Yj41Tht2JZnpo3kjwA==" crossorigin="anonymous"></script>

【讨论】:

  • 很好用!在您在这里时进行真正的快速跟进:我如何包含THREE.AMFLoader 之类的内容?在我的示例 html 代码上面它有 &lt;script src="js/loaders/AMFLoader.js"&gt;&lt;/script&gt; 但我没有那个文件,我不知道在哪里可以静态找到它们
  • *.com/questions/50289524/… 快速搜索后,有大量的资源。我相信你,你明白了。
  • 好东西兄弟我明白了。我发现我需要的所有内容都可以轻松浏览并包含在https://unpkg.com/browse/three@0.119.1/examples/js/loaders/,供其他可能需要帮助的人使用。