Shiny TypeScript 类型定义包 @posit/shiny:安装、使用与源码构建指南
后端Web框架前端【免费下载链接】shinyEasy interactive web applications with R项目地址https://gitcode.com/gh_mirrors/sh/shiny点击查看免费下载导读posit/shiny是 Shiny 项目发布的 npm 包专门为 Shiny 客户端 JavaScript 库window.Shiny提供 TypeScript 类型定义让开发者在使用 TypeScript 编写 Shiny 前端扩展时获得完整的类型提示与编译期检查。本文以 README-npm.md 为核心结合 package.json 与 srcts/types 目录中的类型声明源码讲解该包的安装方式、window.Shiny全局类型的正确用法以及 Shiny 仓库自身基于 TypeScript 的构建链路帮助读者既能在自己的项目中用好这套类型定义也能理解其背后的生成机制。一、posit/shiny 是什么posit/shiny是一个仅包含类型声明.d.ts文件的 npm 包定位十分明确它为 Shiny 的客户端 JavaScript 库提供 TypeScript 类型定义它不包含 Shiny 框架本身的运行时代码文档原文注明这一状态未来可能改变是否变化以对应发布版本为准。Shiny 本身是由 Posit PBC 开发的、同时支持 R 和 Python 的 Web 应用框架。本项目仓库shinyR 包的前端源码位于 srcts/src全部以 TypeScript 编写编译产物为 inst/www/shared/shiny.js。类型声明则统一输出到 srcts/types 目录并通过 npm 包的形式分发给前端开发者。从 package.json 的files字段可以看到该包实际只发布了LICENSE与srcts/types/**/*.d.tsfiles: [ LICENSE, srcts/types/**/*.d.ts ]也就是说安装posit/shiny后你拿到的就是一份完整的、与 Shiny 源码同步生成的类型声明集合。包名与元信息{ name: posit/shiny, version: 1.14.0-alpha.9000, license: MIT, types: srcts/types/extras/globalShiny.d.ts, engines: { node: 18, npm: 10 } }值得注意的几个元信息要点types入口指向 srcts/types/extras/globalShiny.d.ts它正是声明全局window.Shiny的入口文件引擎要求 Node.js 18 与 npm 10这是使用该包以及参与源码构建的环境前提该包运行时依赖types/bootstrap、types/jquery、types/selectize、types/datatables.net、types/ion-rangeslider、types/bootstrap-datepicker和lit等用于让类型声明与 Shiny 依赖的第三方库类型对齐。二、安装安装posit/shiny只需一条命令npm install posit/shiny安装完成后TypeScript 编译器会自动解析包入口的globalShiny.d.ts从而在整个项目中获得全局的window.Shiny类型定义。由于该包不包含运行时代码它不影响页面实际加载的shiny.js——运行时你仍需要由 Shiny 应用框架负责注入shiny.js。三、在 TypeScript 中使用 window.Shiny 类型3.1 全局类型入口包的默认类型入口 srcts/types/extras/globalShiny.d.ts 内容如下import type { ShinyClass } from ../src/shiny/index; declare global { interface Window { Shiny: ShinyClass; } }这段声明等价于在全局命名空间为Window接口增加了Shiny: ShinyClass属性。它在 TypeScript 中支持以下两种访问方式window.Shiny—— 推荐写法类型安全且语义明确直接写Shiny—— TypeScript 默认不会把Shiny视为全局变量会因无法解析而报类型错误。3.2 让裸写 Shiny 也通过类型检查如果你希望代码里可以直接写Shiny而不用加window.前缀官方给出的做法是在任意一个 TypeScript 文件中补充如下全局声明declare global { const Shiny: ShinyClass; }这样Shiny就会被识别为全局常量。不过仓库在 srcts/README.md 中明确建议更佳实践是统一使用window.Shiny避免依赖全局变量解析。3.3 加载顺序要求当你的编译产物在浏览器中执行时必须确保它在shiny.js加载之后再加载。在 Shiny 生态中最自然的做法是使用htmlDependency()将你的脚本注册为页面依赖——Shiny 会自动保证依赖在shiny.js之后按序注入。四、ShinyClass 核心类型速览posit/shiny的类型核心是 srcts/types/src/shiny/index.d.ts 中声明的ShinyClass它对应运行时 srcts/src/shiny/index.ts 中真实存在的同名类。以下是常用 API 的类型要点成员类型/签名说明versionstringShiny 客户端版本号inputBindingsBindingRegistryInputBinding输入绑定注册表outputBindingsBindingRegistryOutputBinding输出绑定注册表InputBinding/OutputBinding构造器类型自定义绑定时的基类resetBrushtypeof resetBrush重置图像选框notifications.show/remove函数显示/移除通知modal.show/remove函数显示/移除模态框showReconnectDialog/hideReconnectDialog函数重连对话框控制renderContent/renderContentAsync函数渲染 HTML 内容renderDependencies/renderDependenciesAsync函数渲染 HTML 依赖renderHtml/renderHtmlAsync函数渲染 HTMLaddCustomMessageHandlertypeof addCustomMessageHandler注册自定义消息处理器inDevMode()() boolean是否处于开发模式initialize()() Promisevoid异步初始化initializedPromiseInitStatusPromisevoid初始化完成状态4.1 绑定系统Binding输入/输出绑定的类型定义位于 srcts/types/src/bindings/input/inputBinding.d.ts 与 srcts/types/src/bindings/output/outputBinding.d.ts。InputBinding定义了find、getId、getType、getValue、subscribe、unsubscribe、receiveMessage、getState、getRatePolicy、initialize等方法OutputBinding则包含find、renderValue、onValueChange、onValueError、renderError、clearError、showProgress等。如果你要编写自定义的 Shiny 输入/输出控件这些就是需要实现的接口契约。注册表类型 srcts/types/src/bindings/registry.d.ts 中的BindingRegistryBinding提供register、setPriority、getPriority、getBindings方法与源码中 Shiny 绑定注册的优先级机制一一对应。4.2 输入策略Input Policy从类型上看Shiny 的输入传输经过多层装饰器管道。相关类型位于 srcts/types/src/inputPolicies其中 inputPolicy.d.ts 定义了type EventPriority deferred | event | immediate; type InputPolicyOpts { priority: EventPriority; el?: HTMLElement; binding?: InputBinding; };在运行时 srcts/src/shiny/index.ts 中可以看到实际装饰链InputBatchSender → InputNoResendDecorator → InputEventDecorator → InputRateDecorator / InputDeferDecorator → InputValidateDecorator。页面上存在.shiny-submit-button时使用延迟defer策略否则默认使用速率控制rate策略。类型包对这条链上的setInputValue、forgetLastInputValue等入口都给出了对应签名。4.3 输出与渲染输出进度、消息与错误相关类型位于 srcts/types/src/shiny/shinyapp.d.tsShinyApp类负责与 Shiny Server 的 WebSocket 通信connect、isConnected、reconnect、makeRequest、sendInput等。渲染相关的HtmlDep结构则在 srcts/types/src/shiny/render.d.ts 中定义它描述了 R 端htmlDependency()在客户端的对应形态name、version、stylesheet、script、meta、attachment、head等字段用于支持renderContent/renderDependencies系列函数。五、类型定义是如何生成的源码构建视角srcts/types不是手写的而是由 TypeScript 编译器从 srcts/src 自动生成的声明产物。关键证据在 tsconfig.json{ declaration: true, declarationDir: ./srcts/types, emitDeclarationOnly: true, module: ES2020, target: ES2021, moduleResolution: bundler, strict: true }其中emitDeclarationOnly表示只产出.d.tsdeclarationDir指定输出目录。构建入口由 package.json 的脚本组织# 完整构建先做质量检查再打包 shiny.js npm run build # 类型检查与生成 npm run build_types # tsc -p tsconfig.json # 类型覆盖率检查至少 90% npm run coverage # type-coverage -p tsconfig.json --at-least 90build_types即调用tsc -p tsconfig.json生成全部.d.ts到srcts/typescoverage则用type-coverage校验类型覆盖率不低于 90%保证类型声明质量。构建产物如 inst/www/shared/shiny.js由 srcts/build/shiny.ts 通过 esbuild 打包生成入口为 srcts/src/index.ts并将process.env.SHINY_VERSION在构建期替换为当前 Shiny 版本号见 srcts/build/shiny.ts。5.1 参与源码开发时的环境准备如果要在仓库内参与 Shiny 前端开发srcts/README.md 给出了标准流程与本仓库根目录相对安装 Node.js 与 npm 后在仓库根目录执行npm install安装依赖为保证可复现构建团队统一使用npm ci按 package-lock.json 安装锁定版本日常开发可使用npm run watch监听 srcts/src 变化并即时重建shiny.js一键修复代码风格运行npm run lint基于 eslint 与 prettier。由于 package.json 中的prepack脚本会在发布前临时将 README-npm.md 替换为 npm 包主页的 README发布完成后由postpack恢复因此你在 npm 页面上看到的说明正文正是本文所依托的这份文档。六、常见问题与最佳实践小结安装后没有类型提示确认项目tsconfig.json的types配置没有显式排除全局声明或直接在入口文件import posit/shiny;引入一次即可触发全局类型加载。要不要装到--save-dev该包只含类型、不含运行时安装到devDependencies即可。用window.Shiny还是裸Shiny官方推荐window.Shiny若需裸写请补充declare global { const Shiny: ShinyClass; }。与 Shiny 版本的关系类型声明与仓库源码同步生成若你使用的 Shiny 版本较旧或较新建议选择版本号相近的posit/shiny发布版本避免类型与运行时 API 不一致。参考文件官方包说明README-npm.md包元信息与构建脚本package.json类型定义入口srcts/types/extras/globalShiny.d.ts核心类型ShinyClasssrcts/types/src/shiny/index.d.ts、ShinyAppsrcts/types/src/shiny/shinyapp.d.ts、HtmlDepsrcts/types/src/shiny/render.d.ts运行时实现srcts/src/shiny/index.ts、srcts/src/initialize/index.ts开发者构建指南srcts/README.md赞分享后端Web框架前端【免费下载链接】shinyEasy interactive web applications with R项目地址https://gitcode.com/gh_mirrors/sh/shiny点击查看免费下载相关推荐Shiny 前端 TypeScript 类型定义与构建工具完全指南Shiny 前端 TypeScript 类型定义与构建工具完全指南 本篇指南围绕 Shiny 仓库中的 srcts/README.md https://link后端Web框架前端samtools开发者指南深入源码理解htslib集成和C语言实现原理samtools开发者指南深入源码理解htslib集成和C语言实现原理 samtools是一个基于C语言和htslib库开发的下一代测序数据处理工具集广泛应CANN/cannbot-skills Dequant算子开发知识库Dequant 类算子 AscendC 开发知识库 适用范围在 AscendC 上实现 dequant 类 dequant、dequant activaAI 技能人工智能AI 评测CANNAscend上一篇Laya MLX Snake 工作负载优化实战MLX 编译、16-Token 长度桶与有界前缀缓存下一篇OneDrive Client for Linuxonedrive在 Debian / Ubuntu 系列发行版上通过 OpenSuSE Build Service 仓库安装的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

