各种运行环境
不同运行环境下的 JavaScript
- 浏览器:ECMAScript + DOM + BOM
- NodeJS:ECMAScript + Native(fs、http) + NPM
- 小程序:ECMAScript + 小程序框架 + 小程序API
UI 渲染技术
一般来说,渲染界面的技术有三种:(1):纯客户端原生渲染;(2):纯 web 技术渲染;(3):混合开发 Hybrid 技术。
比如微信 JS-SDK 使用浏览器内核渲染,React Native 在渲染底层是用客户端原生渲染的。
uni-app
环境
- IDE:HBuilderX
- 兼容平台:微信/支付宝/百度/头条/QQ/快手/钉钉/淘宝)小程序、快应用、H5、Android App、iOS App
编译器和运行时
uni-app分编译器和运行时(runtime)。uni-app能实现一套代码、多端运行,是通过这2部分配合完成的。
runtime不是运行在电脑开发环境,而是运行在真正的终端上。
编译器内置在HBuilderX工具中,也可以使用独立的cli版。编译器将开发者的代码进行编译,编译的输出物由各个终端的runtime进行解析,每个平台(Web、Android App、iOS App、各家小程序)都有各自的runtime。
JS 引擎 & 渲染引擎
在web平台,逻辑层(js)和渲染层(html、css),都运行在统一的webview里。
但在小程序和app端,逻辑层和渲染层被分离了。
不管小程序还是app,逻辑层都独立为了单独的js引擎,渲染层仍然是webview(app上也支持纯原生渲染)。
所以注意小程序和app的逻辑层都不支持浏览器专用的window、dom等API。app只能在渲染层操作window、dom,即renderjs。
关于逻辑层和渲染层分离带来的注意事项,请详读
UI
uni-app 有 vue 页面和 nvue 页面。vue 页面是 webview 渲染的,nvue 只针对打包为 App 端并且app 端的 nvue 页面是原生渲染的。
为支持跨平台,框架建议使用 Flex 布局
JS
uni-app的js代码,h5端运行于浏览器中。非h5端(包含小程序和App),Android平台运行在v8引擎中,iOS平台运行在iOS自带的jscore引擎中,都没有运行在浏览器或 webview里。
非H5端,虽然不支持window、document、navigator等浏览器的js API,但也支持标准ECMAScript。
vue
- uni-app 新增了应用和页面的生命周期
- 发布到 H5 时支持所有vue的语法
特点
- 组件、api 与微信小程序一致
- 兼容 weex 原生渲染
- 内嵌 mpvue 框架
- 支持通过 npm 安装第三方包
- 支持微信小程序自定义组件及 SDK
- 兼容 mpvue 组件及项目
- App 端支持和原生混合编码,还支持原生渲染的nvue,以及可以编译为kotlin和swift的uts。
在跨端的同时,通过条件编译+平台特有API调用,可以优雅的为某平台写个性化代码,调用专有能力而不影响其他平台。
支持原生代码混写和原生sdk集成。
语法
vue、js、css、native vue
什么是tabBar 页面
页面间通信
uni.$emit、 uni.$on 、 uni.$once 、uni.$off 触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等
- uni.$emit(eventName,OBJECT)
- uni.$once(eventName,callback)
- uni.$off:移除监听器
全局变量
uni
注意事项
与普通 web 开发不同的地方:
- 像素单位由 px 改为 upx
background-image
只能使用公网的图像
uts
uni type script,强类型编程语言
资料
- Wot Design Uni
- 基于Vue3+TS开发,提供70+高质量组件,支持暗黑模式、国际化和自定义主题。
React Native
跨 Android 和 IOS App 开发,使用用 Web 相关技术来编写,同样是利用了 JavaScript 解释执行的特性,但 RN 在渲染底层是用客户端原生渲染的。
react-native就是基于Virtual DOM渲染出原生控件。
初始化项目
最新版本:react-native@0.73.2
npx react-native init demo --template react-native-template-typescript
不安装某些依赖包(ios)
npx react-native init demo --template react-native-template-typescript --skip-install CocoaPods
可选模版:react-native-template-
注意: npx react-native@X.XX.X init AwesomeProject --version X.XX.X
项目名只能用字母
配置
app.json 中的 name 只能包含字母和数字,可以使用大小写
编译
有 React Native CLI 和 Android Studio 两种方式
React Native CLI
- 生成签名秘钥
执行
keytool -genkey -v -keystore ./key/release.keystore -alias release -keyalg RSA -keysize 2048 -validity 10000
将秘钥文件添加到 android/app
目录下
修改 android/app/build.gradle
中 signingConfigs
配置,(确保 signingConfigs
配置块在 buildTypes
之前)
创建
android/app/src/main/assets
(若没有)编译web资源
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
- 生成apk
cd android
# For Linux and Mac OSX
./gradlew assembleRelease
# For Windows
gradlew assembleRelease
expo
Android、IOS、Web 跨平台开发
Expo is a React framework that lets you create universal Android, iOS, and web apps with truly native UIs. It provides an SDK for React Native that makes the native parts easier to use.
工具包
react-native-safe-area-context
react-native-gesture-handler
@react-navigation/native
资料
- React Native CLI
- React Native Directory
- react-native 组件库
- react-native 组件库
- React Navigation
- @react-native-async-storage/async-storage:异步、未加密、持久、键值存储系统
Flutter
Tauri
Tauri:将JavaScript与Rust混用于GUI桌面应用程序
Weex
vue 技术
taro
京东
Donut
Donut 多端框架是支持使用小程序原生语法开发移动应用的框架,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发