nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞大家好我是你们的技术博主小明。今天我们要聊一个有趣的话题——HTML5和桌面软件开发这两者看似风马牛不相及但在nw.js的撮合下它们竟然碰撞出了耀眼的火花。## 从浏览器到桌面一场技术革命还记得那个年代吗我们开发桌面软件要用C、C#或者Java写一个简单的记事本程序都要面对复杂的窗口句柄和消息循环。而Web开发者呢他们只需要写HTML、CSS和JavaScript就能在浏览器里做出炫酷的交互效果。但是浏览器有它的局限性无法访问文件系统、不能调用系统API、不能在任务栏里独立运行。直到nw.js的出现这一切都变了。nw.js原名node-webkit是一个基于Chromium和Node.js的桌面应用开发框架。它让Web开发者可以用熟悉的HTML5技术来开发桌面软件同时还能调用Node.js的底层能力。## HTML5的桌面潜力你以为它只是网页很多人对HTML5的认识还停留在“网页技术”的层面。但你知道吗HTML5已经具备了桌面软件开发的很多基础能力-离线存储localStorage和IndexedDB可以让应用在离线状态下工作-Canvas和WebGL可以绘制复杂的图形和3D场景-Web Workers实现多线程处理-拖放API支持文件拖入操作-音频/视频处理多媒体能力但这些还远远不够我们需要一个“桥梁”来连接Web世界和桌面世界。nw.js就是这座桥梁。## 第一个nw.js应用Hello World让我们从最基础的开始创建一个简单的nw.js应用。首先你需要安装nw.js可以从官网下载SDK版本。创建一个项目文件夹里面包含以下两个文件### package.json - 应用配置文件json{ name: hello-nwjs, main: index.html, window: { title: 我的第一个nw.js应用, width: 800, height: 600, resizable: true, icon: icon.png }, node-remote: *, webkit: { plugin: true }}### index.html - 主页面文件html!DOCTYPE htmlhtmlhead meta charsetUTF-8 titleHello nw.js/title style body { font-family: Microsoft YaHei, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-align: center; padding: 50px; } h1 { font-size: 3em; text-shadow: 2px 2px 4px rgba(0,0,0,0.5); } button { padding: 15px 30px; font-size: 1.2em; border: none; border-radius: 25px; background: white; color: #667eea; cursor: pointer; margin: 20px; transition: transform 0.3s; } button:hover { transform: scale(1.1); } #info { margin-top: 30px; padding: 20px; background: rgba(255,255,255,0.1); border-radius: 10px; } /style/headbody h1 Hello nw.js!/h1 p这是用HTML5技术开发的桌面应用/p !-- 演示Node.js能力 -- button onclickcheckSystem()检测系统信息/button button onclickreadFile()读取文件/button div idinfo p点击按钮查看效果/p /div script // 使用Node.js的API const os require(os); // 引入Node.js的os模块 const fs require(fs); // 引入Node.js的fs模块 function checkSystem() { // 获取系统信息 const info document.getElementById(info); const systemInfo strong系统信息/strongbr 操作系统${os.type()} ${os.release()}br 主机名${os.hostname()}br 总内存${(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)} GBbr 空闲内存${(os.freemem() / 1024 / 1024 / 1024).toFixed(2)} GBbr CPU架构${os.arch()}br 运行时间${os.uptime()} 秒 ; info.innerHTML systemInfo; } function readFile() { // 读取当前目录下的一个文件 const info document.getElementById(info); try { const content fs.readFileSync(package.json, utf-8); info.innerHTML strongpackage.json内容/strongbrpre${content}/pre; } catch (error) { info.innerHTML 读取文件失败${error.message}; } } /script/body/html运行方法将nw.js的可执行文件与项目文件夹放在同一目录然后执行nw .命令。你会看到一个漂亮的窗口点击按钮可以读取系统信息和文件内容。## 碰撞的火花Web技术 系统能力上面的例子展示了nw.js最核心的能力在HTML页面中直接调用Node.js的API。这意味着我们可以1.访问文件系统读写文件、创建目录、删除文件2.使用操作系统功能获取系统信息、执行命令、操作进程3.网络通信创建HTTP服务器、WebSocket连接4.调用系统对话框文件选择器、通知提示5.使用原生模块通过npm安装各种Node.js模块## 更复杂的例子一个简单的文件管理器让我们用nw.js做一个更实用的应用——一个简单的文件管理器### file-manager.htmlhtml!DOCTYPE htmlhtmlhead meta charsetUTF-8 title简单文件管理器/title style * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Microsoft YaHei, sans-serif; background: #f5f5f5; padding: 20px; } .container { max-width: 800px; margin: 0 auto; background: white; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 20px; } .toolbar { display: flex; gap: 10px; margin-bottom: 20px; padding-bottom: 20px; border-bottom: 1px solid #eee; } .toolbar input { flex: 1; padding: 10px; border: 1px solid #ddd; border-radius: 5px; font-size: 14px; } .toolbar button { padding: 10px 20px; background: #667eea; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 14px; } .toolbar button:hover { background: #5a6fd6; } .file-list { list-style: none; } .file-item { display: flex; align-items: center; padding: 12px 15px; border-bottom: 1px solid #f0f0f0; cursor: pointer; transition: background 0.2s; } .file-item:hover { background: #f8f9ff; } .file-icon { margin-right: 15px; font-size: 20px; } .file-name { flex: 1; } .file-size { color: #999; font-size: 12px; } .back-btn { padding: 10px 20px; background: #ff6b6b; color: white; border: none; border-radius: 5px; cursor: pointer; margin-bottom: 10px; } .back-btn:hover { background: #ee5a5a; } /style/headbody div classcontainer h2 stylemargin-bottom: 20px; 简单文件管理器/h2 div classtoolbar input typetext idpathInput placeholder输入路径例如 C:\\Users value. button onclicknavigate()导航/button button onclickcreateFile()创建文件/button /div button classback-btn onclickgoBack()← 上一级/button ul classfile-list idfileList li classfile-item点击导航按钮查看文件/li /ul /div script const fs require(fs); const path require(path); // 当前路径 let currentPath process.cwd(); function navigate() { const input document.getElementById(pathInput); const targetPath input.value.trim(); // 如果输入的是相对路径转换为绝对路径 if (!path.isAbsolute(targetPath)) { currentPath path.resolve(currentPath, targetPath); } else { currentPath targetPath; } // 更新输入框显示当前路径 input.value currentPath; // 读取目录内容 loadDirectory(currentPath); } function loadDirectory(dirPath) { const fileList document.getElementById(fileList); fileList.innerHTML ; // 清空列表 try { // 读取目录内容 const files fs.readdirSync(dirPath); // 对文件和目录进行排序目录在前 const sortedFiles files.sort((a, b) { const statA fs.statSync(path.join(dirPath, a)); const statB fs.statSync(path.join(dirPath, b)); if (statA.isDirectory() !statB.isDirectory()) return -1; if (!statA.isDirectory() statB.isDirectory()) return 1; return a.localeCompare(b); }); sortedFiles.forEach(file { const fullPath path.join(dirPath, file); const stat fs.statSync(fullPath); const li document.createElement(li); li.className file-item; // 根据类型显示不同的图标 const icon stat.isDirectory() ? : ; // 格式化文件大小 let size ; if (!stat.isDirectory()) { const bytes stat.size; if (bytes 1024) { size bytes B; } else if (bytes 1024 * 1024) { size (bytes / 1024).toFixed(1) KB; } else { size (bytes / 1024 / 1024).toFixed(1) MB; } } li.innerHTML span classfile-icon${icon}/span span classfile-name${file}/span span classfile-size${size}/span ; // 点击目录时进入 if (stat.isDirectory()) { li.addEventListener(click, () { currentPath fullPath; document.getElementById(pathInput).value currentPath; loadDirectory(currentPath); }); } fileList.appendChild(li); }); } catch (error) { fileList.innerHTML li classfile-item❌ 读取目录失败${error.message}/li; } } function goBack() { const parentPath path.dirname(currentPath); if (parentPath ! currentPath) { currentPath parentPath; document.getElementById(pathInput).value currentPath; loadDirectory(currentPath); } } function createFile() { const fileName prompt(请输入文件名); if (fileName) { try { const filePath path.join(currentPath, fileName); fs.writeFileSync(filePath, , utf-8); loadDirectory(currentPath); // 刷新文件列表 } catch (error) { alert(创建文件失败 error.message); } } } // 初始化加载当前目录 loadDirectory(currentPath); /script/body/html这个文件管理器虽然简单但已经展现了nw.js的强大能力完整的文件系统操作、路径处理、文件读写而且所有界面都是用HTML5技术构建的。## 为什么选择nw.js在桌面软件开发领域nw.js不是唯一的选项。还有Electron、Tauri等框架。但nw.js有它独特的优势1.简单直接不需要复杂的构建工具一个HTML文件就能开始2.Node.js深度集成可以直接在页面中调用Node.js API3.原生窗口控制可以设置窗口大小、菜单、托盘等4.跨平台Windows、macOS、Linux都能运行5.社区活跃有很多插件和扩展## 总结HTML5和桌面软件开发的碰撞就像是两个技术世界的联姻。nw.js作为这场联姻的牵线者让Web开发者能够用自己熟悉的技能开发出功能强大的桌面应用。从简单的Hello World到文件管理器我们看到了这种技术融合的魔力。虽然nw.js在性能上可能不如原生应用但对于大部分桌面应用来说它的表现已经足够出色。而且随着硬件性能的提升和Web技术的进步这种差距正在不断缩小。如果你是一个Web开发者想尝试桌面软件开发nw.js绝对是一个值得投入的方向。它不仅能让你快速上手还能让你的应用拥有Web应用的所有优点跨平台、易于部署、更新方便。下一节我们将深入探讨nw.js的窗口管理和原生API调用敬请期待

