返回博客主页
← 所有文章

NativeScript 7.0 发布

2020 年 8 月 31 日 — 由 技术指导委员会 (TSC)

NativeScript 7.0 标志着该框架向前迈出了重要一步,它与现代 JS 标准保持一致,并在整个堆栈中带来了广泛的一致性。它还对围绕该框架的所有开源的管理进行了全面整理,使 JS 生态系统更改能够更有效地更新。

此版本证明了该框架是社区驱动的,并由 已建立的开源指南 治理的有效性和真正含义。

tl;dr

不过你真的应该阅读下面所有公告细节 😆

安装 7.0 cli

npm i -g nativescript

你现在有一些新的 cli 别名

  • ns - 新标准 ✨
  • nsc - 对于那些无法停止思考 javac 的人,你可以将其视为“NativeScript 编译器
  • tns - 出于历史原因,它将始终有效

还有一个新的便捷 clean 命令,这通常成为跨开发团队的常见障碍。这有助于确保在需要时清理适当的项目文件。

ns clean

注意:如果你的世界颠倒了,从现在起只需 ns clean 即可。🧹😊

你还可以使用以下方法迁移现有项目*

ns migrate

注意:* 在迁移之前,请始终先检查项目插件的 NativeScript 7 兼容性,并随时在该帖子中评论,如果你使用的是尚未列出支持的插件,我们可以帮助作者。

你还可以查看 导入参考指南 ,以帮助扁平化项目可能使用的任何深度导入。

让我们介绍 7.0 带来的关键要素。

从 es5 到 es2017+

NativeScript 自一开始就针对 es5commonjs。它运行良好,但现在有一些改进值得利用。

针对 es2017+ 允许更快速、更高效的代码,同时允许你使用最新的 ES 进步,例如真正的 空值合并运算符 ??。过去,TypeScript 允许你使用许多新功能,但它们将被转换为 ES5 代码,某些方面实际上可能会变得更慢。NativeScript 使用的 v8 引擎(现在也适用于 iOS!🎉)始终对最新的 ES 支持具有领先优势。

在此处阅读有关此推动力的更多信息

许多框架 npm 包已进行范围限定(@nativescript),包括几个插件,以帮助澄清和区分哪些是 NativeScript 7 支持的(基于 es2017 的构建)。它还有助于我们长期以来渴望的某些项目依赖项组织。

@NativeClass() 装饰器(仅适用于基于 TypeScript 的项目)

仅当你使用 TypeScript 并且正在扩展本机类时,才需要此装饰器。如果你使用的是纯 JavaScript,你可以照常使用 .extend() 函数。

NativeScript 的一项有吸引力(且有趣)的功能是它能够直接在 JavaScript 中扩展本机平台类。但是 JavaScript 无法自行知道如何扩展本机类。当你编写 class MyClass extends android.os.class 时,它被编译为 ES5,运行时使用 __extends 函数来处理此行为。在 ES2017 中,extends 本地受支持,因此被“按原样”编译,省略了运行时所需的 __extends

这是一个使用装饰器的绝佳机会,多亏了一位出色的社区贡献者 Martin Guillon,又名 farfromrefug 🤗,我们能够在这里引入 @NativeClass() 装饰器来提供帮助。

你可以在本文中查看如何使用 NativeClass 装饰器的示例

nsconfig.json → nativescript.config.ts

应用程序配置的处理有一些地方,它应该集中和简化 - 以及强类型化!

nativescript.config

在任何应用程序的根 package.json 中一直有一个 nativescript 键,用于管理应用程序包 ID 和运行时版本。应用程序 src 目录中还嵌入了另一个 package.json,其中包含运行时标志。以及另一个名为 nsconfig.json 的文件,其中包含用于定义有关项目各种事项的其他应用程序配置。

在 NativeScript 7 中,所有这些都合并到一个 nativescript.config.ts(或 nativescript.config.js)中。让我们看一个例子

