You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pkg打包Node.js项目如何将静态资源内置到exe可执行文件

问题根因

PKG打包后会将声明的资源存入exe内部的虚拟快照文件系统,运行时__dirname指向该虚拟文件系统内的对应路径。原有代码使用的'public'相对路径、EJS默认的视图查找路径,均基于exe启动时的外部磁盘工作目录解析,不会读取exe内部的打包资源,因此加载失败。
原有package.json配置存在三处问题:

  • pkg、targets键名不符合JSON语法规范,缺少必要的双引号,会导致pkg无法正常读取配置
  • 资源匹配规则views/*、public/*仅匹配对应目录下的一级文件,子目录内资源不会被打包
  • 未显式指定EJS视图目录,默认走外部工作目录查找逻辑
修复方案
  1. 调整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')
})
  1. 修正package.json中的pkg配置段,修复语法错误,将资源匹配规则改为递归匹配所有层级文件:
"bin": "index.js",
"pkg": {
  "assets": ["views/**/*", "public/**/*"],
  "targets": ["node16-win-x64"],
  "outputPath": "dist"
}

修改完成后重新执行打包命令,生成的exe即可正常读取内部打包的静态资源与视图文件,无需依赖外部目录下的资源。

内容的提问来源于stack exchange,提问作者imagesck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:42:31