相关新闻

DellFanManagement深度解析:戴尔笔记本风扇控制的终极实战手册

DellFanManagement深度解析:戴尔笔记本风扇控制的终极实战手册

DellFanManagement深度解析:戴尔笔记本风扇控制的终极实战手册 【免费下载链接】DellFanManagement A suite of tools for managing the fans in many Dell laptops. 项目地址: https://gitcode.com/gh_mirrors/de/DellFanManagement 如果你曾经在深夜加班时…

2026/7/26 19:23:18 阅读更多 →
3分钟搞定无损歌词下载:音乐爱好者必备的网易云QQ音乐歌词提取神器

3分钟搞定无损歌词下载:音乐爱好者必备的网易云QQ音乐歌词提取神器

3分钟搞定无损歌词下载:音乐爱好者必备的网易云QQ音乐歌词提取神器 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为音乐播放器缺少歌词而烦恼&#xff…

2026/7/26 19:23:18 阅读更多 →
3分钟免费解锁Mac读写Windows硬盘:Nigate跨平台文件同步终极指南

3分钟免费解锁Mac读写Windows硬盘:Nigate跨平台文件同步终极指南

3分钟免费解锁Mac读写Windows硬盘:Nigate跨平台文件同步终极指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and man…

2026/7/26 19:23:18 阅读更多 →

