节点PKG无法从使用EJS的应用程序生成可执行文件

时间:2019-03-24 22:23:19

标签: node.js ejs

我有一个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

1 个答案:

答案 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