C++ ABI 与跨库兼容:为什么换编译器要重编、符号可见性

C++ ABI 与跨库兼容:为什么换编译器要重编、符号可见性

换了个编译器、或者把 std::string 穿过动态库边界传进传出,程序就可能莫名其妙地崩。根子不在语法,而在 ABI(Application Binary Interface,应用二进制接口):它管的是「编译出来的二进制怎么互相咬合」。这…

2026/10/15 3:48:43 阅读更多 →
tfsec AWS079 规则解析:用 IMDSv2 会话令牌加固 EC2 实例元数据服务

tfsec AWS079 规则解析:用 IMDSv2 会话令牌加固 EC2 实例元数据服务

应用安全SASTIaC 【免费下载链接】tfsec Tfsec is now part of Trivy 项目地址: https://gitcode.com/gh_mirrors/tf/tfsec 点击查看 免费下载 本文以 tfsec 的 aws-ec2-enforce-http-token-imds 规则(内部编号 AWS079)为核心,讲清它检查什么、为什么重要、如何在 …

2026/10/15 3:47:43 阅读更多 →
google-api-nodejs-client firebaserules 模块深度解析:从 v0.1.0 到 v10.0.1 的版本演进与 Firebase Rules API 实战

google-api-nodejs-client firebaserules 模块深度解析:从 v0.1.0 到 v10.0.1 的版本演进与 Firebase Rules API 实战

