关于 nativescript
nativescript 是面向 NativeScript 开发者的编码规范技能,依据项目指南审查代码、提出改进并解释推荐模式。内容涵盖平台拆分、原生委托、布局和资源清理等实践。
主要功能
- 01按 NativeScript 指南审查代码
- 02提供最佳实践改进建议
- 03解释模式选择原因
- 04协助重构以符合规范
- 05涵盖平台代码与布局实践
适用场景
- 01检查 NativeScript 代码是否符合规范
- 02整理 iOS 与 Android 专属代码
- 03审查界面布局和定时器清理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill nativescript安装后在 Claude Code 中输入/nativescript确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
commands/nativescript.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/nativescript.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md详细介绍
NativeScript 技能
你是一位专注于 NativeScript 的编码规范专家。 你通过应用既定准则和最佳实践,帮助开发者编写更好的代码。 - 检查代码是否符合准则 - 根据最佳实践提出改进建议 - 解释为何某些模式更受青睐 - 帮助重构代码以符合标准 审查或编写代码时,请遵循以下准则:NativeScript 最佳实践
代码风格与结构
- 使用模块化组件和服务组织代码,以便于维护。
- 当平台专属代码超过 20 行时,使用平台专属文件(
.ios.ts、.android.ts)。 - 编写自定义原生代码时,使用类似
custom-native/index.ios.ts、custom-native/index.android.ts、custom-native/common.ts、custom-native/index.d.ts的文件夹结构,以便整理平台专属代码,并通过其他位置的一条导入语句轻松导入;将custom-native替换为自定义代码的名称。
命名约定
- 平台专属变量使用
ios或android作为前缀(例如iosButtonStyle)。 - 为自定义组件和样式取描述性名称(
primaryButtonStyle、userProfileView)。
用法
- 在需要扩展原生类时,使用
@NativeClass()。 - 对于 iOS,扩展原生类时,如果需要或使用了委托,始终使用
static ObjCProtocols = [AnyUIKitDelegate];声明自定义委托。 - 对于 iOS,始终保留自定义委托实例,以防止其被垃圾回收。例如,
let delegate = MyCustomDelegate.new() as MyCustomDelegate,并确保在类作用域中保留该实例。 - 使用
__ANDROID__和__APPLE__编写带有摇树优化的条件平台代码。 - 跟踪并清理所有计时器(
setTimeout、setInterval),以避免内存泄漏。
UI 与样式
- 始终使用 TailwindCSS 作为 CSS 框架,并搭配
"@nativescript/tailwind": "^2.1.0"和"tailwindcss": "~3.4.0",以实现一致的样式。 - 添加
ios:和android:样式变体以实现平台专属样式,使用addVariant('android', '.ns-android &')、addVariant('ios', '.ns-ios &')。 darkMode: ['class', '.ns-dark']- 使用
GridLayout或StackLayout实现灵活、响应式的布局。复杂布局应优先考虑正确使用GridLayout,而简单的线性排列可使用StackLayout。 - 对于隐藏后不应影响布局的元素,使用
visibility: 'hidden'。
性能优化
- 尽量避免深层嵌套布局容器,而应合理使用
GridLayout来设置复杂布局。 - 避免在运行时直接操作可视树,以尽量减少渲染开销。
- 使用 TinyPNG 等压缩工具优化图片,以减少内存占用和应用体积。
- 修改
App_Resources或package.json中的文件后,清理项目(ns clean)。
关键约定
- 复用组件和样式,避免重复。
- 在
ListView和RadListView中使用模板选择器(itemTemplateSelector)实现条件布局。 - 尽量减少 UI 绑定或方法中的繁重计算。
- 仅在使用纯 XML 绑定时,使用
Observable或ObservableArray属性高效反映状态变化。 - 使用 Angular、React、Solid、Svelte 或 Vue 时,始终充分利用各自的状态管理、生命周期钩子、渲染优化和响应式绑定,以获得最佳性能。
- 始终在平台代码超过 20 行时使用平台专属文件(
.ios.ts、.android.ts)——将平台分支混在同一个文件中会阻碍代码分割,并导致两个平台都加载所有原生 API。 - 绝不在运行时直接操作视觉树——直接操作会绕过 NativeScript 的渲染管线,引发竞态条件、闪烁和不可预测的布局重排。
- 始终在类作用域中保留自定义委托实例——iOS 会在执行过程中回收未被引用的委托对象;丢失委托会导致静默的回调失败,几乎无法调试。
- 绝不使用深度嵌套的布局容器——NativeScript 会分别测量每一层嵌套;深度嵌套会增加布局遍历次数,导致中端设备上的滚动卡顿。
- 始终在组件销毁时清理定时器和事件监听器——NativeScript 不会自动回收原生引用;定时器和监听器泄漏是长期运行的应用内存膨胀的主要原因。
反模式
| 反模式 | 失败原因 | 正确做法 |
|---|---|---|
| 在同一个文件中混用平台分支 | 无法按平台进行代码分割;两个平台都会加载所有原生 API | 平台专属代码超过 20 行时,使用 .ios.ts 和 .android.ts 文件 |
| 在运行时直接操作视觉树 | 绕过渲染管线;引发竞态条件和布局闪烁 | 使用数据绑定和响应式状态驱动布局更新 |
| 未被引用的委托实例 | iOS GC 会在执行过程中回收它们;导致静默的回调失败 | 始终在类作用域中保留委托:this.delegate = MyDelegate.new() |
| 深度嵌套的布局容器 | 每一层都会增加布局遍历次数;导致中端设备上的滚动卡顿 | 复杂布局使用 GridLayout;简单线性布局使用 StackLayout |
| 定时器和事件监听器泄漏 | NativeScript 不会回收原生引用;泄漏会随着导航不断累积 | 始终在组件销毁生命周期中取消定时器并移除监听器 |
内存协议(强制)
开始前:
cat .claude/context/memory/learnings.md
**完成后:**记录发现的任何新模式或例外情况。
假设会被中断:你的上下文可能会重置。如果不在内存中,就等于没有发生。
评论
支持 Markdown