Skia demos.skia.org 本地运行指南:用本地 CanvasKit 构建调试 Web 2D 演示
图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载导读本文围绕 Skia 仓库中demos.skia.org目录的 README.md完整讲解如何在本机编译 CanvasKitSkia 的 WebAssembly 版本并通过本地 Web 服务器运行仓库自带的各类 Web 2D 演示页面。读完本文你将掌握从构建 CanvasKit到将 demo 从 CDN 切换为本地构建再到浏览器验证的完整调试链路适合希望深入 CanvasKit 源码、修改 API 行为或开发新 demo 的开发者。一、demos.skia.orgSkia 的 Web 演示集demos.skia.org是 Skia 仓库中专门存放 Web 演示页面demo的目录其配套文档只有一份精炼的 README.md核心思路非常清晰先用本地源码构建一份 CanvasKitWASM 产物在该目录启动一个本地静态 Web 服务器修改 demo 页面让它们从本地服务器加载构建产物而不是默认的公共 CDN。从目录结构看demos.skia.org/demos/下共包含 13 个演示子目录hello_world、canvas_edit、image_decode_web_worker、image_sampling、mesh2d、path_performance、sampling_types、spreadsheet、textedit、textures、up_scaling、web_worker、webgpu。从目录名可以推断这些 demo 覆盖了 CanvasKit 的典型能力基础绘制、图像采样与解码、Web Worker 并行处理、文本编辑、网格mesh、纹理、路径性能以及 WebGPU 渲染等可以作为本地调试和 API 学习的第一手素材。二、前置条件编译本地 CanvasKitREADME 的第一步要求进入 CanvasKit 源码目录并完成一次构建cd modules/canvaskit make debug # 或 make release 等其它目标modules/canvaskit目录下的 Makefile 提供了丰富的构建目标几个常用目标如下目标对应编译参数适用场景make debug./compile.sh debug_build日常调试编译更快、错误信息更友好make release./compile.sh release发布级构建体积更小、性能更好make release_cpu./compile.sh cpu_only关闭 GPU 后端仅保留 CPU 渲染make debug_webgpu./compile.sh debug_build use_webgpu使用 WebGPU 后端的调试构建make profile./compile.sh profiling性能剖析专用构建make with_debugger./compile.sh debug_build enable_debugger为 Skia Debugger 集成调试版以debug目标为例它内部依次执行调用 compile.sh 以debug_build参数生成 GN 构建配置并编译创建build/目录把产物canvaskit.js和canvaskit.wasm复制到build/下。从 compile.sh 源码可以看到构建本质上是./bin/gn genninja的流程脚本会根据传入的参数开关决定大量 GN 参数例如is_debug、skia_enable_ganesh、skia_enable_graphite、skia_use_webgl、skia_use_webgpu、skia_enable_skottie、skia_canvaskit_enable_font等。这也是为什么make debug比make release更快——debug 构建关闭了优化、保留更友好的报错信息参见 modules/canvaskit/README.md 中 make debug is much faster and has better error messages 的说明。需要说明的适用前提按 modules/canvaskit/README.md 的要求编译 CanvasKit 需要先下载并激活 Emscripten 工具链仓库通过bin/activate-emsdk完成并已按 Skia 官方方式同步好依赖测试相关命令还要求 Node.js v14 及以上。三、启动本地 Web 服务器make localCanvasKit 构建完成后回到demos.skia.org目录运行cd demos.skia.org make localdemos.skia.org/Makefile 中local目标完整做了三件事local: echo Go check out http://localhost:8123/demos/hello_world/index.html rm -f build ln -s ../modules/canvaskit/build build python3 -m http.server 8123在demos.skia.org下创建一个名为build的符号链接指向../modules/canvaskit/build从而让 web 服务器可以直接以/build/...路径访问到刚刚编译好的 CanvasKit 产物canvaskit.js与canvaskit.wasm用 Python 自带的http.server在8123端口启动静态文件服务终端会提示访问入口http://localhost:8123/demos/hello_world/index.html。因此运行成功后在浏览器打开上述地址即可看到 CanvasKit 的 Hello World 演示。该目录下所有 demo 均可通过http://localhost:8123/demos/demo名/index.html访问例如webgpudemo 对应http://localhost:8123/demos/webgpu/index.html。四、让 demo 从本地加载而非 CDNREADME 特别强调你需要修改 demo让它从本地 Web 服务器加载构建产物而不是公共 CDN。这一步是整个调试流程的关键因为 demo 默认会通过unpkg.com/canvaskit-wasm加载发布到 npm 上的稳定版 CanvasKit而非你本地刚刚编译的版本。以 demos.skia.org/demos/hello_world/index.html 为范本可以看到两种加载方式的切换写法!-- 默认方式从 CDN 加载本地调试时注释掉 -- !-- script typetext/javascript srchttps://unpkg.com/canvaskit-wasm0.25.0/bin/full/canvaskit.js/script -- !-- 本地方式从本地服务器加载 -- script typetext/javascript src/build/canvaskit.js/script对应的 JS 初始化部分同样有两套 base 路径// 从 CDN 加载时 // const base https://unpkg.com/canvaskit-wasm0.25.0/bin/full/; // 本地调试时 const base /build/; const ckLoaded CanvasKitInit({ locateFile: (file) base file });CanvasKitInit的locateFile回调用于告诉 WASM 运行时到哪里寻找.wasm文件当页面脚本来自/build/canvaskit.js时locateFile把请求的文件如canvaskit.wasm拼成/build/canvaskit.wasm正好命中make local创建的符号链接。这个模式是demos.skia.org下所有 demo 切换本地构建的通用套路把script src与base变量都改为指向/build/即可。加载成功后ckLoaded.then((CanvasKit) ...)回调里即可使用 CanvasKit API 创建画布表面const surface CanvasKit.MakeCanvasSurface(draw); const paint new CanvasKit.Paint(); paint.setColor(CanvasKit.RED); const textFont new CanvasKit.Font(CanvasKit.Typeface.GetDefault(), 20); function drawFrame(canvas) { canvas.drawRect(CanvasKit.LTRBRect(10, 10, 50, 50), paint); canvas.drawText(If you see this, CanvasKit loaded!!, 5, 100, textPaint, textFont); } surface.requestAnimationFrame(drawFrame);页面中那行 If you see this, CanvasKit loaded!! 文本本身就是对本地构建是否成功加载的最直观验证看到它说明本地 CanvasKit 已在浏览器中正常运行。五、验证与常见问题1. 如何确认加载的是本地构建而不是 CDN 版本修改modules/canvaskit下的源码后重新执行make debug再刷新 demo 页面若行为随之变化即可确认链路已切换到本地构建也可以借助浏览器开发者工具的 Network 面板查看canvaskit.js的请求来源是否为localhost:8123。2. 为什么需要先构建 CanvasKit 再启动make local因为make local只是创建指向modules/canvaskit/build/的符号链接并启动服务器它本身不触发编译。若尚未构建/build/canvaskit.js将 404页面会因无法执行CanvasKitInit而报错。顺序必须是先make debug产出 build 目录再make local启动服务。3. 构建版本选 debug 还是 release日常修改与调试建议make debug编译快、错误信息完整验证体积、性能或发布行为时再切换到make release等目标两者的产物都会输出到modules/canvaskit/build/无需改动 demo 页面的加载方式。4. 端口与访问入口服务器固定监听8123端口见 demos.skia.org/Makefile 中的python3 -m http.server 8123默认演示入口为http://localhost:8123/demos/hello_world/index.html。总结demos.skia.org为 Skia 的 Web 端能力提供了一个开箱即用的本地调试环境通过 modules/canvaskit/Makefile 的make debug编译出本地 CanvasKit再经 demos.skia.org/Makefile 的make local在 8123 端口拉起静态服务最后按 demos.skia.org/demos/hello_world/index.html 的模式把 demo 的脚本与base路径切换到/build/即可在浏览器中直接体验和调试基于本地源码的 CanvasKit 行为——这也是深入阅读 Skia 源码、二次开发 CanvasKit 功能时最实用的起步流程。赞分享图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载相关推荐在 Fleet 中运行本地构建的 fleetd基于本地 TUF 仓库的 macOS 开发调试完整指南在 Fleet 中运行本地构建的 fleetd基于本地 TUF 仓库的 macOS 开发调试完整指南 本文面向 Fleet 开源项目的 macOS 贡献者完后端前端企业应用运维网络安全使用 ADK A2UI v0.9 构建 Gemini Enterprise 演示 Agent从本地运行到 Cloud Run 部署全指南使用 ADK A2UI v0.9 构建 Gemini Enterprise 演示 Agent从本地运行到 Cloud Run 部署全指南 本指南基于仓库中人工智能AI AgentAI 应用前端UI组件使用本地构建的 apphost 与 .NET 根目录进行运行时开发调试使用本地构建的 apphost 与 .NET 根目录进行运行时开发调试 导读 在 .NET 运行时仓库dotnet/runtime中开发、调试宿主host语言运行时标准库JIT编译编译器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Play Framework(Scala)Body Parsers 完全指南:从内置解析器到自定义流式解析

