NativeScript 7.0 标志着该框架向前迈出了重要一步,它与现代 JS 标准保持一致,并在整个堆栈中带来了广泛的一致性。它还对围绕该框架的所有开源的管理进行了全面整理,使 JS 生态系统更改能够更有效地更新。
此版本证明了该框架是社区驱动的,并由 已建立的开源指南 治理的有效性和真正含义。
不过你真的应该阅读下面所有公告细节 😆
安装 7.0 cli
npm i -g nativescript
你现在有一些新的 cli 别名
ns
- 新标准 ✨nsc
- 对于那些无法停止思考 javac
的人,你可以将其视为“NativeScript 编译器tns
- 出于历史原因,它将始终有效还有一个新的便捷 clean
命令,这通常成为跨开发团队的常见障碍。这有助于确保在需要时清理适当的项目文件。
ns clean
注意:如果你的世界颠倒了,从现在起只需 ns clean
即可。🧹😊
你还可以使用以下方法迁移现有项目*
ns migrate
注意:* 在迁移之前,请始终先检查项目插件的 NativeScript 7 兼容性,并随时在该帖子中评论,如果你使用的是尚未列出支持的插件,我们可以帮助作者。
你还可以查看 导入参考指南 ,以帮助扁平化项目可能使用的任何深度导入。
让我们介绍 7.0 带来的关键要素。
NativeScript 自一开始就针对 es5
和 commonjs
。它运行良好,但现在有一些改进值得利用。
针对 es2017+ 允许更快速、更高效的代码,同时允许你使用最新的 ES 进步,例如真正的 空值合并运算符 ??。过去,TypeScript 允许你使用许多新功能,但它们将被转换为 ES5 代码,某些方面实际上可能会变得更慢。NativeScript 使用的 v8 引擎(现在也适用于 iOS!🎉)始终对最新的 ES 支持具有领先优势。
许多框架 npm 包已进行范围限定(@nativescript
),包括几个插件,以帮助澄清和区分哪些是 NativeScript 7 支持的(基于 es2017 的构建)。它还有助于我们长期以来渴望的某些项目依赖项组织。
仅当你使用 TypeScript 并且正在扩展本机类时,才需要此装饰器。如果你使用的是纯 JavaScript,你可以照常使用 .extend()
函数。
NativeScript 的一项有吸引力(且有趣)的功能是它能够直接在 JavaScript 中扩展本机平台类。但是 JavaScript 无法自行知道如何扩展本机类。当你编写 class MyClass extends android.os.class
时,它被编译为 ES5,运行时使用 __extends
函数来处理此行为。在 ES2017 中,extends
本地受支持,因此被“按原样”编译,省略了运行时所需的 __extends
。
这是一个使用装饰器的绝佳机会,多亏了一位出色的社区贡献者 Martin Guillon,又名 farfromrefug 🤗,我们能够在这里引入 @NativeClass() 装饰器来提供帮助。
你可以在本文中查看如何使用 NativeClass 装饰器的示例
应用程序配置的处理有一些地方,它应该集中和简化 - 以及强类型化!
在任何应用程序的根 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"
}
},
...
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"
}
NativeScript 的 Android 运行时已经运行了很长一段时间的 JavaScript v8,但是 iOS 运行时一直在使用 JavaScriptCore。这导致了每个运行时行为方式的一些细微差别。
在 NativeScript 7 中,iOS 运行时首次使用 @nativescript/ios
使用相同的 v8 引擎。这也有助于改善两个运行时的维护。
注意:如果你发现新的 v8 引擎存在问题,你仍然可以使用基于 JavaScriptCore 的
tns-ios
运行时。如果你需要使用旧的 android 运行时,你也可以继续使用tns-android
。
"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 年路线图
请大家保重!✌️