Code前端首页关于Code前端联系我们

Vue3开发者,你真的知道用Vue3 NativeScript做跨端APP有多爽吗?

terry 53分钟前 阅读数 8 #Vue

如果你是写惯了Vue3单页应用,又突然接了个要覆盖iOS和Android的小项目;或者是讨厌RN各种原生模块绑定坑、Flutter重新学Dart的成本;甚至只是想快速把手里成熟的Vue3 Web业务逻辑搬去移动端,那接下来的内容应该能解决你不少疑问。

先搞清楚Vue3 NativeScript到底是什么“来头”

很多人会把它和UniApp、Taro搞混,其实它们本质不一样,Taro是多端编译,写一套代码,编译成微信小程序、H5、RN等;UniApp也是类似,主要覆盖移动生态(小程序多端+H5+APP),APP层是封装了5+ Runtime,而Vue3 NativeScript(官方叫@nativescript/vue),是把Vue3的响应式系统、模板语法直接绑定到iOS的UIKit和Android的原生视图上,完全没有WebView,是纯原生渲染的跨端框架——这一点和RN、Flutter才是同一赛道。

不过它和RN最大的不同,是不用写两套语言或者复杂的桥接代码(除非你要加极其特殊的原生能力);和Flutter最大的不同,是你不用放弃已经摸得门儿清的Vue3全家桶、不用适应新的渲染树思想,甚至连Element Plus/Vant这样的组件库思路都能用得上,只是把标签换成了它自己的原生标签而已。

既然是纯原生,它的开发体验会不会很差?

恰恰相反,对于Vue3开发者来说,上手快到离谱。

标签和语法几乎无缝衔接

举个最简单的例子,你在Web Vue3里写一个计数器:

<template>
  <div>
    <h1>{{ count }}</h1>
    <button @click="count++">加1</button>
  </div>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

在Vue3 NativeScript里,你只需要改标签名——把div换成StackLayout(垂直布局容器,像flex-direction: column的div),h1换成Label,button换成Button,@click还是@click,ref还是ref,完全一样的逻辑:

<template>
  <StackLayout class="container">
    <Label :text="count" fontSize="40" textWrap="true" class="count-label" />
    <Button text="加1" @tap="count++" class="tap-button" />
  </StackLayout>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<style>
.container {
  align-items: center;
  justify-content: center;
  flex: 1;
  padding: 20;
}
.count-label {
  margin-bottom: 30;
  color: #42b983;
}
.tap-button {
  background-color: #42b983;
  color: white;
  padding: 15 30;
  border-radius: 8;
  font-size: 18;
}
</style>

甚至连CSS都能用Flexbox布局,只是去掉了px单位(因为原生界面不需要像素缩放,它默认根据设备像素密度适配),颜色可以用十六进制、RGB/RGBA、英文单词,和Web的写法90%重合,只有少数地方(比如原生阴影、圆角适配不同系统)需要调整。

调试模式比RN更流畅

很多跨端开发者最怕调试——要么是WebView里的断点定位不对,要么是RN的Metro bundler动不动就崩,热更新慢得让人抓狂,Vue3 NativeScript有两个调试神器: 一个是LiveSync,你改一行代码,不管是模板、脚本还是样式,iOS和Android的模拟器/真机上的界面立刻就更新,不需要手动刷新,连Vue的响应式状态都不会重置; 另一个是DevTools,你可以直接用Vue DevTools的原生插件版本,在Chrome里看组件树、响应式数据、事件触发,和调试Web Vue3完全一样的操作,不用学任何新的调试工具。

组件生态虽然不大,但够用而且自己封装也简单

目前官方维护了NativeScript UI组件库,覆盖了大部分基础原生组件:比如文本输入框TextField、图片Image、列表ListView、下拉框ActionBar、导航TabView等等,还有很多社区维护的高级组件,比如地图、图表、推送通知、指纹识别。

如果找不到你需要的组件,自己封装原生代码也比RN简单太多——不用写Java/Kotlin和Objective-C/Swift两套桥接,只需要写TypeScript/JavaScript就行,因为它有一套统一的NativeScript Runtime,能直接调用原生API,比如你想封装一个iOS的自定义渐变按钮和Android的自定义渐变按钮,只需要在同一个TypeScript文件里,用条件编译(ifdef IOS、#ifdef ANDROID)就能搞定,不用分开写两个文件。

它的性能怎么样?会不会比Flutter差很多?

纯原生渲染的跨端框架,性能差距其实都不大,主要看你的代码质量。

Vue3 NativeScript用的是Vue3的Proxy响应式系统,比Vue2的Object.defineProperty快很多,也不会有深度监听的性能问题; 它的模板编译器会把Vue3的模板直接编译成原生视图的创建、更新、销毁指令,没有虚拟DOM的中间层?不对,其实它是有轻量级虚拟DOM的,但这个虚拟DOM只是用来对比前后数据变化,生成最小的原生视图操作指令,不会像Web Vue那样把虚拟DOM渲染成真实DOM再塞到WebView里,所以性能和原生APP差不多; 官方做过性能测试,在列表滑动、动画渲染这些常见的性能敏感场景下,Vue3 NativeScript的表现和RN不相上下,甚至在某些场景下(比如简单的静态页面)比Flutter还快一点,因为Flutter的渲染引擎Skia需要启动时间,而Vue3 NativeScript直接用原生渲染引擎。

如果你要做3D游戏、实时视频剪辑这种极其复杂的原生应用,还是建议用原生语言开发,但对于大多数APP(比如电商、社交、工具类)Vue3 NativeScript的性能完全够用。

有什么真实的项目案例吗?

很多开发者可能觉得这个框架太小众,不敢用,但其实已经有不少成熟的项目在用了: 比如加拿大的某知名连锁咖啡店的员工排班APP,覆盖了iOS和Android,用的就是Vue3 NativeScript,员工反馈界面流畅、操作简单; 比如国内某互联网公司的内部员工OA APP,也是用Vue3 NativeScript开发的,开发周期只用了3个月,比原来计划的用RN开发快了一半; 比如社区里很多开发者做的个人项目,比如天气预报、记账本、背单词APP,都已经上架了App Store和Google Play Store。

给Vue3开发者的建议

如果你是刚接触跨端开发,又不想学Dart,不想碰复杂的桥接代码,那Vue3 NativeScript绝对是你的首选; 如果你手里已经有成熟的Vue3 Web业务逻辑,只是想快速做一个原生APP,那可以直接把业务逻辑复制过去,只需要改UI标签和样式; 如果你担心组件生态不够用,可以先去官方的插件市场看看,大部分常用的插件都有,而且自己封装也不难; 如果你担心学习成本,可以先去官方文档看看,官方文档写得非常详细,还有很多视频教程和样例项目,跟着做一遍就能上手。

Vue3 NativeScript是一个非常适合Vue3开发者的跨端框架,它能让你用最少的成本、最快的速度,做出一个纯原生渲染的iOS和Android APP,真的非常“爽”,如果你正在考虑做跨端开发,不妨试试它。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门