如何使用ES6开发Three.js项目(一)

如何使用ES6开发Three.js项目(一)

如何使用ES6开发Three.js项目(二)

配置开发环境:node.js+webpack+webpack-dev-server+babel+ES6+three.js

  1. node.js
  2. webpack
  3. webpack-dev-server
  4. babel
  5. ES6
  6. three.js

 

1、使用npm安装three.js。注意安装命令是three不是three.js。因为three.js(0.77) 是老本版,已经更名为three了。

three.js的npm官网:  https://www.npmjs.com/package/three  (目前版本0.95)

npm install three --save

2、在index.js文件中引入 three.js模块

const THREE = require('three')

3.1、安装three后,example/js中有很多js插件,但是这些插件都不能直接引用。这里有几种方式可以使用他们。

通过模块方式引入OrbitControls控制器。这里有一个坑,需要修改一下。

这里有篇文章讨论了这个问题:https://github.com/mrdoob/three.js/issues/9562

修改原来的OrbitControls.js代码

在第一行添加:import * as THREE from "three" 

把第一个 THREE.OrbitControls 替换成 let OrbitControls

其余的 THREE.OrbitControls 都替换成 OrbitControls

在最后添加一行:export default OrbitControls

在住函数中就可以正确引入了:import OrbitControls from "./util/OrbitControls"

3.2、通过npm 的方式引入 OrbitControls。npm中刚好有这个库,所以我们可以安装一下。

https://www.npmjs.com/package/three-orbitcontrols

npm install three

npm install three-orbitcontrols

3.3、通过传统的方式

4、在index.js文件中引入dat.GUI.js模块。

不是通过npm安装的所以不能直接以模块的方式引用。可以通过传统的方式引用:。如果通过模块的方式需要在dat.GUI.js文件末尾添加:module.exports = dat。在index.js文件头部添加:const dat = require('./dat.GUI')。

当然  我们也可以通过npm的方式来安装。 $ npm install --save dat.gui。

// CommonJS:
const dat = require('dat.gui'); 
// ES6:
import * as dat from 'dat.gui'; 
const gui = new dat.GUI();

 5、通过的方式xxx.js文件不会被打包。这样在开发过程中也方便,不然每次都需要打包库文件。我的破电脑每次打包速度都很慢。还是暂时放弃打包three.js等库文件吧,只打包自己用ES6编写的代码就好了。 

可以配置 --hot 再进行文件修改,它会在再次修改文件的时候也修改打包好的文件,而不是重新打包一个完整的文件,从而提高速度。

6、安装babel来编译es6语法。

这样就可以把之前的three.js的代码。通过 es6 、 webpack 的方式打开了。

7、静态的html文件。我们把需要引入的库文件放在head中,把打包生成的bundle.js文件放在body中就好了。这样我们用浏览器打开html文件就可以看到我们的案例了。




    
    node.js-es6-Webpack-three.js
    
    


   

8、安装http-server。正常开发的案例都可以直接打开,但是有些我们需要服务器环境local host。方便快速浏览,可以安装一个http-server。启动服务就可以了默认但口号是8080。也可以通过命令修改端口。

http-server -p 8081

使用webpack-dev-server后 打包的文件 bundle.js是在内存中的。磁盘里面没有,真的没有,找了好久。

因为开启webpack-dev-server之后是所谓的热更新,生成的文件都在内存中,方便实时查看效果,如果想得到生成的文件,就需要关闭webpack-dev-server,再使用webpack编译一次了。也许有其他方法

"test": "echo \"Error: no test specified\" && exit 1",

"deve": "webpack --mode development",

"dev": "webpack-dev-server --config ./webpack.dev.config.js --mode development"

// npm 命令

npm run deve  //这个是打包编译

npm run dev   //这个是开启webpack-dev-server 会自动刷新。

webpack编译的文件居然跑shi dist/main.js文件中,不是说好的release/bundle.js。眼睛迷糊的没看见,又坑我好久,坑我太年轻。

如何使用ES6开发Three.js项目(一)_第1张图片


上面写的有点不清晰。准备再整理一篇出来。下面先补充一点遇到的坑。

three.js 中webpack 图片的加载。

在之前的开发中使用纹理图片是这样加载的:

var maps1 = new THREE.TextureLoader().load('../img/mapd.jpg');          
var geometry = new THREE.SphereGeometry(r-1.8 , 32, 32);
var material = new THREE.MeshPhongMaterial({
       map: maps1,
});
var mesh = new THREE.Mesh(geometry, material);

代码没有问题。但是在webpack开发中就出现了问题。这样写的图片没有被打包到webpack中去,所以运行的时候就找不到。除非把图片放在打包路径下面,但是这样做是错误的。治标不治本。正确写法应该是通过模块化的方式引用图片路径。通过require的方式引入图片。

let imgurl = require('./assets/mapd.jpg')
let maps1 = new THREE.TextureLoader().load(imgurl);
let geometry = new THREE.SphereGeometry(r, 32, 32);
let material = new THREE.MeshPhongMaterial({
    map: maps1,
});
let mesh = new THREE.Mesh(geometry, material);

图片加载存在异步问题。在ES6中有 async  await 关键字,可以来用于异步加载,提前把需要加载的图片都放在缓存中,后面用到的时候直接拿来用,就可以了。


更新了一下,项目代码。

如何使用ES6开发Three.js项目(二)

你可能感兴趣的:(three.js,webgl,three.js)