我正在尝试为 Meteor 移动 应用程序提供一些按构建配置。 --mobile-settings
选项看起来非常适合此任务 - 它允许您在构建时将配置 (JSON) 传递给移动客户端 - 与 --settings 的方式相同
选项适用于服务器。
但是,我看到了一些意想不到的行为......当客户端从服务器刷新时,通过 --mobile-settings
传递给移动客户端的任何内容看起来都被覆盖了。
这是我所做的......
- 编写了一个非常简单的应用程序,它从
Meteor.settings.public.blah
读取设置值并将其显示在屏幕上。 - 将此应用程序部署到 meteor 服务器(没有任何移动设置文件)。
- 为 android 构建了相同的应用程序,指向上面的服务器并设置了
--mobile-settings
选项 - 指向声明“blah”属性的设置文件。将其安装在设备上。 - 当我在设备上运行该应用程序时,该应用程序启动并且屏幕正确显示了 blah 设置。
- 但是,几秒钟后应用程序刷新并且设置消失了。
刷新时,为什么特定于移动设备的构建时值会被服务器覆盖?移动设置文件是否也需要存在于服务器上?
提前致谢。
更新
好的,通过下面的讨论,我想我需要稍微澄清一下我的问题......
我上面描述的是我所看到的行为。但是,我发现此行为令人困惑,并且我正在努力寻找有关此功能的任何文档来详细说明预期行为是什么。
我能找到的最好的是一个原始开发者评论的线程 ( https://groups.google.com/forum/#!msg/meteor-talk/Jbfnk5kCvW4/6qvccun2dQ0J )。他说……
You just build your mobile apps twice with different json passed to
--mobile-settings
.
这似乎不支持我所看到的行为 - 传递给 --mobile-settings 的 json 将被部署到服务器的任何内容覆盖。因此我很困惑。
如果有人能指出任何文档或以任何方式确认此行为,我将不胜感激。
最佳答案
简而言之
让我们看看
meteor build --help
内容如下:
--mobile-settings Set optional data for the initial value of Meteor.settings
in your mobile application. A new value for
Meteor.settings can be set later by the server as part of
hot code push.
所以看起来您使用 METEOR_SETTINGS
环境变量为服务器提供的设置总是优先的。如果还没有服务器设置,“移动设置”仅作为后备/默认值存在。
让我们看看 Meteor 源代码:)
仍然,可能不清楚为移动设备设置另一个 settings
对象的目的是什么。我不是 Cordova 方面的专家,但我想这里的问题是应用程序如何启动。
通常,当您从 meteor 服务器请求初始页面时,Meteor.settings
对象当然是与您的服务器配置保持同步的。这由此处的 webapp
包负责:
https://github.com/meteor/meteor/blob/devel/packages/webapp/webapp_server.js#L352
请注意,当您在移动设备上安装该应用程序时,它会变得有点复杂。当然,安装过程与您的服务器当前状态无关,因此无法获取设置的初始值,除非在移动构建过程中提前知道它们。这是您需要 --mobile-settings
选项的唯一原因。它们不会更改您的移动设备设置,而是在热代码推送期间从您的服务器加载最新设置对象之前提供初始值。
如果两个设置对象不同,它总是会发生,因为正如您在代码中看到的那样 here PUBLIC_SETTINGS
值在计算用于判断客户端代码是否最新的散列时被考虑在内。
结论
因此结论是:您的“移动设置”——或者至少它的公共(public)部分——应该尽可能反射(reflect)当前的服务器配置。每次更改公共(public)设置时,您还应该重建您的移动应用程序并发布更新,以确保您的新客户拥有开箱即用的最新版本设置。
理想情况下,客户端应用程序不应该依赖于 Meteor.settings
来正常启动。即使对象为空,也应该有一些不会破坏用户体验的默认行为。
关于javascript - Meteor "--mobile-settings"被服务器值覆盖了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007348/