TradingView Charting Library 多框架接入实战:十几个可跑通的行情图表示例
【免费下载链接】charting-library-examplesExamples of Charting Library integrations with other libraries, frameworks and data transports项目地址: https://gitcode.com/gh_mirrors/ch/charting-library-examples
本仓库为 TradingView Charting Library 整理了一批可直接运行的框架集成示例,从 React、Vue、Angular、Nuxt 到 Android、iOS、React Native,覆盖了搭建行情图表页面的常见技术栈。文中按"拿文件、Web 端接法、移动端接法、调优、上线"的路径走一遍,所有配置默认值和关键写法都来自仓库内示例代码,照着抄就能出图。
先拿到 Charting Library 文件:每个示例项目的准备方式
这一节解决"代码从哪里来、放到哪里"的问题。
Charting Library 不是 npm 包,需要先向 TradingView 申请授权并下载源码。仓库里每个 Web 示例都留了占位标记文件(public/put-charting-library-here),并配了一个同名脚本copy_charting_library_files.sh,运行后会拉取官方库并把charting_library目录复制到public/,把 UDF 数据源适配层datafeeds也一并放好。库本体建议放在public/charting_library/,library_path指向它时记得以斜杠结尾;而行情数据源地址不能带尾斜杠。这两个路径规范是接入时最容易踩的坑。示例默认数据源是演示接口https://demo_feed.tradingview.com,可以出图,正式上线应换成自己的行情服务。
React TypeScript 里创建 widget 的完整生命周期
这一节解决"组件里怎么建图、怎么销毁"的问题。
以仓库中的react-typescript/src/components/TVChartContainer/index.tsx为例,整个过程发生在一次useEffect里:把symbol、interval、datafeedUrl、libraryPath等配置作为组件 props 传入,组件内部组装widgetOptions,用new widget(widgetOptions)创建图表,useEffect的返回函数里调用tvWidget.remove()完成销毁。销毁这一步不能省:React 严格模式或路由跳转都会触发重复挂载,不销毁就会留下悬空的 canvas 和事件监听。
const widgetOptions: ChartingLibraryWidgetOptions = { symbol: 'AAPL', interval: 'D', // 注意:datafeed 地址不要带尾部斜杠 datafeed: new (window as any).Datafeeds.UDFCompatibleDatafeed(datafeedUrl), container: chartContainerRef.current, library_path: '/charting_library/', disabled_features: ['use_localstorage_for_settings'], enabled_features: ['study_templates'], autosize: true, }; const tvWidget = new widget(widgetOptions); return () => { tvWidget.remove(); };React JavaScript版本的写法一致,只是没有类型注解。
Vue、Angular、Nuxt、SvelteKit 的图表组件怎么封装
这一节回答"换个框架是不是要重新设计一遍"。结论:不用,模式相同——都在挂载钩子里建 widget、在销毁钩子里调remove(),只是钩子名字不同:
| 框架 / 示例项目 | 创建时机 | 销毁时机 |
|---|---|---|
| Vue 2(vuejs) | mounted | destroyed |
| Vue 3(vuejs3) | onMounted | onUnmounted |
| Angular | ngOnInit | ngOnDestroy |
| Nuxt 3 | 页面组件挂载时 | 组件卸载时 |
| SvelteKit / Solid.js | onMount | 对应清理函数 |
两点值得留意。Angular 示例(angular/src/app/tv-chart-container/tv-chart-container.component.ts)把symbol、interval、datafeedUrl等全部声明为@Input,父组件可以直接注入参数,widget 实例存在私有字段并在ngOnDestroy里置空;Nuxt 3 则把widget和datafeeds封装成插件(见nuxtjs3/plugins/TVChart.js)全局 provide,页面里直接取用。所有示例还会解析 URL 里的lang参数来决定界面语言,没带参数就回落英文。
读懂 widgetOptions:数据源、特征开关与语言
这一节解决"一份配置里每个字段管什么"。
symbol与interval:决定打开页面时画哪只标的、哪个周期,示例默认AAPL日线;datafeed:接上 UDF 协议的行情适配层,历史 K 线和实时增量都由它拉取;charts_storage_url、charts_storage_api_version加client_id、user_id:四件套配齐后,图表布局可以存到服务端,换设备登录还能找回;disabled_features:关掉不想开放的能力,示例禁用了use_localstorage_for_settings,防止设置写进浏览器本地存储;enabled_features:打开指标模板库study_templates;locale:多语言用户的图表界面语言;studies_overrides:对默认指标参数做覆盖;fullscreen/autosize:全屏模式与尺寸自适应。
Android、iOS、React Native 的 WebView 移动端接法
这一节回答"手机上图表跑在哪里"。三端都不做原生渲染,而是把整套 Web 应用塞进 WebView 里,好处是行为和桌面端完全一致。
Android 示例(android/app/src/main/java/com/tradingview/android/MainActivity.kt)用系统 WebView 加载应用包内文件:
webView.settings.javaScriptEnabled = true webView.settings.allowFileAccessFromFileURLs = true webView.settings.textZoom = 100 val chartingLibraryUrl = "file:///android_asset/charting_library/index.html"textZoom = 100是为了防止跟随系统字号缩放破坏图表排版;页面加载完成后通过evaluateJavascript注入一段脚本,订阅周期切换事件并经由JSApplicationBridge转发到 Kotlin 侧,原生界面才能跟随图表联动。
iOS 示例(ios-swift/App/ViewController.swift)用 WKWebView,要点是打开文件访问与全屏能力,布局回调里按安全区域计算 webview 尺寸,外链交给系统浏览器处理并取消页面内跳转。React Native 则用一个 WebView 组件通吃两端,差别只在资源路径:Android 读file:///android_asset/index.html,iOS 从 Bundle 里读同名文件,widget 配置代码两端通用。
性能与内存:remove、autosize 与数据更新策略
这一节聚焦上线前该盯的几个点。
- 销毁必须显式做。所有示例无一例外在卸载钩子里调
remove(),这是防内存泄漏的关键:页面反复进出时,未销毁的图表实例会持续占用内存并残留 canvas 节点; - 尺寸交给 autosize。示例默认
autosize: true,容器变化时图表自动跟手;容器高度用calc(100vh - 80px)这类相对值,窄屏再叠加媒体查询即可; - API 就绪回调。
onChartReady与headerReady里再挂按钮和交互,示例里用它放了一个"Check API"按钮弹出自检提示,适合做集成验证; - 高频数据更新。UDF 适配层内部已带批量拉取与缓存逻辑,业务侧再做增量更新加约 100ms 的防抖,可以避免刷满接口。
上线前检查清单:路径、存储与容器
这一节给一份可直接对照的清单。
- 图表容器必须有实际高度,高度为 0 时 widget 无法初始化;
datafeed地址不能以斜杠结尾,library_path必须以斜杠结尾,两条规则方向相反,写反就白屏;- 需要保存图表布局时,补齐存储地址与
client_id、user_id; - Android 确认已开文件访问权限;iOS 外链走系统浏览器、内部跳转取消;
- 演示数据源只适合联调,生产环境接入自己的 UDF 行情接口。
示例仓库可通过git clone https://gitcode.com/gh_mirrors/ch/charting-library-examples获取。对照自己的技术栈挑一个最接近的项目改造,从拿到库文件到页面出图,通常半天可以跑通。
【免费下载链接】charting-library-examplesExamples of Charting Library integrations with other libraries, frameworks and data transports项目地址: https://gitcode.com/gh_mirrors/ch/charting-library-examples
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考