如何在不包含所有不必要的依赖项的情况下为 Lambda/Google Cloud Functions 打包
How to package for Lambda/Google Cloud Functions without including all unnecessary dependencies
我不喜欢 Node 的一件事是,只要你添加一个 require("whatever")
,你最终会得到 1000 个传递依赖项,如果代码可能会调用 require
需要。
var whatever = require('whatever');
if (probablyFalse) {
whatever.theOnlyFunctionThatIUse();
// ...but `whatever` et al require other libraries which I won't actually use
}
我想构建一个包以部署在 Google Cloud Functions(以及 Lambda 上的类似应用程序)上。我的代码导入了 @google-cloud/datastore ,它有很多传递依赖,其中一些有二进制文件、计算导入等。我不想 运行 进入包大小限制或增加节点所需的时间解析代码。我想使用一种打包工具来进行 tree shaking 并将(大部分)我的代码和依赖项编译到一个文件中。我希望能够指定从 index.js
中排除哪些库,并仅在 node_modules
.
下提供必要的文件
因为我正在编译 Typescript 并在我的 build/test/package/deploy 过程中使用其他库,node_modules 包含 100s-1000s 库,其中大部分在生产中不需要。
理想情况下,我希望能够构建看起来像这样的东西:
- package.json - {"main": "index.js", 依赖项: { "@google-cloud/datastore": "1.4.1" }}
- index.js - 从我项目中的多个 TypeScript 文件以及我从库和传递依赖项导入的大部分代码编译而成
- node_modules - 所有代码,但仅 index.js 中未包含但 运行 应用程序需要的代码。
我创建了一个简单的演示应用程序来展示我正在尝试做的事情(目前我正在使用 FuseBox):
https://github.com/nalbion/packaged-google-function/blob/master/lib/demo.js
为了从我编译的 demo.js 中排除 @google-cloud/datastore 和它的传递依赖,我添加了一个 filterFile:
filterFile: file => {
return !['@google-cloud/datastore'].includes(file.collection.name);
},
我对输出中的行感到困惑:
FuseBox.pkg("@google-cloud/datastore", {}, function(___scope___){
return ___scope___.entry = "src/index.js";
});
Google Cloud Functions也很迷茫:
TypeError: Cannot read property 'default' of null
at helloWorld (/user_code/demo.js:10:42)
作为参考,演示一直有效,直到我尝试添加数据存储区代码:
https://github.com/nalbion/packaged-google-function/blob/no-dependencies/lib/demo.js
我怀疑 filterFile 不是为这个目的而设计的,或者我用错了。
FuseBox 中有过滤包的等效项吗?
有更好的方法吗?
(编辑)
私有 git 存储库存在一个已知问题:
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/issues/300
Auto deploy Google Cloud Functions from Google Cloud Source Control
你会做太多不必要的工作。
Google Cloud Functions automatically handles dependencies 在部署后使用 npm 在服务器上安装它们(假设依赖项列在 package.json 中)。它不会上传 node_modules 的内容。不要费心尝试创建依赖项的物化版本,除非你真的不希望 GCF 从 npm 自动安装它们。
我不喜欢 Node 的一件事是,只要你添加一个 require("whatever")
,你最终会得到 1000 个传递依赖项,如果代码可能会调用 require
需要。
var whatever = require('whatever');
if (probablyFalse) {
whatever.theOnlyFunctionThatIUse();
// ...but `whatever` et al require other libraries which I won't actually use
}
我想构建一个包以部署在 Google Cloud Functions(以及 Lambda 上的类似应用程序)上。我的代码导入了 @google-cloud/datastore ,它有很多传递依赖,其中一些有二进制文件、计算导入等。我不想 运行 进入包大小限制或增加节点所需的时间解析代码。我想使用一种打包工具来进行 tree shaking 并将(大部分)我的代码和依赖项编译到一个文件中。我希望能够指定从 index.js
中排除哪些库,并仅在 node_modules
.
因为我正在编译 Typescript 并在我的 build/test/package/deploy 过程中使用其他库,node_modules 包含 100s-1000s 库,其中大部分在生产中不需要。
理想情况下,我希望能够构建看起来像这样的东西:
- package.json - {"main": "index.js", 依赖项: { "@google-cloud/datastore": "1.4.1" }}
- index.js - 从我项目中的多个 TypeScript 文件以及我从库和传递依赖项导入的大部分代码编译而成
- node_modules - 所有代码,但仅 index.js 中未包含但 运行 应用程序需要的代码。
我创建了一个简单的演示应用程序来展示我正在尝试做的事情(目前我正在使用 FuseBox):
https://github.com/nalbion/packaged-google-function/blob/master/lib/demo.js
为了从我编译的 demo.js 中排除 @google-cloud/datastore 和它的传递依赖,我添加了一个 filterFile:
filterFile: file => {
return !['@google-cloud/datastore'].includes(file.collection.name);
},
我对输出中的行感到困惑:
FuseBox.pkg("@google-cloud/datastore", {}, function(___scope___){
return ___scope___.entry = "src/index.js";
});
Google Cloud Functions也很迷茫:
TypeError: Cannot read property 'default' of null
at helloWorld (/user_code/demo.js:10:42)
作为参考,演示一直有效,直到我尝试添加数据存储区代码:
https://github.com/nalbion/packaged-google-function/blob/no-dependencies/lib/demo.js
我怀疑 filterFile 不是为这个目的而设计的,或者我用错了。
FuseBox 中有过滤包的等效项吗?
有更好的方法吗?
(编辑) 私有 git 存储库存在一个已知问题:
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/issues/300
Auto deploy Google Cloud Functions from Google Cloud Source Control
你会做太多不必要的工作。
Google Cloud Functions automatically handles dependencies 在部署后使用 npm 在服务器上安装它们(假设依赖项列在 package.json 中)。它不会上传 node_modules 的内容。不要费心尝试创建依赖项的物化版本,除非你真的不希望 GCF 从 npm 自动安装它们。