nw.js:使用 HTML 和 JavaScript 来制作桌面应用

NW.js:用Web技术构建桌面应用的新方式
你是不是有时候也在想:为什么写前端就只能做网页?为啥不能直接用HTML、CSS和JavaScript写出一个能装在桌面上、还能访问本地文件的应用程序?我当时也有过这个想法,然后就发现了——NW.js,它直接把这个梦想实现了。
NW.js原名叫node-webkit,它的最大特点就是能把Node.js和浏览器DOM环境融合在一起。也就是说,在一个桌面窗口里,你既能写前端页面(像普通网页那样),又能像Node.js一样去读写文件、调用系统API,甚至还能运行shell命令。是不是听起来就很爽?
用Web技术写桌面应用,真就这么简单?
是的,真的这么简单。NW.js 本质上就是把Chromium和Node.js打包到一起,让它们在同一个上下文中运行。所以你可以在HTML里写 <script>
,然后直接调用 fs.readFileSync()
这样的Node模块来读文件,完全不需要像以前那样去调各种插件或API桥接。
举个例子,你可以像写一个普通网站那样写个HTML页面:
html
<!DOCTYPE html>
<html>
<body>
<h1>Hello NW.js</h1>
<script>
const fs = require('fs');
const content = fs.readFileSync('example.txt', 'utf-8');
document.body.innerHTML += '<pre>' + content + '</pre>';
</script>
</body>
</html>
上面这段代码会在一个窗口里显示example.txt的内容,完全就是网页+Node.js融合的效果,第一次跑起来我直接惊呆了。
跨平台打包,开发一个项目,Windows/Linux/macOS全都能跑
NW.js最大的好处之一,就是它完全跨平台。你开发一个项目,只要打包成对应平台的可执行文件(比如 .exe
或 .app
),就能在Windows、macOS、Linux上运行,界面和功能保持一致。
更好的是,它的打包方式也很简单,你只需要写一个 package.json
配置文件,把你的前端页面和脚本文件一起打包到一个压缩包里,加上NW.js的运行时,就能直接生成桌面应用。
我之前做了一个小型的Markdown编辑器,用NW.js打了一包,在公司Windows上跑得飞快,带回家Mac电脑上一样用,体验还蛮统一的。
拥抱完整Node.js生态,功能扩展超方便
NW.js最强的一点,其实还是它能完整访问Node.js的生态系统。你可以使用任何Node模块,包括 fs
, child_process
, path
,甚至 express
、sqlite3
、axios
等第三方库也没问题。
这就意味着,你可以在前端界面中通过按钮控制硬件、调用数据库、执行系统命令,甚至搭一个本地服务器和前端联动也完全没问题。
比如你可以做这样的应用:
- 本地笔记工具(用
fs
保存md文件) - 下载器(用
axios
拉资源) - PDF批量处理工具(用
pdf-lib
) - 甚至可以做个自动化脚本工具界面化展示(结合
child_process
)
说白了,你以前需要用Electron、C++或者Qt才能做的,现在用NW.js加个前端框架就能轻松搞定了。
和Electron相比,NW.js有什么不同?
大家很容易拿NW.js和Electron对比,因为它们目标很像:都是用Web技术做桌面App。
但两者在架构上有一个很大的不同:
- Electron 是前端代码在一个“渲染进程”里跑,Node.js代码在“主进程”里,你要通过IPC通信来互调;
- NW.js 是直接把DOM和Node代码放在一个进程里跑,互不分离,写起来更直觉简单。
如果你是一个刚入门的前端开发者,想快速实现一个桌面应用demo,我更推荐从NW.js开始,逻辑会清晰很多。
当然啦,如果你需要处理非常复杂的多窗口、后台进程、沙箱安全等问题,那Electron可能更灵活一点,具体选谁就看你的项目需求了。
我的感觉是
我自己第一次接触NW.js是在做一个公司内网小工具的时候,需要一个可以上传文件并处理数据的应用,纯网页做不了,Electron太重手,结果NW.js刚好完美解决。
它不需要你去学新东西,只要你有一点Node.js和前端基础,就能迅速上手。而且打包部署也非常轻便,代码逻辑清晰,界面也好定制,真的是Web开发者做桌面应用的首选利器之一。
所以啊,如果你是前端工程师,正在考虑怎么跨出Web世界,搞点桌面项目出来,真的可以去试试NW.js,说不定你下一款全平台桌面工具就此诞生了。