如何打包Lambda / Google Cloud Functions而不包含所有不必要的依赖项

时间:2018-07-05 01:24:15

标签: node.js webpack aws-lambda google-cloud-functions fusebox

我不喜欢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,它具有许多可传递的依赖项,其中一些具有二进制文件,计算的导入等。我不想遇到程序包大小限制或增加Node解析代码所花费的时间。我想使用一种打包工具,该工具可以摇晃树木并将我的大部分代码和依赖项编译到一个文件中。我希望能够指定要从index.js中排除的库,并仅在node_modules下提供必要的文件。

因为我正在编译Typescript并在构建/测试/打包/部署过程中使用其他库,所以node_modules包含100至1000的库,其中大多数在生产中不需要。

理想情况下,我希望能够构建如下外观:

  • 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

1 个答案:

答案 0 :(得分:1)

您将不必要地进行过多的工作。

Google Cloud Functions automatically handles dependencies,可以在部署后通过npm将它们安装在服务器上(假设依赖关系列在package.json中)。它不会上载node_modules的内容。除非您真的不希望GCF从npm自动安装依赖项,否则不要为创建依赖项的实现版本而烦恼。