CesiumJS中的模块化结构提供了更好的依赖管理

CesiumJS中的模块化结构提供了更好的依赖管理

2023年12月7日

随着CesiumJS 1.100在12月1日的发布,我们可以下载整个CesiumJS发行版,也可以通过较小的包下载CesiumJS库的一部分。这一改变使得仅使用Cesium功能子集的应用程序可以访问更小、更特定的包。

CesiumJS是一个具有很多功能的扩展库,可以满足广泛的用例。虽然一些用户可能通过在他们的应用程序中嵌入CesiumViewer并使用时间轴(Timeline)和动画(Animations)部件(Widgets)带来的所有功能来使用整个堆栈,但其他人可能只想通过CesiumWidget获得一个精简的接口,还有一些用户可能只想使用 Core 中的地理空间数学库。

考虑到用户社区的多样性和CesiumJS的用途,包的模块化结构的好处显而易见:用户可以选择只在应用程序中使用什么。这样做的好处不仅仅是生产出更精简的产品;这个改动让我们无需安装与cesium npm包同步的所有直接依赖。它还减少了用户应该学习的API的范围,并在选择用户何时以及如何更新其依赖项方面提供了灵活性。

首先,这些较小的包以“引擎/engine”和“部件/widgets”的形式出现。我们计划保持CesiumJS的每月定期发布计划。例如,当CesiumJS 1.100在12月1日发布时,engine 1.0和widgets 1.0也发布了。

在这里插入图片描述

Engine package

engine包是CesiumJS的核心运行时组件,除了合并后的CesiumJS发行版中的Widgets文件夹,它包含了所有的组件。这里有一个例外,CesiumWidget已经从部件/widgets 移动到引擎/engine。这提供了一种将CesiumJS添加到浏览器的简洁且最小的方式。

在这里插入图片描述

所以,如果你只使用engine包,可以从下面的代码片段开始:

import {
    
     CesiumWidget } from “@cesium/engine”;
import “@cesium/engine/Source/Widget/CesiumWidget.css”;

const widget = new CesiumWidget(“cesium-container”);

在这里插入图片描述

Widgets package

widgets包 包含了合并后的CesiumJS包中的所有不同UI部件/widgets。这些包括Viewer、Timeline、Animation等,以及不同的mixins。要开始使用widgets包,可以使用以下代码片段:

import {
    
     Viewer } from “@cesium/widgets”;
import “@cesium/widgets/Source/widgets.css”;

const viewer = new Viewer(“cesium-container”);

在这里插入图片描述

由于 widgets 依赖于 engine,所以当你安装 widgets时,engine 包会自动安装。

实现细节

我们使用npm workspaces 来强制使用monorepo结构。这些包可以在根目录packages目录下找到,并且会在@cesium范围内发布,即@cesium/engine和@cesium/widgets 等。

与组合的CesiumJS包相比,它包含预打包的工件,如Cesium.js、index.js和index.cjs,这些更新的包将以精简配置的形式发布,作为带有TypeScript定义的ES模块,这是现代包的标准。这将允许用户在他们的应用中使用他们选择的打包工具,并利用诸如tree-shaking或 dead cod elimination 之类的功能。

此外,根据npm最佳实践,这些包将遵循语义版本控制(semantic versioning),这让用户清楚地了解版本之间的变化范围,并防止允许npm自动更新版本而导致构建失败的情况。

就这些更改在存储库或组合发行版中的外观而言,来自根级源文件夹的所有源文件都已移动到相应的包文件夹中。例如,Scene.js已经从Source/Scene/Scene.js转移到packages/engine/Source/Scene/Scene.js。Viewer.js也从Source/Widgets/Viewer/Viewer.js变成了packages/ Widgets/ Source/Viewer/Viewer.js。源代码中包含的任何直接依赖项都已经移动到每个包的源代码文件夹中的ThirdParty文件夹中。

当在存储库(the repository)中工作时,每个包还带有自己的简单脚本:build—创建包的入口模块index.js,捆绑规范build-ts—生成TypeScript定义文件,test—运行测试覆盖率—生成覆盖率报告

为了尽量减少对依赖CesiumJS组合发布结构的应用程序的影响,在Assets、ThirdParty和 Widgets 中找到的静态资源在发布时仍然被复制到根目录下的源代码文件夹中。

下一步计划

这些变化是我们继续更新CesiumJS库计划的另一个重要步骤,它们建立在对我们的源代码、工具和构建过程的之前改进的基础上。在未来,我们希望能够沿着更细的线来分解软件包,例如发布一个包含所有地理空间数学类的核心软件包,如Cartesian3等。

猜你喜欢

转载自blog.csdn.net/yinweimumu/article/details/134390805