精华 ShadowNode v0.10.0 发布(中秋特辑)
发布于 6 年前 作者 yorkie 3486 次浏览 来自 分享

大家中秋快乐,在中秋前夕,我们为大家带来了 ShadowNode v0.10.0 的发布,其实关注我们 GitHub 的同学应该知道,我们早在上个月的26号就已经发布 v0.10 版本了。

下面还是直接进入正题,先来看看这个版本中又带了哪些新东西(英文原版可以查看:working on 0.10.x by yorkie · Pull Request #326)。

JerryScript(引擎部分)

  • 支持 Handle Scope 功能,使用 --jerryx 打开编译开关。
  • 支持 Heap Profiler 功能,用于生成 Chrome 可读的虚拟机快照。

构建及自动化

  • 增加 GitHub Release 包,每一个标签(Tag)都会提供对应版本的二进制发行包,详见:ShadowNode Release
  • 使用 GitHub Pages 作为正式官网,请访问:ShadowNode 首页
  • 增加 GitHub 的 Issue / Pull Request 模版。
  • 为所有平台的 CMake 编译配置都增加了 CMAKE_EXTERNAL_SYSROOT 和 CMAKE_TOOLCHAIN_ROOT。
  • 移除 TravisCI 上的 Docker,减少每次构建及测试的时间到10分钟。
  • 使用 Yarn 替代了 npm 安装 Node.js 依赖包。

N-API

  • 覆盖了大部分 N-API 接口,兼容列表如下:N-API。

模块

  • Buffer
    • 增加 readFloatLE / readDoubleLE 方法。
  • Util
    • 增加 promisify 方法。
  • Module
    • 修复模块搜索算法,与 Node.js 保持一致。
    • 增加 NODE_PRIORITIZED_PATH 环境变量,使用后优先从该路径搜索,用于在嵌入式设备上减少路径搜索的时间。
  • D-Bus
    • 重构并修复了若干内存泄漏问题,增加单元测试。
  • Crypto
    • 修复 hash.update() 直接传入 Buffer 的问题。
  • Profiler
    • 增加 takeSnapshot(),用于生成当前虚拟机快照。

如何使用 Heap Profiler

首先使用如下命令编译出带有 Heap Profiler 功能的二进制包:

$ ./tools/build --jerry-heap-profiler

然后使用如下脚本:

var profiler = require('profiler');
// your code
// ....
profiler.takeSnapshot('/path/to/your/test.snapshot');

执行之后会发现在指定目录生成好了 test.snapshot 文件,然后通过如下命令生成 v8 snapshot 文件:

$ node deps/jerry/tools/profiler/j2v8snap.js /path/to/your/test.snapshot test.v8snapshot

然后打开 Chrome 浏览器的调试面板,再点击到内存面板,选择加载刚才生成的 test.v8snapshot:

Screen Shot 2018-09-23 at 6.29.43 PM.png

如何使用 N-API

在 ShadowNode 中使用 N-API 也非常简单,首先编写如下 addon.c 文件:

#include <node_api.h>
#include "../common.h"
#include <string.h>

static napi_value Method(napi_env env, napi_callback_info info) {
  napi_value world;
  const char* str = "world";
  size_t str_len = strlen(str);
  NAPI_CALL(env, napi_create_string_utf8(env, str, str_len, &world));
  return world;
}

NAPI_MODULE_INIT() {
  napi_property_descriptor desc = DECLARE_NAPI_PROPERTY("hello", Method);
  NAPI_CALL(env, napi_define_properties(env, exports, 1, &desc));
  return exports;
}

然后像 Node.js 一样创建 binding.gyp:

{
  "targets": [
    {
      "target_name": "binding",
      "sources": [ "binding.c" ]
    }
  ]
}

接着直接使用 node-gyp 编译:

$ node-gyp configure && node-gyp build

然后使用开启 N-API 功能的 ShadowNode(iotjs) 执行如下文件:

'use strict';
var common = require('../../common');
var assert = require('assert');
var bindingPath = require.resolve(`./build/Release/binding.node`);
var binding = require(bindingPath);
assert.strictEqual(binding.hello(), 'world');
console.log('binding.hello() =', binding.hello());

ShadowNode N-API 完整的兼容列表查看这里,更多的例子可以点击 ShadowNode Addon Examples

一如既往的 Flag

v1.0 版本可能不会像之前文章中宣称的那么快,在 N-API 支持的情况下,我们希望在正式发布前,能够带给大家更多的 ECMAScript6 和调试方面的支持,具体可以关注我们 GitHub 的 Issue 讨论。不过每个月26号会发 Release 的惯例仍然不会改变。

最后,再祝大家中秋节快乐!

3 回复

能支持 express 和 koa 等主流框架么?

@zuohuadong ShadowNode 是使用在嵌入式设备上的,目前主要还是优先支持 IoT 协议和基本的核心接口,express / koa 这种偏服务型框架暂时还没有支持呢。

回到顶部