最新新闻

大模型应用开发实战:从环境搭建到生产部署全流程指南

大模型应用开发实战:从环境搭建到生产部署全流程指南

最近在技术社区看到不少关于AI大模型应用落地的讨论,很多开发者对如何在实际项目中有效集成和使用这些模型还存在困惑。本文基于近期项目经验,完整梳理从环境搭建到生产部署的全流程,包含详细的代码示例和常见问题解决方案,适合有…

2026/7/26 19:46:26 阅读更多 →
Bielik.ai开源大语言模型:波兰语NLP实战部署与优化指南

Bielik.ai开源大语言模型:波兰语NLP实战部署与优化指南

1. 先搞清楚 Bielik.ai 到底解决什么实际问题如果你正在找一款能稳定处理波兰语或其他欧洲小语种任务的开源大语言模型,Bielik.ai 这个社区项目值得先放进你的测试列表。它不是又一个“全能型”模型,而是专门针对波兰语、捷克语、斯洛伐克语等欧洲语言优…

2026/7/26 19:46:26 阅读更多 →
链上 AI 项目的场景选型决策树:什么时候该上链、什么时候该走链下的完整判断框架

链上 AI 项目的场景选型决策树:什么时候该上链、什么时候该走链下的完整判断框架

链上 AI 项目的场景选型决策树:什么时候该上链、什么时候该走链下的完整判断框架 一、引言 "要不要把 AI 放到链上"是 2026 年 Web3 开发者面临的最具现实意义的架构决策之一。这个问题的难点不在于技术可行性——链上推理(通过 zkML、opML、T…

2026/7/26 19:46:26 阅读更多 →
AI + Web3 行业落地全景:DeFi、NFT、DAO、RWA 四大场景的 AI 应用成熟度评估

AI + Web3 行业落地全景:DeFi、NFT、DAO、RWA 四大场景的 AI 应用成熟度评估

AI Web3 行业落地全景:DeFi、NFT、DAO、RWA 四大场景的 AI 应用成熟度评估 一、引言 2026年的 Web3 行业,AI 的渗透已不再停留在概念验证阶段。从链上交易策略到去中心化治理辅助,从数字艺术生成到实物资产代币化风控,AI 与区块链…

2026/7/26 19:46:26 阅读更多 →
Cursor Free VIP终极指南:智能破解工具解锁AI编程助手完整功能

Cursor Free VIP终极指南:智能破解工具解锁AI编程助手完整功能

Cursor Free VIP终极指南:智能破解工具解锁AI编程助手完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …

2026/7/26 19:46:26 阅读更多 →
终极星露谷物语零代码MOD制作指南:5分钟解锁你的创意世界

终极星露谷物语零代码MOD制作指南:5分钟解锁你的创意世界

终极星露谷物语零代码MOD制作指南:5分钟解锁你的创意世界 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 你是否曾经梦想过为星露谷物语添加全新的角色服装、改变季节景观&am…

2026/7/26 19:45:26 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