使用pkg打包Node.js项目如何将静态资源内置到exe可执行文件
问题根因
PKG打包后会将声明的资源存入exe内部的虚拟快照文件系统,运行时__dirname指向该虚拟文件系统内的对应路径。原有代码使用的'public'相对路径、EJS默认的视图查找路径,均基于exe启动时的外部磁盘工作目录解析,不会读取exe内部的打包资源,因此加载失败。
原有package.json配置存在三处问题:
- pkg、targets键名不符合JSON语法规范,缺少必要的双引号,会导致pkg无法正常读取配置
- 资源匹配规则
views/*、public/*仅匹配对应目录下的一级文件,子目录内资源不会被打包 - 未显式指定EJS视图目录,默认走外部工作目录查找逻辑
修复方案
- 调整Express路径配置,所有资源路径基于
__dirname拼接,显式声明EJS视图目录。该写法兼容本地开发与打包运行场景,无需额外环境判断。
修正后的index.js代码:
const express = require('express'); const path = require('path'); const app = express(); const port = 80; app.use(express.static(path.join(__dirname, 'public'))); app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); app.get('/', (req, res) => { res.render('index') }); app.listen(port, () => { console.log('Run') })
- 修正package.json中的pkg配置段,修复语法错误,将资源匹配规则改为递归匹配所有层级文件:
"bin": "index.js", "pkg": { "assets": ["views/**/*", "public/**/*"], "targets": ["node16-win-x64"], "outputPath": "dist" }
修改完成后重新执行打包命令,生成的exe即可正常读取内部打包的静态资源与视图文件,无需依赖外部目录下的资源。
内容的提问来源于stack exchange,提问作者imagesck
相关产品推荐
相关产品推荐