后端 【免费下载链接】google-api-nodejs-client Googles officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included. 项目地址: h…

2026/10/15 3:47:43 阅读更多 →

最新新闻

延迟优化实战:从毫秒级到微秒级的系统性能提升路径

延迟优化实战:从毫秒级到微秒级的系统性能提升路径

1. 我为什么折腾到微秒级:被延迟拖垮的业务,往往都死得悄无声息很多人做性能优化,跑到“毫秒级”就收工了,觉得接口P99能压到5ms以内已经是了不起的成就。但如果你在真正的高并发业务链路里待过,就会明白:当…

2026/10/15 4:44:53 阅读更多 →
移动端H5浏览器判断:UA解析、特征检测与兼容性实战

移动端H5浏览器判断:UA解析、特征检测与兼容性实战

1. 移动端浏览器判断的底层逻辑与方案选型1.1 为什么H5环境下的浏览器识别如此棘手做过移动端H5的同学大概率都遇到过这样的场景:某个CSS动画在A浏览器上丝滑流畅,到了B浏览器直接卡成幻灯片;某个API在旗舰机上跑得好好的,换到某款…

2026/10/15 4:44:53 阅读更多 →
SIL2认证文档解读:从证书到安全仪表回路落地的关键距离

SIL2认证文档解读:从证书到安全仪表回路落地的关键距离

