其他分享
首页 > 其他分享> > CesiumJS 更新日志 1.96 与 1.97 - 新构建工具 esbuild 体验及 Model API 更替完成

CesiumJS 更新日志 1.96 与 1.97 - 新构建工具 esbuild 体验及 Model API 更替完成

作者:互联网

目录


CesiumJS 更新日志 1.96 与 1.97 - 新构建工具 esbuild 体验及 Model API 更替完成

截止发文,1.97 还未发布,但已经在源码仓库完成了 Model API 的替换,文章会跟进。本文着重介绍新的构建指令的用法(配套 esbuild 的使用),见第三节。

首先介绍 1.96 和 1.97 两个大版本的更新内容。

1.96 更新情况

1.96 已于 2022 年 8 月初更新;重大更新如下:

1.96 有两项过期 API 消息:

1.97 更新情况

1.97 主要更新如下(持续更新中):

新版的 Model API 在公共 API 的文档和调用几乎没有差距,做到了对上层应用的无缝兼容(待这两个版本测试),因此开发者几乎不需要更改原来的 API 调用代码。

此外,还有几个极为重大的改变:

总结下来就是下一代的 3DTiles 越来越近了。

新构建工具 esbuild 和大换血的构建指令使用

本段大部分材料参考自官方博客:

Build Tooling Updates Coming to CesiumJS – Cesium

1. 官方自述构建工具更新的原因

近几个月,官方团队致力于改进开发者体验,最近已经把成果合并到主分支,那就是使用新的代码构建工具。在 CesiumJS 的源代码开发时,已经能获得更小体积的发行版 CesiumJS 库文件(未压缩版本体积小了 33%,压缩版小了 16%),而且速度有质的飞跃。发行版变小,使得网络加载时间变短,速度更快。

由于精简了代码资源、移除无关的空格和注释,得到了更小的构建版本的库文件,这也有利于提高浏览器加载速度

这样做还有额外的好处,就是解决了一个在 Linux 系统中 Chrome 浏览器长期存在的问题

2. 选择使用 esbuild

CesiumJS 项目启动之初,它所用的辅助开发工具基本上都是同类项目中的“新鲜玩意儿”,比如,RequireJS 就是当时最突出的依赖管理工具,1.62 版本之前的模块机制都是异步模块定义(AMD)。后来自 1.63 版本完全为 ESModule 后,就改用 Rollup 来构建了。

到目前为止,CesiumJS 在构建时是存在没有轻量化、最小化等毛病的。CesiumJS 最重要的环节,即把所有源代码模块合并到一个主文件(以方便分发),官方并没有在这个过程中对代码进行重大转换,因为需要考虑到兼容性问题。

由 ESModule 多个模块文件合并到单一文件,这个单一文件我一般叫它库文件

现在的 JavaScript 工具已经越来越快、越来越好用了,开发者们更习惯走打包的路线,所以是时候评估构建工具的更新了。

官方选择使用 esbuild 来代替 Rollup 来完成 “ESModule -> 库文件” 这个最重要的环节。

3. 关于 WebWorker 遗留问题

WebWorker 是浏览器后台运行的独立脚本,在 CesiumJS 中,它们广泛用于创建几何图形和数据解码任务。

Firefox 仍未在 worker 中支持 ESModule,这意味着必须使用 iife 或者 amd 模块化机制来加载 worker 文件;但 esbuild 只支持 ESModule 的代码分割,如果不进行代码分割,worker 文件大小就会显著增大。

为了避免这个问题,只能暂时继续用 Rollup 和 RequireJS 来解决 worker 的问题。直到 Firefox 支持之后,才能完全切换到 esbuild 来。

4. 重头戏之旧构建指令移除与新指令用法

除了用上 esbuild 之外,官方还借此机会从全局重新考虑了构建过程,包括构建脚本负责的任务的粒度问题。

最大的变化是开发时的构建方法,由于 esbuild 的加速(尤其是快速增量构建),现在已经不需要提前构建(即旧版的 combine 指令)才能进行本地开发了(npm run build)。现在,源代码的开发调试只需要安装依赖,就可以直接启动服务器:

npm run install && npm run start

CesiumJS 多年的积累,相关工具增加、配置的增加,导致 gulp 中添加了很多指令,他们命名似乎有点乱。现在官方重新评估了这些指令,重新设计如下(主要):

移除的指令不再赘述,请读者自行查阅互联网上的资料。下面着重介绍 buildbuild-tsbuild-docsrelease 四个最重要的新增/变化指令。

我使用了两台电脑对比运行时间,一台标记为 A,使用桌面 i7 12700 CPU;一台标记为 B,使用 AMD r7 4800U。

指令 A B 做了什么
build 约 5s 约 9s 转译 glsl 文件为 ESModule,导出着色器代码字符串常量;创建出 Source/Cesium.js ESModule 格式的入口文件,并生成 Build/CesiumUnminified 版本的三类库文件和 source-map 映射文件;处理测试文件等
build-docs 约 19s 约 40s 调用 generateDocumentation 任务生成离线文档页面
build-ts 约 14s 约 24s 根据 jsdoc 注释创建 TypeScript 类型定义文件
release 约 46s 约 85s 先执行生成 Build/CesiumUnminified 版本和生成 Build/Cesium 版本库文件的 build 任务;然后调用 build-ts 任务生成类型文件;最后调用 generateDocumentation 任务生成离线文档页面

其中,build 指令内部会调用 esbuild 来完成 ESModule、iife、commonjs 三种格式的库文件的打包。表格不够详细的,见下文:

注意,build-apps 依赖于 build,有先后顺序

有两个小技巧,

5. 收益

就官方的说辞和笔者自己的体验来看,build 指令比起之前的速度,简直就是做了火箭,原本同一台电脑进行 minifyRelease 可能要 4 分多钟,现在 release 只需 1 分半左右。

image

而且最显著的,无论是压缩版(Build/Cesium)还是未压缩版(Build/CesiumUnminified)的三种格式的库程序,其库文件大小均比原来小不少,加上 gzip 的加持还能更小(请读者自测),基本上全库加载能做到从黑场景到出地球只需 2 秒左右。

image

CDN 上的 Cesium.js 主文件传输体积,基于 HTTP2 甚至能做到 700+ KB,显著提升场景加载速度。

6. 之后的改进方向

可能之后有考虑转向 TypeScript;一旦 Firefox 的 worker 可以加载 ESM,那么理想状态下可以完全移除 RequireJS 和 Rollup,进一步加速构建速度和减小发布版本的库代码。

7. 开发者如何使用新的构建成果

我没有直接翻译官方的表述,这里我给一个更符合思考逻辑的建议:

以后有兴趣可以写文讲讲如何最优地在你的项目中引入 CesiumJS,我认为 CDN 引入是一个不错的加速手段,尽量避免让应用打包器再次打包 CesiumJS,Tree-Shaking 对于这种级别的 3D 地球库来说可能收益甚微。

标签:指令,CesiumJS,API,构建,build,Model,esbuild,Build
来源: https://www.cnblogs.com/onsummer/p/16560461.html