我有一个Node应用程序(HTTP服务器),它使用express和EJS渲染模板。当我尝试使用pkg(https://github.com/zeit/pkg)构建可执行的独立文件时,它会引发错误,指出我尝试访问“ localhost /”后未立即安装ejs。但是原始应用程序可以正常运行,并且EJS是除express之外的另一个模块。
文档指出,构建.exe时要考虑依赖项。我可以看到它的工作原理,因为使用mysql模块缓存数据库的请求正在正常发生。这似乎是EJS特有的问题,可能是因为它不是'require()d',而是在快速选项中被选作模板引擎。
很简单,有人遇到过这种情况吗?我用Google搜索出来,但是在用pkg构建项目之后,没有发现与ejs错误有关的信息。
堆栈跟踪:
Error: Cannot find module 'ejs'
1) If you want to compile the package/file into executable, please pay attention to compilation warnings and specify a literal in 'require' call. 2) If you don't want to compile the package/file into executable and want to 'require' it from filesystem (likely plugin), specify an absolute path in 'require' call using process.cwd() or process.execPath.
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:592:15)
at Function.Module._resolveFilename (pkg/prelude/bootstrap.js:1280:46)
at Function.Module._load (internal/modules/cjs/loader.js:518:25)
at Module.require (internal/modules/cjs/loader.js:648:17)
at Module.require (pkg/prelude/bootstrap.js:1159:31)
at require (internal/modules/cjs/helpers.js:20:18)
at new View (C:\snapshot\Eduardo\node_modules\express\lib\view.js:81:14)
at Function.render (C:\snapshot\Eduardo\node_modules\express\lib\application.js:570:12)
at ServerResponse.render (C:\snapshot\Eduardo\node_modules\express\lib\response.js:1008:7)
at C:\snapshot\Eduardo\Desktop\node eureka\app.js:0:0
答案 0 :(得分:0)
要将EJS与PKG一起使用,我最终更改了文件中的某些配置。
在app.js
中,我刚刚将views
文件夹添加为静态资源。
app.js:
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'views'))); // Line exists just for PKG
在package.json
中,您需要指定资产和起点。
package.json:
...
"main": "app.js",
"bin": "app.js",
...
"pkg": {
"assets": ["views/**/*", "public/**/*"]
}
在我看来更重要的是,因为这最终使我头疼,所以在使用PKG进行编译时,您需要指定要编译文件夹中的整个项目,因为它需要找到package.json
文件并从那里查看需求。
使用:
pkg .
在我仅使用pkg app.js
进行编译并改为使用pkg .
进行编译时,收到了您发布的错误,这在很大程度上解决了该问题。从技术上讲,您可以跳过app.js
中的更改,但是修改可以确保views
文件夹包含在二进制文件中,就像将其添加到package.json
部分的assets
文件中一样似乎根本无法正常工作。 (此外,请注意必须使用path.join
)