原生库与 Autolink
Lynx 原生库是一个 npm 包,可以打包元件、原生模块和 Service 中的任意组合,供宿主 Lynx 应用消费。Autolink 是一种集成机制,让宿主应用自动发现 node_modules 中安装的库,并在 Android 和 iOS 上自动注册它们的能力,避免为每个元件、原生模块或 Service 手动写注册代码。
Autolink 当前只覆盖 Android 和 iOS 原生库,不生成 Web 或 HarmonyOS 的接入代码。
请使用与应用 Lynx SDK 同一发布渠道的 Autolink 工具。相关 package 和 plugin 名称如下:
- npm:
create-lynx-library和@lynx-js/autolink-codegen(lynx-autolink-codegenbinary) - Android:Gradle plugin
org.lynxsdk.library-settings和org.lynxsdk.library-build - iOS:Ruby gem
cocoapods-lynx-library
如果当前配置的 registry 还无法解析其中某个包,说明你使用的 Lynx SDK 发布版本尚未在该 registry 中包含 Native Autolink。此时请继续使用既有手动原生注册方式,等待匹配版本发布后再接入。
什么是 Lynx 原生库
一个库就是一个 npm 包,可以包含以下能力的任意组合:
- 元件:Lynx 渲染的自定义原生 UI 元件,例如
<x-button>。 - 原生模块:可以在 Lynx 应用代码中调用的、带类型声明的 JavaScript-to-native API。
- Service:应用级的原生单例,可以被库内的其他能力依赖。
每个库都通过包根目录下的 lynx.lib.json manifest 声明原生入口。这三类能力相互独立:一个库可以只暴露元件、只暴露原生模块、只暴露 Service,也可以暴露它们的任意组合。
应用侧像安装普通 npm 依赖一样安装库。Android Gradle plugin 和 iOS CocoaPods plugin 会读取 lynx.lib.json,把原生代码链接进宿主应用;宿主应用本身无需了解每个库具体暴露了哪些能力。
使用库
本节面向把一个或多个库集成进宿主 Lynx 应用的应用团队。
宿主应用项目结构
接入 Autolink 前,需要先确保宿主应用有一个可以安装 npm 包的项目根目录,并暴露原生应用的构建入口。典型结构如下:
package.json是必需的,用来声明 Autolink 库依赖。- Android 接入需要 Gradle settings 文件,例如
settings.gradle或settings.gradle.kts,以及 Android application 的构建文件,例如app/build.gradle或app/build.gradle.kts。 - iOS 接入需要 CocoaPods 入口,通常是
Podfile。如果团队通过 Bundler 管理 Ruby 依赖,可以在Gemfile中维护cocoapods-lynx-librarygem。
安装依赖后,Autolink 会从已安装 npm 包的包根目录扫描 lynx.lib.json。package-lock.json、pnpm-lock.yaml 或 yarn.lock 等 lockfile 有助于可复现安装,但不是 Autolink 的必需项。
接入 Autolink
宿主应用只需要接入一次 Autolink。接入完成后,已安装的库会从 node_modules 中被发现,并在 Lynx 初始化时通过生成的 registry 自动注册。
在 iOS 构建环境中安装 cocoapods-lynx-library gem。然后在应用的 Podfile 中加入 CocoaPods plugin,并调用 use_lynx_library!。执行 pod install 时,插件会加入库的 podspec 和生成的 registry pod:
执行 pod install 后,Autolink 会生成 registry pod,并把它接入 Lynx 的初始化流程。应用创建 LynxConfig 或初始 化 LynxEnv 时,库提供的元件、原生模块和 Service 会自动注册生效;业务侧无需导入生成文件或编写额外初始化代码。
安装库
应用接入 Autolink 后,在 Lynx 应用中安装库:
每个库包都会在包根目录暴露 lynx.lib.json manifest。Autolink 会扫描已安装 npm 包中的这个文件。
Android 侧必须声明 platforms.android.packageName,sourceDir 默认是 android。iOS 侧 sourceDir 默认是 ios,podspecPath 默认使用 iOS 源码目录下找到的第一个 .podspec 文件。
安装或更新库后,Android 侧重新 sync/build 应用,iOS 侧重新执行 pod install,让生成的 registry 和原生依赖刷新。应用中不需要为每个库再写手动注册代码。
开发库
本节面向开发可复用原生库供其他 Lynx 应用安装的库作者。
库包结构
一个典型的库结构如下:
package.json让库可以通过 npm 安装,并通常提供codegen脚本。lynx.lib.json是 Autolink 清单文件,用来告诉宿主应用 Android 和 iOS 源码在哪里。types/index.d.ts描述库中可选的原生模块类型声明;如果库暴露原生模块,codegen 会基于这些声明生成平台 spec 和 JavaScript facade。src/index.ts导出应用代码需要 import 的 JavaScript API。android/和ios/放置原生实现以及生成的原生 spec。example/是库作者用于本地验证的示例应用。
创建库
使用交互式命令创建库:
在脚本或测试中,也可以用 flags 直接生成: