将大型 node.js 应用程序捆绑到单个 .js 文件中

bundle a large node.js application into a single .js file

我想将一个较大的 node.js cli 应用程序捆绑到一个 .js 文件中。 我的代码结构如下:

|- main.js
|--/lib
|----| <bunch of js files>
|--/util
|----| <bunch of js files>
...etc

我可以使用 browserify 将整个东西打包到一个文件中,使用 main.js 作为入口点,但 Browserify 假设 运行time 环境是一个浏览器并替换它自己的库(例如 browserify-http 对应 http)。所以我正在寻找 browserify-for-node 命令

我试过运行宁

$ browserify -r ./main.js:start --no-builtins --no-browser-field > myapp.js

$ echo "require('start') >> myapp.js

但是当我尝试 运行 $ node myapp.js.

时遇到了一堆错误

这个想法是,除了核心节点依赖项之外,具有所有依赖项的整个应用程序现在都在一个源文件中,并且可以 运行 使用

$ node myapp.js

更新

=============

JMM 下面的回答有效,但只适用于我的机器。捆绑仍然没有捕获所有依赖项,所以当我尝试 运行 另一台机器上的文件时,我得到依赖项错误,如

ubuntu@ip-172-31-42-188:~$ node myapp.js
fs.js:502
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^
Error: ENOENT, no such file or directory '/Users/ruchir/dev/xo/client/node_modules/request/node_modules/form-data/node_modules/mime/types/mime.types'

查看 --node 选项,以及它包含的其他更精细的选项。

您可以使用 Zeit 的 pkg 并按照以下步骤操作:

npm i pkg -g

然后在您的 NodeJS 项目中,在 JSON 包中包含以下内容:

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

在主要参数中写入要用作包入口点的文件的名称。

之后 运行 在 NodeJS 项目的终端中执行以下命令

pkg server.js --target=node12-linux-x64

或者您可以从上面删除目标参数来构建 Windows、Linux 和 Mac 的包。

生成包后,您必须授予写入权限:

chmod 777 ./server-linux

然后您可以通过

在您的终端中运行它
./server-linux 

此方法将为您提供可执行文件,而不是单个 .js 文件