Play Framework(Scala)Body Parsers 完全指南:从内置解析器到自定义流式解析

后端Web框架 【免费下载链接】playframework The Community Maintained High Velocity Web Framework For Java and Scala. 项目地址: https://gitcode.com/gh_mirrors/pl/playframework 点击查看 免费下载 HTTP 请求由头部(Header)与请求体…

2026/9/24 15:03:20 阅读更多 →
RK3588适配IMX586实战:MIPI CSI硬件链路与V4L2驱动深度调试

RK3588适配IMX586实战:MIPI CSI硬件链路与V4L2驱动深度调试

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

2026/9/24 15:03:20 阅读更多 →
lego 配置文件(.lego.yml)完全指南:多证书批量签发、智能默认值与生命周期管理

lego 配置文件(.lego.yml)完全指南:多证书批量签发、智能默认值与生命周期管理

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 lego 是使用 Go 语言编写的 Lets Encrypt / ACME 客户端和库。本文围绕其配置文件机制展开&#…

2026/9/24 15:02:19 阅读更多 →

最新新闻

深度学习新闻分类推荐系统:从TextCNN到个性化推荐

深度学习新闻分类推荐系统:从TextCNN到个性化推荐

简介:这份基于深度学习的新闻分类推荐系统Python实现源码,是专为课程设计与期末大作业准备的高分项目,下载后无需修改即可运行,适用于需要快速交付完整课题的高校学生。系统涵盖新闻数据预处理、文本分类模型训练、推荐逻辑展示等…

2026/9/25 0:00:41 阅读更多 →
汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

1. 这门“汽车电子底层软件开发就业课”到底在教什么?——不是写个LED闪烁就能上岗的很多人看到“汽车电子底层软件开发就业课”这个标题,第一反应是:不就是嵌入式C语言单片机CAN通信?刷几道LeetCode、调通一个STM32 CAN收发例程&…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
CVE-2025-27591深度解析:日志组件本地权限提升漏洞与防御

CVE-2025-27591深度解析:日志组件本地权限提升漏洞与防御

CVE-2025-27591 最近在安全圈里讨论度不低,核心是 Below 这个日志处理组件在权限控制上出了问题,低权限用户有机会利用日志文件、临时目录的处理流程,把自身权限抬升到管理员甚至系统级别。很多人一听到“利用脚本”就先想到怎么打&#xff0…

2026/9/24 23:59:40 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →