react-native - 在 React Native 代码库中,生成声称的 "single JSON message"的代码在哪里?

标签 react-native

2018 post ,Facebook 工程师声称:

React Native was designed to return a single JSON message that lists mutations to perform, like [["createView", attrs], ["manageChildren", ...]]. We designed the entire system to never rely on getting a synchronous response back and to ensure everything in that list could be fully serialized to JSON and back.



哪里在React Native codebase * 是负责此功能(构建 JSON)的确切代码吗? 或者引用的声明可能是谎言“简化”?

我拼命地试图找到它,但似乎在兜圈子;每当我找到最初看起来很有希望的轨道时,它似乎永远无法将我带到生成此类 JSON 的地方:(

* 请注意,我对 特别感兴趣安卓代码库;理想情况下, RN v0.55 ,撰写本文时的最新版本。

如果可能,我也对补充的“反向”代码感兴趣。我的意思是,我假设“ native ”(在 Android 的情况下为 Java)代码也必须在某个时候将一些“事件”信号发送回 JS,并且我假设它们也是 JSON。那么,再一次,这段代码在哪里? (我对接收和反序列化该 JSON 的 JS 代码感兴趣。)

(此外,我会非常感谢了解是否可以在基于 Expo 的应用程序中以原始形式从 JS 访问这些“低级”功能(发送和接收 JSON);但这在答案中是 100% 可选的,因为我有理由相信,一旦我知道上述主要问题的答案,我就能自己找出答案。)

注意:为了充分披露,我还交叉发布了这个问题 on HN ,但在撰写本文时还没有答案。当关于 HN 的讨论线程变得陈旧时,我计划从这里删除此注释。

编辑 1

基于 a "Related" question suggested by SO ,我开始有一种模糊的感觉,即名为“BatchedBridge”的概念/关键字可能与我正在寻找的内容非常接近。我的直觉似乎告诉我,这可能是朝着正确方向迈出的第一步。我发现一篇博客文章描述了 how to observe messages flying both ways through BatchedBridge ,据报道,这会导致日志如下:
{type: 1, module: "WebSocketModule", method: "addListener", args: Array(1)}
{type: 1, module: "WebSocketModule", method: "connect", args: Array(4)}
{type: 0, module: "RCTDeviceEventEmitter", method: "emit", args: Array(2)}
{type: 1, module: "Timing", method: "createTimer", args: Array(4)}

同一博客上的另一篇文章展示了如何 send events from Java to JS over this "bridge", and listen to them in JS .这可以回答我问题的最后一个可选部分的一半,即如何从 Expo 中的 JS 订阅 Java 事件。 (在 Java 中: this.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("onSessionConnect", params); ,在 JS 中: DeviceEventEmitter.addListener('onSessionConnect', (event) => { console.log(event); }); )

另一个有趣的article on RN internals ,由于使用“react-native BatchedBridge”作为关键字进行谷歌搜索。

编辑 2,暂定

构建JSON的地方可能是line 556 below ,虽然我不太确定:
550 void JSCExecutor::callNativeModules(Value&& value) {
...
556   auto calls = value.toJSONString();
557   m_delegate->callNativeModules(*this, folly::parseJson(calls), true);

称为例如from l.642 below :
624 void JSCExecutor::invokeCallback(
625     const double callbackId,
626     const folly::dynamic& arguments) {
...
628   auto result = [&] {
...
634       return m_invokeCallbackAndReturnFlushedQueueJS->callAsFunction(
635           {Value::makeNumber(m_context, callbackId),
636            Value::fromDynamic(m_context, std::move(arguments))});
...
642   callNativeModules(std::move(result));

最佳答案

基于问题中链接的文章,以及 some videos从2015年开始,经过一天的挖掘,我相信它确实是BatchedBridge ,又名 MessageQueue ,这是Java/Swift和JS之间调用的总线。

如果我理解正确,是 JS->Java 调用 已完成 MessageQueue.enqueueNativeCall , 定义为:

  enqueueNativeCall(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  )

而一个 Java->JS 调用 通过以下任一功能(在同一文件中)完成:
callFunctionReturnFlushedQueue(module: string, method: string, args: any[])
callFunctionReturnResultAndFlushedQueue(module: string, method: string, args: any[])
invokeCallbackAndReturnFlushedQueue(cbID: number, args: any[])

这实际上仍然没有回答关于“JSON 在哪里?”的问题,但实际上我更感兴趣的是找到总线并验证它是否是 JSON 流过它。虽然我现在甚至不确定它最终是否会成为实际的 JSON 字符串,但我相信它至少是“意识形态上”的 JSON。 MessageQueue 上似乎不允许使用非 JSON 兼容的对象IIUC 和“函数指针/回调”,我相信,转换为函数的名称,以便它们可以从 Java 异步调用。我相信函数结果会被忽略(即假设所有 JS 函数都具有 void 返回类型)。

编辑:callFunctionReturnResultAndFlushedQueue似乎返回 JS 函数的结果,所以它似乎必须是非异步的(阻塞)。但是在搜索 native repo m_callFunctionReturnResultAndFlushedQueueJS 之后和 callFunctionReturnResultAndFlushedQueue ,它们似乎都没有被从任何地方调用。在 C++ 中,您永远无法 100% 确定,但现在我将交叉手指并假设可以安全地忽略它。

关于react-native - 在 React Native 代码库中,生成声称的 "single JSON message"的代码在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873408/

相关文章:

react-native - React Native Flatlist 不会在自定义动画底部工作表内滚动

ios - React-Native 中的 '...' 是什么意思?

react-native - 如何在 React Native 上动态隐藏 TabNavigator

react-native - 如何在不影响内部 View 元素的情况下应用阴影来 react 原生 View ?

javascript - 在 React Native 部分列表中过滤数据

android - 如何手动将库添加到react-native项目中?

react-native - React Native Youtube androidx.annotation.Nullable错误

react-native - 应用程序 :compileDebugJavaWithJavac FAILED

android - React-Native 在推送通知上呈现页面

react-native - 使用动画变换,无法触发onLayout