着手看Three.js的源码!
整个项目整体还是特别庞大的,先对外围的内容进行分析,项目结构,组织等方面。
rollup
打包
three.js使用rollup打包,算是比较主流的打包方式,当然rollup中有一些特殊的针对constants和glsl文件的打包方式专门的设定,这些需要进一步的了解。
有一个有趣的地方:
output: [
{
format: 'esm',
file: 'build/three.module.js',
indent: '\t'
}
]
在打包的时候,不仅打包为UMD的格式,还打包成了ESM的格式,这是我第一次见到实际的项目这样用,而查看它的example,发现使用如下:
<script type="module">
import * as THREE from '../build/three.module.js';
//...
</script>
可以说是,比UMD稍微优雅那么一点点。
另外,本项目在打包压缩的时候,使用了google-closure-compiler
,这似乎是一个曾经特别流行的压缩工具,在其它地方也碰到过。而且,经过查一些东西,发现这东西还是很复杂很好用的,也可以配合rollup:https://medium.com/@ajmeyghani/javascript-bundlers-a-comparison-e63f01f2a364。
测试
three.js使用了qunit
库来测试,是一个比较远古的库吧,不过其实测试工具大同小异,更重要的还是测试样例的设计。对于测试样例的学习可以放后吧,还是主体功能更重要一点。
除此之外,three.js也使用了Travis这样的CI工具,这也是比较routine的配置了吧。
文件结构
.
├── build
├── docs
├── editor
├── examples
├── files
├── src
├── test
└── utils
大致有这么几个文件夹。
build: 最终文件,包含UMD形式的和ESM形式的
docs: Three的整个官网的文档页面,文档还是非常详细的,值得好好读读
editor: Three的editor,也是很强了,可以当做一个完整的在线3D建模软件使用
examples: 官方的例子,有些例子质量很高
files: 字体logo等等,不太重要
src: 源码文件夹,之后重点研究的内容
test: 测试代码,也需要简单学习
utils: 一些utility的配置,定义等等
类型设置
类型在一个js项目中越来越重要了
Three虽然是JS写的,但是为每个文件必要的API添加了*.d.ts
文件,这个添加的方式目前还不是很了解,不知道是手动完成的还是用某种工具自动完成,这个也是自己要学习的地方。
如果是自动的,得学习如何使用其生成想要的类型或者辅助生成类型,如果是手动添加的,需要学习如何为JS库添加必要的类型。
经过实际运行发现,这个应该是自己加的,而且更多的是一种文档性质的,也不是特别的全。
另外,在npm install
的时候,才惊奇的发现,three.js没有dependancies,只有devDependencies,很少见了!!