NWJS应用相对路径失效及变量路径使用问题咨询
NWJS 相对路径/自定义变量路径问题解决方案
问题根因
- 直接传入
../../../SYSTEM.USER/DOCUMENTS/DOCUMENTS.NFO这类层级相对路径时,path.resolve默认以NW进程启动时的工作目录为解析基准,这个路径在开发环境、打包后、不同启动方式下都会变动,手写层级相对路径必然出现解析错误。 - 硬编码
D:/开头的绝对路径能运行仅适配当前本地磁盘环境,换设备、换安装位置后直接失效。
自定义变量路径支持说明
- NWJS 原生不识别
/%APPLICATION%/xxx这类自定义变量写法,直接传入会被当作普通字符串路径解析,无法定位到目标文件。 - Windows 系统自带环境变量(如
%APPDATA%、%USERPROFILE%)可通过 Node.js 的process.env对象取值后拼接使用,不能直接把带%的原始字符串传入路径接口。
正确实现代码
路径解析必须以固定的应用根目录为基准,禁止依赖进程工作目录、
__dirname这类动态值:NWJS 打包后__dirname会指向临时解压目录,和实际应用安装目录不一致,会导致路径失效。固定基准请用 NWJS 官方提供的nw.App.startPath属性,该属性恒指向 NW 可执行文件所在目录,不受启动方式、运行环境影响。
修正后的 Main.js
const path = require('path'); // 封装自定义变量路径解析逻辑 function resolveAppPath(relativePath) { const appRoot = nw.App.startPath; // 替换自定义%APPLICATION%变量为应用根目录 const normalizedPath = relativePath.replace(/^%APPLICATION%[\\/]/, ''); return path.resolve(appRoot, normalizedPath); } function OpenDocuments() { // 两种写法二选一即可:直接拼相对路径,或者用自定义变量格式 // const targetPath = path.resolve(nw.App.startPath, 'SYSTEM.USER/DOCUMENTS/DOCUMENTS.NFO'); const targetPath = resolveAppPath('%APPLICATION%/SYSTEM.USER/DOCUMENTS/DOCUMENTS.NFO'); nw.Shell.showItemInFolder(targetPath); }
对应 Default.html 代码(无需修改,保持原有逻辑即可)
<div name="FolderMenuContainer" id="FolderMenuContainer" class="FolderMenuContainer"> <span name="FolderIcon" id="FolderIcon" class="material-icons"> description </span> <span name="FolderText" id="FolderText" class="FolderText" onclick="OpenDocuments()"> Documents </span> </div>
注意事项
- 所有路径拼接统一用
path.join/path.resolve处理,不要手动拼接斜杠,Node 会自动适配 Windows、macOS、Linux 的路径分隔符差异。 - 调试阶段可先通过
console.log(nw.App.startPath, targetPath)打印基准路径和最终解析的目标路径,确认和实际文件位置匹配后再正式调用接口。
文件结构参考


内容的提问来源于stack exchange,提问作者Dustin Angeletti
相关产品推荐
相关产品推荐