简介:这份PDF记录了Rockwell Automation ControlLogix PLC在2021年取得的SIL2功能安全认证信息,面向工业自动化安全系统设计、选型与维护人员,主要解决1756系列机架、扩展环境机架及电源在IEC 61508:2010标准下的认证型号与固件版本确认问题。…

2026/10/15 4:44:53 阅读更多 →
ARM基础实验全攻略:从交叉编译到寄存器调试的实战笔记

ARM基础实验全攻略:从交叉编译到寄存器调试的实战笔记

简介:嵌入式入门阶段,ARM体系结构与汇编、C语言混合编程往往是新手面对的第一道坎。一套完整的ARM基础实验合集提取自高校嵌入式实验室常见教学场景,以18个经典实验贯穿底层寄存器操作与汇编程序设计主线,适合刚开始接触嵌入式的初…

2026/10/15 4:44:53 阅读更多 →
基于Django的重庆零售业数据分析可视化系统开发实战

基于Django的重庆零售业数据分析可视化系统开发实战

做这类题目的人我见得挺多,包括不少同学拿着“基于Django的某某数据分析可视化系统”来找我聊思路。说实话,这个题目在毕业设计里算是一个“稳妥但容易翻车”的经典款:稳妥在于技术栈成熟、资料多、工作量清晰,翻车在于很多人做着…

2026/10/15 4:44:53 阅读更多 →
HTML邮件群发实战:从渲染兼容到送达率优化

HTML邮件群发实战:从渲染兼容到送达率优化

1. 邮件群发这件事,远不止“把内容塞进模板”那么简单很多人第一次接到“给客户群发一封HTML邮件”的需求时,脑子里冒出来的画面大概是这样的:写一段漂亮的HTML,把客户邮箱列表往收件人一栏一贴,点发送,完事…

2026/10/15 4:43:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →