Max*_*aet 4 javascript import shared-libraries three.js vue.js
有人可以解释一下我如何在vue组件中正确导入和使用three.js库吗?
经过多次搜索后我很清楚,大多数人使用以下行在vue组件中导入three.js,但我认为它已经过时了(usef用于旧的three.js文档或用于较旧的vue版本).
import * as THREE from './js/three.js';
Run Code Online (Sandbox Code Playgroud)
不幸的是,这对我来说似乎没有用,因为我在之后编译我的vue项目时收到以下警告.(注意,项目实际上没有正确编译,当我浏览它时我得到一个空文件).

我尝试了许多其他常用的方法来导入那些无效的three.js!
我根本不是Vue专家,但是three.js包含以下带导出的代码块,我认为这可能会影响我导入此库所需的方式以避免编译警告.
exports.WebGLRenderTargetCube = WebGLRenderTargetCube;
exports.WebGLRenderTarget = WebGLRenderTarget;
exports.WebGLRenderer = WebGLRenderer;
exports.ShaderLib = ShaderLib;
exports.UniformsLib = UniformsLib;
exports.UniformsUtils = UniformsUtils;
exports.ShaderChunk = ShaderChunk;
exports.FogExp2 = FogExp2;
exports.Fog = Fog;
exports.Scene = Scene;
(and so one...)
Run Code Online (Sandbox Code Playgroud)
我正在为我的项目使用的完整Vue组件文件.
Pol*_*rot 27
对于只想尝试基本设置的人.这是vue组件"ThreeTest"中的three.js示例.项目设置使用vue-cli'vue init webpack ProjectName','cd ProjectName','npm install three --save'并用以下内容替换'HelloWorld'组件:
<template>
<div id="container"></div>
</template>
<script>
import * as Three from 'three'
export default {
name: 'ThreeTest',
data() {
return {
camera: null,
scene: null,
renderer: null,
mesh: null
}
},
methods: {
init: function() {
let container = document.getElementById('container');
this.camera = new Three.PerspectiveCamera(70, container.clientWidth/container.clientHeight, 0.01, 10);
this.camera.position.z = 1;
this.scene = new Three.Scene();
let geometry = new Three.BoxGeometry(0.2, 0.2, 0.2);
let material = new Three.MeshNormalMaterial();
this.mesh = new Three.Mesh(geometry, material);
this.scene.add(this.mesh);
this.renderer = new Three.WebGLRenderer({antialias: true});
this.renderer.setSize(container.clientWidth, container.clientHeight);
container.appendChild(this.renderer.domElement);
},
animate: function() {
requestAnimationFrame(this.animate);
this.mesh.rotation.x += 0.01;
this.mesh.rotation.y += 0.02;
this.renderer.render(this.scene, this.camera);
}
},
mounted() {
this.init();
this.animate();
}
}
</script>
<style scoped>
//TODO give your container a size.
</style>
Run Code Online (Sandbox Code Playgroud)
由于给出的答案对我不起作用,我将分享对我有用的初始设置。我在示例中使用 Nuxt.js。
如果有效,应该会出现一个绿色的旋转立方体。
<template>
<div id="container"></div>
</template>
<script>
import * as THREE from 'three'
export default {
name: 'ThreeTest',
data() {
return {
cube: null,
renderer: null,
scene: null,
camera: null
}
},
methods: {
init: function() {
this.scene = new THREE.Scene()
this.camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
)
this.renderer = new THREE.WebGLRenderer()
this.renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(this.renderer.domElement)
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
this.cube = new THREE.Mesh(geometry, material)
this.scene.add(this.cube)
this.camera.position.z = 5
const animate = function() {}
},
animate: function() {
requestAnimationFrame(this.animate)
this.cube.rotation.x += 0.01
this.cube.rotation.y += 0.01
this.renderer.render(this.scene, this.camera)
}
},
mounted() {
this.init()
this.animate()
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
您可以使用这样的 require 语句:
const THREE = require('THREE')
Run Code Online (Sandbox Code Playgroud)
但有些插件假设THREE在窗口上可用,所以你可能想要这样做window.THREE = require('THREE')
我对导入语句没有太多经验,但上面的应该可行。