ESP8266 AP模式下SPIFFS存储Chart.js图表不显示问题求助
排查ESP8266 AP模式下Chart.js图表不显示的问题
我来帮你一步步梳理排查方向,结合你提供的代码,重点关注以下几个关键点:
1. 修复HTML中脚本的引用错误
你的HTML里犯了一个常见的语法错误:带有src属性的<script>标签不能同时包含内联代码,浏览器会忽略标签内部的JavaScript代码,导致图表初始化逻辑根本没执行。另外你同时引用了Chart.js和Chart.min.js,但你说只上传了Chart.js到SPIFFS,这会导致Chart.min.js请求返回404。
修改后的HTML脚本部分应该是这样:
<script src="/Chart.js" type="text/javascript"></script> <script type="text/javascript"> var pieData = { datasets: [{ data: [20, 40, 10, 30], backgroundColor: ["#878BB6", "#4ACAB4", "#FF8153", "#FFEA88"] }] }; // Get the context of the canvas element we want to select var countries = document.getElementById("countries").getContext("2d"); new Chart(countries, { type: 'pie', data: pieData }); </script>
2. 验证SPIFFS中的文件是否正确上传
查看你串口监视器输出的文件列表,确认以下两点:
/Chart.js和/index.html都存在,且文件大小不为0(如果文件大小是0,说明上传失败)- 文件名完全匹配(ESP8266的SPIFFS是区分大小写的,比如
chart.js和Chart.js是两个不同的文件)
如果文件缺失或大小异常,重新使用Arduino IDE的「ESP8266 Sketch Data Upload」工具上传data文件夹,确保上传过程没有报错。
3. 用浏览器开发者工具排查请求问题
在浏览器中打开网页后按F12打开开发者工具,切换到「Network」标签页:
- 刷新页面,查看
Chart.js的请求状态:如果是404,说明服务器找不到这个文件,回到第2步确认文件上传情况;如果是200,查看响应内容是否是完整的Chart.js代码 - 切换到「Console」标签页,查看是否有JavaScript报错(比如
Chart is not defined,说明Chart.js没加载成功;或者Cannot read properties of null,说明找不到canvas元素)
4. 检查WebServer的文件处理逻辑
你的handleNotFound函数中,.js文件的Content-Type设置为application/javascript是正确的,但可以优化一下SPIFFS的挂载逻辑——你在setup里调用了两次SPIFFS.begin(),可以改成:
if (!SPIFFS.begin()) { Serial.println("Failed to mount filesystem!\n"); return; } else { Dir dir = SPIFFS.openDir("/"); while (dir.next()) { String fileName = dir.fileName(); size_t fileSize = dir.fileSize(); Serial.printf("FS File: %s, size: %u\n", fileName.c_str(), fileSize); } Serial.printf("\n"); }
避免重复挂载的冗余操作。
5. 确认Canvas元素的可访问性
在初始化Chart的代码前加几行调试代码,确认能正确获取到canvas元素和上下文:
var canvas = document.getElementById("countries"); console.log("Canvas element:", canvas); // 查看是否为null var countries = canvas.getContext("2d"); console.log("Canvas context:", countries); // 查看是否为null new Chart(countries, { type: 'pie', data: pieData });
然后在浏览器控制台查看输出,如果canvas是null,说明id拼写错误或者脚本执行时DOM还没加载完成(可以把脚本放到</body>标签前,确保DOM加载完毕)。
内容的提问来源于stack exchange,提问作者Marion Boynton




