1. 字节码预编译

    现代主流的 JavaScript 引擎在执行一段js代码的大概流程是:先读取源码文件,解析源代码并转换成字节码 (bytecode),最后执行。在运行时解析源码转换字节码是一种时间浪费,所以 Hermes 选择预编译的方式在编译期间生成字节码。这样做一方面避免了不必要的转换时间,另一方面多出的时间可以用来优化字节码,从而提高执行效率。

  2. 放弃 JIT

    为了加快执行效率,现在主流的 JavaScript 引擎都会使用一个 JIT 编译器在运行时通过转换成机器码的方式优化 JS 代码。Faceback 团队认为 JIT 编译器有主要俩个问题:

    (1) 要在启动时候预热,对启动时间有影响;

    (2) 会增加引擎 size 大小和运行时内存消耗。

基于这俩点对性能指标的影响,Faceback 团队决定不实现JIT编译器。这里所谓放弃 JIT,有两点需要再解释一下:

(1) 纯文本 JS 代码执行效率降低。放弃JIT,是指放弃运行时 Hermes 引擎对纯文本 JS 代码的编译优化。

(2) 对 RN 代码的动态性无影响。由于 Hermes 仍然可以执行纯文本的 JS 代码,并且可以支持动态读取bytecode,因此对 RN 的动态性并无影响。

Hermes 缺点:

  1. bytecode 文件占用size过大问题:Hermes 编译的字节码文件比纯文本js文件增大 100%

  2. 执行纯文本 js 耗时长:在客户端将纯文本 js 转换成 bytecode 之前,我们让 Hermes 加载纯文本

  3. 缓存问题:使用缓存的 Hermes 引擎加载业务代码表现非常一般,甚至某些情况下比第一次加载还要慢

[](

)改造过程


官方教程:

[https://reactnative.dev/docs/hermes](

)

官方教程非常简单,但是是纯 React Native 工程的改造流程,而没有混合工程的改造流程 (且纯 React Native 工程也一堆坑)

由于 WubaRNSDK 是混合工程,所以以下改造流程为自行摸索:


react-native init projectName --version 0.64.0-rc.2

npm install 

在 node_modules 中获取 hermes 引擎的 aar:

WubaRN hermes调研-基于混合工程的改造方案(1),想学web开发

aar 后缀改为 .zip,解压出 so 库,在 WubaRNSDK 中替换掉旧有的 libjsc.so、libc++_shared.so:

WubaRN hermes调研-基于混合工程的改造方案(1),想学web开发

修改 ReactInstanceManager 的 JavaScriptExecutorFactory 为 HermesExecutorFactory:


ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()

      .setApplication((Application) context.getApplicationContext())

      .addPackage(new MainReactPackage()) 

      .setRedBoxHandler(mExceptionHandler)

      .setUseDeveloperSupport(RNDebugSwitcher.getInstance().isDebug())

      .setInitialLifecycleState(LifecycleState.BEFORE_CREATE)

      .setJavaScriptExecutorFactory(new HermesExecutorFactory()); 

如果运行时出现,则是转换 Bundle 时字节码版本不对:



HermesVM: Compiling JS failed: Wrong bytecode version. Expected 76 but got 59

2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ WubaRN$ExceptionHandler.handleException  (WubaRN.java:526)

2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │  : com.facebook.jni.UnknownCppException: Unknown

2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │     at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)

### 计算机网络

*   HTTP 缓存

*   你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

*   HTTP 常用的请求方式,区别和用途?

*   HTTPS 是什么?具体流程

*   三次握手和四次挥手

*   你对 TCP 滑动窗口有了解嘛?

*   WebSocket与Ajax的区别

*   了解 WebSocket 嘛?

*   HTTP 如何实现长连接?在什么时候会超时?

*   TCP 如何保证有效传输及拥塞控制原理。

*   TCP 协议怎么保证可靠的,UDP 为什么不可靠?

![](https://s2.51cto.com/images/20210920/1632129668658785.jpg)

**[CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://ali1024.coding.net/public/P7/Web/git)**

### 算法

* 链表

* 字符串

* 数组问题

* 二叉树

* 排序算法

* 二分查找

* 动态规划

* BFS

* 栈

* DFS

* 回溯算法

  ![](https://s2.51cto.com/images/20210920/1632129668115812.jpg)