迁移到 Meteor 2.6
Meteor 2.6 中的大多数新功能要么直接在后台应用(以向后兼容的方式),要么是可选的。有关更改的完整细分,请参阅更改日志。
话虽如此,您应该实施一些项目,以便将来更容易。
Cordova - iOS 启动屏幕
您现在可以通过传递一个对象{src: 'light-image-src-here.png', srcDarkMode: 'dark-mode-src-here.png'}
到App.launchScreens
中的相应键来使用 iOS 和 Android 的深色主题特定启动屏幕。
App.launchScreens
上 iOS 的旧启动屏幕键现在已弃用,取而代之的是新的故事板兼容键PR #11797。这将删除以下键:['iphone5','iphone6','iphone6p_portrait','iphone6p_landscape','iphoneX_portrait','iphoneX_landscape','ipad_portrait_2x','ipad_landscape_2x','iphone','iphone_2x','ipad_portrait','ipad_landscape']
要迁移,请将弃用的键['iphone5','iphone6','iphone6p_portrait','iphone6p_landscape','iphoneX_portrait','iphoneX_landscape','ipad_portrait_2x','ipad_landscape_2x','iphone','iphone_2x','ipad_portrait','ipad_landscape']
替换为相应的新的键:['ios_universal','ios_universal_3x','Default@2x~universal~comany','Default@2x~universal~comcom','Default@3x~universal~anycom','Default@3x~universal~comany','Default@2x~iphone~anyany','Default@2x~iphone~comany','Default@2x~iphone~comcom','Default@3x~iphone~anyany','Default@3x~iphone~anycom','Default@3x~iphone~comany','Default@2x~ipad~anyany','Default@2x~ipad~comany']
并根据 Apple 的要求调整必要的启动图像尺寸。您可以在此处获取更多信息。
MongoDB 5.0
简介
Meteor 2.6 之前的版本支持 MongoDB 服务器 4.x,从该版本开始,我们已将 MongoDB Node.js 驱动程序从版本 3.6 升级到 4.3.1,该驱动程序支持 MongoDB 服务器 5.x。
在编写本指南时(2022 年 1 月),此更改是必要的,因为 MongoDB Atlas 将在 2022 年 2 月自动将 Atlas M0(免费集群)、M2 和 M5 计划中的所有集群迁移到 MongoDB 5.0,但无论如何此更改都是必要的,因为这现在是 MongoDB 服务器的最新版本。M0、M2 和 M5 的迁移只是 MongoDB 发出的一个信号,表明他们认为 MongoDB 5.0 应该尽快成为每个人使用的版本。
如果您在 MongoDB Atlas 上运行并且处于这些计划之一,则必须运行 Meteor 2.6 才能正确连接和交互您的 MongoDB,因为您的 MongoDB 将在 2 月升级到 5.0。如果您没有运行这些计划,您可以继续使用您之前版本的 MongoDB,并且仍然可以使用之前版本的 Meteor 没有任何问题。
需要注意的是,我们已将 Meteor 支持的所有内容迁移为与 MongoDB 5.x 和 MongoDB Node.js 驱动程序 4.x 兼容,但这不包括(正如您所料)您在使用rawCollection
的代码或包中所做的事情。rawCollection
是 Meteor 为您提供自由与 MongoDB 驱动程序交互的方式,但也需要您负责使您的代码与 Meteor 使用的驱动程序版本保持最新。
也就是说,我们鼓励大家尽快运行最新版本的 Meteor,因为您可以从新的 MongoDB 驱动程序以及我们始终添加到 Meteor 的其他功能中获益。
此版本的 Meteor 也与之前版本的 MongoDB 服务器兼容,因此即使您尚未运行 MongoDB 5.x,您也可以继续使用最新的 Meteor 没有任何问题。您可以在此处查看版本 4.3.0 中的 Node.js 驱动程序支持的 MongoDB 服务器版本,因此这些也是 Meteor 2.6 支持的 MongoDB 服务器版本。简而言之,Meteor 2.6 支持以下版本的 MongoDB 服务器:5.1、5.0、4.4、4.2、4.0、3.6。
嵌入式 MongoDB
如果您在本地环境中使用嵌入式 MongoDB,则应运行meteor reset
以使数据库在此升级后正常工作。meteor reset
将删除本地数据库中的所有数据。
rawCollection()
如果您依赖于rawCollection()
对象中的任何方法,则必须使用新的驱动程序 API此处查看每个调用。此外,请确保检查对驱动程序所做的所有更改此处和此处。
您可以查看应用于“聚合”函数的示例,该函数的 API 已发生更改。collection.rawCollection().aggregate()
函数不再像旧版本那样期望回调,并且aggregate().toArray()
现在返回一个 Promise。对于这种情况,我们在此 PR中编写了修复程序。
如果您是寻找自定义包中显示的错误的用户,请在包所有者存储库中打开一个问题,以便维护人员进行必要的更改。
Cursor.count()
find
游标上的count()
的applySkipLimit
选项不再受支持。默认情况下,此选项将始终为 true。因此,例如,假设您有一个包含 50 个文档的集合,并使用限制为 25 的find
执行。
const cursor = collection.find({}, { limit: 25 });
当您调用cursor.fetch()
时,结果将是 25 个文档,而cursor.count()
将为 25。而在之前版本中,cursor.count()
将在此情况下产生 50,并且您需要提供选项applySkipLimit
才能获得结果 25。
现在,您需要创建一个新的游标,但这次不提供限制,以便获取集合中所有文档的数量。
const cursorWithLimit = collection.find({}, { limit: 25 });
const cursorWithNoLimit = collection.find({});
// cursorWithLimit.fetch() => returns 25 documents
// cursorWithNoLimit.count() => returns 50
请记住,find
是查询的包装器,因此连续创建两个或多个游标完全没问题,并且根本不会变慢。
更改
以下是我们对 Meteor 核心包所做的更改列表,以使其与 MongoDB Node.js 驱动程序 4.3.x 兼容,其中大多数不会影响您,但我们建议您在升级到最新版本的 Meteor 之前充分测试您的应用程序,因为我们对 Meteor 如何与 MongoDB 交互进行了许多更改。
- Node.js MongoDB 驱动程序内部操作的结果已更改。如果您依赖于
rawCollection
的结果(不仅仅是数据库内部的效果),请查看预期的格式,就像我们此处所做的那样。 useUnifiedTopology
不再是选项,它默认为 true。native parser
不再是选项,它在 mongo 连接中默认为 false。poolSize
不再是选项,我们在 mongo 连接中使用max/minPoolSize
来实现相同的行为。fields
选项已弃用,我们正在维护一个到“projection”字段(现在首选)的转换层,直到下一个次要版本,届时我们将开始显示警报。_ensureIndex
现在显示弃用消息。- 我们正在维护新 oplog 格式的转换层,因此如果您读取或依赖于它的任何行为,请阅读我们的
oplog_v2_converter.js
代码。 - 更新/插入/删除行为以 Meteor 方式维护,在我们的文档中进行了说明,但我们现在在内部使用
replaceOne/updateOne/updateMany
。这取决于 MongoDB 无 Fiber 的 API 重写中的更改,并且如果您直接使用rawCollection
,则必须查看您的方法,否则如果您仍然直接使用旧的 mongodb 样式,您将看到弃用消息。 - 在生成 mongodb 进程时,不再需要
waitForStepDownOnNonCommandShutdown=false
。 _synchronousCursor._dbCursor.operation
在来自 nodejs mongodb 驱动程序的原始游标中不再是选项。如果您想访问选项,请使用_synchronousCursor._dbCursor.(GETTERS)
- 例如,_synchronousCursor._dbCursor.readPreference
。- mongo v5 上副本集的默认写入首选项为
w:majority
。 - 如果您在开发环境中的 Docker 容器内使用 MongoDB,则可能需要在 mongouri 中追加
directConnection=true
以避免新的 mongo 驱动程序服务发现功能。
值得一提的是,如果您使用 Meteor 提供的内置 MongoDB 在本地运行您的应用程序,则需要对您的应用程序执行meteor reset
才能使用版本 2.6。
下面我们描述了此迁移中的一些常见情况。
1) MongoDB 服务器版本相同
如果您没有更改 MongoDB 服务器版本,则无需在代码中更改任何内容,即使您使用rawCollection
结果也是如此,但由于我们对 Meteor 如何与 MongoDB 交互进行了许多更改以使其与新的驱动程序兼容,我们建议您在使用此 Meteor 版本发布到生产环境之前仔细测试您的应用程序。
我们在真实应用和自动测试套件中进行了许多测试,我们相信已经修复了在此过程中发现的所有问题,但 Meteor 与 MongoDB 的交互非常广泛和开放,因此您可能拥有不同的用例,这些用例可能导致不同的问题。
同样,我们不知道这些更改引入了任何问题,但检查应用程序行为非常重要,尤其是在您认为未以传统方式使用 MongoDB 的地方。
2) 从 MongoDB 4.x 迁移到 MongoDB 5.x
由于我们在本版本中对 Meteor 核心包进行了许多更改,因此我们建议执行以下步骤进行迁移
- 将您的应用程序升级到使用 Meteor 2.6(meteor update –release 2.6)在一个分支中;
- 使用上一步创建的分支,创建一个具有 MongoDB 5.x 和您的应用程序环境的预发布环境;
- 如果您使用的是 MongoDB Atlas,在 MongoDB Atlas 中,我们无法迁移到免费的 MongoDB 5.x 实例,因此我们不得不迁移到付费集群才能正确测试应用程序,这可能在 2022 年 2 月之后发生变化;
- 使用 MongoDB 5.x 设置您的预发布数据库,并在那里恢复您的生产数据,或者以一种可以重现与生产环境相同案例的方式填充此数据库;
- 运行您的应用程序,将您的 MONGO_URL 指向正在运行 MongoDB 5.x 的这个新数据库;
- 在此环境中运行您的端到端测试。如果您没有健壮的端到端测试,我们建议您手动测试您的应用程序以确保一切正常。
- 一旦您拥有稳定的端到端测试(或手动测试),您可以认为您已准备好使用 MongoDB 5.x 运行,因此您可以将其视为任何其他数据库版本迁移。
我们不知道支持 MongoDB 的必要更改引入了任何问题,但检查应用程序行为非常重要,尤其是在您认为未以传统方式使用 MongoDB 的地方。
例如,MongoDB Oplog 发生了很多变化,我们不得不创建一个转换器以保持我们的 oplog 尾部理解来自 oplog 的变化,因此,如果您有依赖于 oplog 的复杂功能和查询(Meteor 实时差异系统),您应该检查您的应用程序是否正常工作,尤其是在这部分。
由于 MongoDB 还删除了一些 Meteor 使用的已弃用方法,因此我们建议测试应用程序的所有重要操作。
从低于 2.5 的版本迁移?
如果您从低于 Meteor 2.5 的 Meteor 版本迁移,则可能存在本指南中未列出的重要注意事项(本指南专门介绍 2.4 到 2.5)。请查看旧的迁移指南以获取详细信息
- 迁移到 Meteor 2.5(从 2.4)
- 迁移到 Meteor 2.4(从 2.3)
- 迁移到 Meteor 2.3(从 2.2)
- 迁移到 Meteor 2.2(从 2.0)
- 迁移到 Meteor 2.0(从 1.12)
- 迁移到 Meteor 1.12(从 1.11)
- 迁移到 Meteor 1.11(从 1.10.2)
- 迁移到 Meteor 1.10.2(从 1.10)
- 迁移到 Meteor 1.10(从 1.9.3)
- 迁移到 Meteor 1.9.3(从 1.9)
- 迁移到 Meteor 1.9(从 1.8.3)
- 迁移到 Meteor 1.8.3(从 1.8.2)
- 迁移到 Meteor 1.8.2(从 1.8)
- 迁移到 Meteor 1.8(从 1.7)
- 迁移到 Meteor 1.7(从 1.6)
- 迁移到 Meteor 1.6(从 1.5)
- 迁移到 Meteor 1.5(从 1.4)
- 迁移到 Meteor 1.4(从 1.3)
- 迁移到 Meteor 1.3(从 1.2)