gentelellaShiny与formattable、highcharter包jQuery冲突咨询
gentelellaShiny 与 highcharter/formattable jQuery冲突解决方案
- 首先明确:直接替换
C:\Users\Users\AppData\Local\R\win-library\4.2\gentelellaShiny路径下的内置jQuery文件不属于简便方案,且大概率破坏包的原有功能——不会导致所有功能完全失效,但模板依赖旧版jQuery写法的交互组件(侧边栏折叠、下拉菜单、模态框、表单控件、进度条动画等)会大面积报错,修复成本很高,不推荐直接修改包安装目录的源文件。
推荐方案:无侵入式解决版本冲突(不修改包源码,无功能损坏风险)
不需要改动包本身的文件,在应用层面做jQuery版本隔离即可,核心逻辑是用noConflict给不同依赖分配对应版本的jQuery实例:
- 提前下载3.6.x版本的jQuery文件存到你应用的本地www目录(3.x系列对新旧代码兼容性最好,不要选4.x版本)
- 在Shiny应用的UI部分最顶部(所有其他组件加载之前)加入以下代码:
tags$head( # 加载本地存放的3.6.x版本jQuery tags$script(src = "www/jquery-3.6.0.min.js"), tags$script(HTML(" var $newJq = jQuery.noConflict(true); // 把高版本jQuery绑定给highcharter、formattable使用 window.$ = $newJq; window.jQuery = $newJq; ")), # 重新加载gentelellaShiny自带的jQuery,交还给模板自身的交互逻辑使用 htmltools::htmlDependency( name = "gentelella-jquery", version = "1.0", src = list(file = "www"), script = "js/jquery.min.js", package = "gentelellaShiny" ) )
该方案不会影响gentelella模板原有任何功能,同时能满足highcharter、formattable的高版本jQuery依赖,是生产环境优先选择的方案。
可选方案:直接替换包目录下的jQuery文件(高风险)
如果你一定要修改包安装目录的文件,操作步骤如下:
- 进入路径
C:\Users\Users\AppData\Local\R\win-library\4.2\gentelellaShiny\www\js - 找到原有
jquery.min.js文件,重命名为jquery.min.js.bak做备份,方便出问题时回滚 - 把提前下载的3.6.x版本jQuery重命名为
jquery.min.js,放到上述目录 - 重启R会话,重新加载
gentelellaShiny包测试
风险提示:该操作后你需要逐个修复模板内其他js文件的API兼容问题,所有用到旧版jQuery废弃方法的交互都需要手动改代码,维护成本极高,仅适合有前端js调试能力的场景使用。
临时调试快速方案
如果只是做静态展示类应用,不需要gentelella的复杂交互,可以在启动App前运行以下代码,直接屏蔽gentelella自带的旧版jQuery,复用Shiny默认加载的高版本jQuery:
library(htmltools) library(gentelellaShiny) # 移除gentelella自带的jQuery依赖 original_deps <- getFromNamespace("gentelella_deps", "gentelellaShiny") assignInNamespace( "gentelella_deps", function() { deps <- original_deps() deps[!grepl("jquery", deps$script, ignore.case = TRUE), ] }, ns = "gentelellaShiny" )
该方案会导致gentelella部分交互功能失效,但可以1分钟解决空白页问题,适合快速出静态报告的临时场景。
内容的提问来源于stack exchange,提问作者Linda
相关产品推荐
相关产品推荐