之前

  • nsconfig.json
{
  "appResourcesPath": "App_Resources",
  "appPath": "src",
  "webpackConfigPath": "webpack.config.js"
}
  • src/package.json
{
  "main": "app.js",
  "android": {
    "v8Flags": "--nolazy --expose_gc",
    "markingMode": "none",
    "suppressCallJSMethodExceptions": false
  },
  "discardUncaughtJsExceptions": false
}

  • package.json
{
  "nativescript": {
    "id": "com.company.app",
    "tns-android": {
      "version": "6.5.3"
    },
    "tns-ios": {
      "version": "6.5.2"
    	}
  },
  ...

之后

  • nativescript.config.ts
import { NativeScriptConfig } from '@nativescript/core';

export default {
  id: 'com.company.app',
  main: 'app.js',
  appResourcesPath: 'App_Resources',
  webpackConfigPath: 'webpack.config.js',
  ios: {
    discardUncaughtJsExceptions: true
  },
  android: {
    discardUncaughtJsExceptions: true,
    v8Flags: '--nolazy --expose_gc',
    "markingMode": "none",
    "suppressCallJSMethodExceptions": false
  }
} as NativeScriptConfig;

运行时版本现在可以像预期的那样在 devDependencies 中进行管理

"devDependencies": {
  "@nativescript/android": "~7.0.0",
  "@nativescript/ios": "~7.0.0"
}

v8 iOS 引擎

NativeScript 的 Android 运行时已经运行了很长一段时间的 JavaScript v8,但是 iOS 运行时一直在使用 JavaScriptCore。这导致了每个运行时行为方式的一些细微差别。

在 NativeScript 7 中,iOS 运行时首次使用 @nativescript/ios 使用相同的 v8 引擎。这也有助于改善两个运行时的维护。

注意:如果你发现新的 v8 引擎存在问题,你仍然可以使用基于 JavaScriptCore 的 tns-ios 运行时。如果你需要使用旧的 android 运行时,你也可以继续使用 tns-android

我应该使用哪些依赖版本才能使用 NativeScript 7?

"dependencies": {
	"@nativescript/core": "~7.0.0"
},
"devDependencies": {
  "@nativescript/android": "~7.0.0",
  "@nativescript/ios": "~7.0.0",
	"@nativescript/types": "~7.0.0",
  "@nativescript/webpack": "~3.0.0",
	"typescript": "~3.9.0"
}

使用新的 @nativescript/types,如果你需要 iOS 和 Android 类型声明,实际上可以将 references.d.ts 简化为以下内容

/// <reference path="./node_modules/@nativescript/types/index.d.ts" />

如果你需要,你还可以根据需要包含特定的平台类型;例如,假设你想要不同的 Android sdk 类型以及 iOS 类型

/// <reference path="./node_modules/@nativescript/types-ios/index.d.ts" />
/// <reference path="./node_modules/@nativescript/types-android/lib/android-29.d.ts" />

衷心感谢

我们想借此机会特别感谢整个社区,他们提供了出色的问题报告、拉取请求,以及通过 Open Collective 以及 Github 提供的宝贵贡献。没有您,TSC 根本无法准备和执行像这样的重大版本,我们很高兴听到大家对我们继续推进 NativeScript 的更多反馈。

想更多参与吗?

我们欢迎任何人在框架的开发过程和历史中参与。一个好的起点是加入每周的 社区聊天,该聊天每个星期三太平洋时间下午 12 点举行。然后查看框架遵循的 治理准则,并尝试提交修复或功能!❤️

下一步是什么?

对于此版本,我们有一些立即的后续任务要完成,包括

对于 7.1,我们计划通过专注于以下方面来继续交付 2020 年路线图

  • 完成于 7 月开始的远程云构建选项
  • 一流的 a11y 功能
  • 扩展框架的使用案例适用性 - Ionic 集成 等)
  • 引入新的 Canvas 2d 和 WebGL 支持

请大家保重!✌️