返回博客首页
← 所有文章

NativeScript 6.4 发布

2020 年 2 月 12 日 — 作者 Emil Tabakov

如果有一个公众奖项,{N} 6.4 会获得它。这个版本中发布的大多数功能都是由社区中的成员开始或受到影响的。我们非常感谢大家的参与,在这次迭代中,团队花了一些时间来完善和合并这些功能到框架中。

自定义 Webpack 配置

每个人都修改过 webpack.config.js,都知道更新项目后很难维护。你必须手动将最新的更改与本地更改合并。这个过程可能需要很长时间,并让你头疼。
基于 soarer1004 的想法,我们添加了一种在项目中使用自定义 webpack 配置的简单方法。现在,你可以将所有自定义代码移到一个新文件中,并将 nsconfig.json 中的 webpackConfigPath 属性指向这个新文件。它可以选择包含或忽略来自插件的原始配置。更多信息请参见 文档

元数据过滤

到目前为止,NativeScript 在其元数据中包含所有支持的原生实体,应用程序作者无法控制此行为。这允许应用程序和插件作者从 JavaScript 自由调用任何原生 API,在应用程序和插件开发期间非常完美。但是,在某些情况下,拥有所有 API 的元数据是不希望的。

  • 这可能涉及安全隐患,在元数据二进制文件中提到不应该知道的实体名称可能是不可接受的;
  • 应用程序大小可能会因不必要的元数据而增加,而这些元数据从未被使用过。实际上,应用程序实际上只调用了可用功能的一小部分,因此大多数实体实际上是多余的。

为了让开发人员控制在生成的元数据中包含 (或不包含) 什么,我们实现了通过其原生名称对符号进行黑名单和白名单的支持。要了解更多关于该功能及其使用方法的信息,你可以参考 元数据文档部分

当我们在 {N} 的核心模块中为 iOS 启用过滤时,元数据文件从每个 CPU 架构 (arm64、armv7) 的约 5.5 MB 减少到约 1.2 MB。至于 Android - 从约 2.1 MB 减少到约 1.1 MB。实际上,我们在决定默认过滤什么方面一直比较保守。因此,如果你想冒险,可以尝试更积极地过滤,并与我们分享你的成果!

注意: 为了使该功能变得简单易用,无需了解应用程序插件的内部结构,所有插件作者都应该开始声明其使用列表,如文章中所述。在此之前,想要启用该功能的应用程序作者在编写规则时需要考虑所有使用插件的需求。

3D 视图变换

一个非常特别的 PR 被合并到 6.4.0 版本中 - 3D 旋转 现在可以在 NativeScript 中使用。这的确是一条崎岖的道路,所以要特别感谢 Hamdi WanisRyan Pendergast 为此付出的努力和奉献!

3d rotations demo

新的 CSS 解析器

在这个版本中,我们用 csstree (https://github.com/csstree/csstree) 替换了当前的 CSS 解析器 (https://github.com/reworkcss/css),csstree 是现有的最快的 JavaScript 解析器之一。这将根据 CSS 使用量提高应用程序性能。

CLI 中对 Pnpm 的支持

如你所知,目前 NativeScript CLI 支持两种包管理器 - npmyarn。随着 JavaScript 生态系统的不断发展,我们每天都会出现新的依赖项管理方法。感谢 farfromrefug 的贡献,现在 NativeScript CLI 支持一个额外的包管理器 - pnpm。如文档中所述,pnpm 使用硬链接和符号链接来确保磁盘上只保存一个模块的版本。例如,当你使用 npm 或 Yarn 时,如果你有 100 个项目使用同一个版本的 lodash,那么你将有 100 个 lodash 的副本在磁盘上。使用 pnpm,lodash 将被保存到磁盘上的一个位置,而硬链接将其放入应该安装的 node_modules 中。
你可以通过执行以下命令来设置 NativeScript CLI 使用 pnpm

tns package-manager set pnpm

之后,CLI 将在所有用于管理应用程序依赖项的操作中使用 pnpm 而不是 npm,例如项目创建。

注意: 如果你手动调用 pnpm install,请确保传递 --shamefully-hoist 标志。

Android 中对 WebAssembly 的支持

WebAssembly 现在已在 Android 上正式支持。以下是如何编译、实例化和执行 WASM 模块的示例。

// #include <stdio.h>
// #include <sys/uio.h>
//
// #define WASM_EXPORT __attribute__((visibility("default")))
//
// extern double logarithm(double value);
//
// WASM_EXPORT int log(double value) {
//     return logarithm(value);
// }

let wasmCode = new Uint8Array([
    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x02,
    0x60, 0x01, 0x7c, 0x01, 0x7c, 0x60, 0x01, 0x7c, 0x01, 0x7f, 0x02, 0x91, 0x80, 0x80, 0x80,
    0x00, 0x01, 0x03, 0x65, 0x6e, 0x76, 0x09, 0x6c, 0x6f, 0x67, 0x61, 0x72, 0x69, 0x74, 0x68,
    0x6d, 0x00, 0x00, 0x03, 0x82, 0x80, 0x80, 0x80, 0x00, 0x01, 0x01, 0x04, 0x84, 0x80, 0x80,
    0x80, 0x00, 0x01, 0x70, 0x00, 0x00, 0x05, 0x83, 0x80, 0x80, 0x80, 0x00, 0x01, 0x00, 0x01,
    0x06, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x07, 0x90, 0x80, 0x80, 0x80, 0x00, 0x02, 0x06,
    0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x03, 0x6c, 0x6f, 0x67, 0x00, 0x01, 0x0a,
    0x8d, 0x80, 0x80, 0x80, 0x00, 0x01, 0x87, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x00, 0x10,
    0x00, 0xaa, 0x0b
]);

let importsObj = {
    env: {
        // javascript callback that will be invoked from the WASM module
        logarithm: Math.log
    }
};

try {
    let wasmModule = await WebAssembly.compile(wasmCode);
    let moduleInstance = await WebAssembly.instantiate(wasmModule, importsObj);
    let result = moduleInstance.exports.log(Math.E);
    console.log(result); // will print 1
} catch (e) {
    console.error(e);
}

V8 更新

V8 是 {N} 在 Android 上性能的关键部分之一。在新版本中,Android 运行时现在使用 V8 8.0。在这个新版本中,有几个优化,例如 OSR (栈上替换) 和指针压缩,导致内存和 CPU 时间使用量更少。其他新功能包括对可选链和空值合并运算符的支持。