首页 > 解决方案 > zeit/pkg 如何捆绑我的节点应用程序?

问题描述

这是我关于 SO 的第一个问题,所以首先是一个 BIG HELLO,如果我的问题不符合所有标准或看起来很尴尬,请原谅。

我想知道我的应用程序是如何与 zeit 的 pkg 捆绑和编译的。

捆绑包是否插入到预先确定大小的二进制文件中?

它是否下载像 nexe 这样的节点源,并且代码是作为 main 运行的,还是在执行二进制文件时加载的快照?

我有一个后端 node-express 服务器和一个前端 Angular 应用程序,每个应用程序都有自己的 node_modules 文件夹,如下所示:

myapp
 |-------/client
 |          |
 |          |-----/e2e
 |          |-----/node_modules
 |          |-----/src
 |           
 |-------/config 
 |
 |-------/node_modules
 |
 |-------/routes
 |
 |--app.js
 |
 |--package.json
 |
 |--README.md

pkg 如何处理这两个 node_modules 实例?

非常感谢您的帮助/专业知识!

标签: node.jsangular5packagingzeit-pkg

解决方案


有几个这一事实node_modules并不重要。在 app.js 中,require('foo')myapp/node_modules/foo. 模块以类似的方式捆绑在一起,它们在加载时被解析。

pkg只打包明确指定的模块。正如文件所述,

在打包过程中,pkg 会解析您的源代码,检测对 require 的调用,遍历项目的依赖项并将它们包含到可执行文件中。在大多数情况下,您不需要手动指定任何内容。但是,您的代码可能有 require(variable) 调用(所谓的要求的非文字参数)或使用非 JavaScript 文件(例如视图、css、图像等)。

  require('./build/' + cmd + '.js')
  path.join(__dirname, 'views/' + viewName)

pkg 不处理此类情况。pkg因此,您必须在package.json 文件的属性中手动指定文件 - 脚本和资产。

  "pkg": {
    "scripts": "build/**/*.js",
    "assets": "views/**/*"
  }

请务必调用pkg package.jsonpkg .使用脚本和资产条目。

不这样做会导致打包时出现警告:

动态 require 可能在运行时失败,因为请求的文件在编译时是未知的并且未包含在可执行文件中。使用字符串文字作为 'require' 的参数,或保持原样并在 'scripts' 选项中指定解析的文件名。


推荐阅读