THREE.js - 有没有办法轻松构建three.js功能的子集?

时间:2017-05-20 19:57:08

标签: three.js

当前版本的three.js,即使缩小也是大约半兆字节的重型野兽。有没有办法(除了黑客攻击源)只构建一个必需的功能子集,以保持HTTP服务文件尽可能小?

2 个答案:

答案 0 :(得分:1)

我实际上并不是100%肯定这个术语,也不是什么神奇的,但是有了一个babel / webpack构建系统,我可以选择我想要的模块并像这样导出它们

//myThree.js
export { LineBasicMaterial } from 'three/src/materials/LineBasicMaterial'
export { MultiMaterial } from 'three/src/materials/MultiMaterial'
export { Mesh } from 'three/src/objects/Mesh'
export { Object3D } from 'three/src/core/Object3D'
...

然后你应该可以说

//myFoo.js

import * as THREE from './myThree'

您也可以直接从three/src逐个模块导入,但我发现如果手动完成,这将非常繁琐。

答案 1 :(得分:0)

我会说,没有超级简单的方法。至少没有清单实用程序或任何东西。但最大的问题是单个组件非常小,并且与更一般的功能相互依赖。 I.E.如果你不需要它,你可以删除像THREE.PlaneGeometry这样的文件,但是这个文件本身很小:

function PlaneGeometry( width, height, widthSegments, heightSegments ) {

        Geometry.call( this );

        this.type = 'PlaneGeometry';

        this.parameters = {
            width: width,
            height: height,
            widthSegments: widthSegments,
            heightSegments: heightSegments
        };

        this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );

    }

因为它利用了PlaneBufferGeometry,所以你不能通过删除它来真正保存任何真实空间,所以你必须删除planebuffergeometry以开始看到任何好处,即使这样,大多数的planebuffergeometry都会使用bufferGeometry的属性,我猜你不能删除,除非你不想使用任何网格。

但它可能会产生奇怪的副作用。快速搜索源代码,我看到如果你想让纹理作为渲染器的背景,就会使用planebuffergeometry。它会创建一个没有深度或雾测试的几何体,并将背景纹理作为地图应用于该平面缓冲测量。

即使您不打算使用该功能,它仍然可能会在调用渲染函数时抛出nullpointerexception,因为它依赖于planebuffergeometry。

很难预测组件之间的相互作用,因此很难明确说明对您来说什么是必不可少的,哪些不是,并且很难确定哪些是特定的部分。 )不是必需的,而b)的尺寸很大。

你可以做的最好的事情就是自己运行构建,修改包含。自己建立一个回购是一个不同的问题,而不是我不知道该怎么做的问题,但有可能是教程。我认为but I found a pretty concise set of src's是Threejs回购的构建过程的一部分。您可以尝试剥离组件,构建,然后查看仍然有效的内容。