firebase - AWS Lambda,添加 firebase 模块及其依赖项以与 Angular Universal 一起使用
问题描述
我有一个 Angular Universal 项目使用 SSR 部署到 AWS Lambda,但我还没有设法让 firebase 作为它的依赖项工作。控制台中的所有错误都与 firebase 依赖项及其依赖项有关。
方法 #1:包含 firebase 模块
package:
exclude:
- '!node_modules/firebase/**'
这增加了firebase,现在错误转移到无法找到firebase的依赖项等等。
方法#2:只包含所有节点模块
这是一个 Angular 项目,我有 600mb+ 的依赖项来构建应用程序,
方法 #3:在我的 Angular 'dist' 文件夹中安装 firebase。
这将引发运行时错误:
Error: Failed to load gRPC binary module because it was not installed for the current system\nExpected directory: node-v64-linux-x64-glibc\nFound: [node-v64-win32-x64-unknown]\nThis problem can often be fixed by running \"npm rebuild\" on the current system\nOriginal error: Cannot find module '/var/task/node_modules/grpc/src/node/extension_binary/node-v64-linux-x64-glibc/grpc_node.node'",
方法 #4:serverless-webpack
这会在sls deploy
说它找不到 webpack 配置时抛出错误,但它就在 serverlesss.yml 旁边的根目录中,并且它已经被 angular Universal 使用,我不能用不同的配置覆盖它 serverless-webpack 插件.
方法 #5:手动 Lambda 层
我尝试使用具有firebase作为依赖项的package.json创建一个层,运行npm install,制作包含该nodejs
文件夹的文件夹的存档node_modules
并将其作为层上传+手动添加到我的函数中。
与 #1 相同的错误,找不到 firebase 模块,这也将在我下次部署时被无服务器框架覆盖。
方法 #6:通过无服务器的 Lambda 层
我试图将这些文章拼凑在一起,以获得 第 1条、第 2条、第 3条的工作,并使用了这个 github中的示例,但用 firebase 切换了时刻。
但是它们都不起作用,无服务器配置:
layers:
firebaseLayer:
path: ../layers/firebase-layer
compatibleRuntimes:
- nodejs8.10
- nodejs10.x
package:
include:
- node_modules/**
会抛出:No file matches include / exclude patterns
const firebase = require('firebase');
我的端点处理程序内部也有。
我一直试图让这个工作整整两天,这已经令人沮丧了。任何帮助表示赞赏。
解决方案
两种可能的解决方案:
serverless-webpack
与以下配置一起使用:
# serverless.yaml
service: serverless-webpack-firebase
provider:
name: aws
runtime: nodejs10.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-1'}
plugins:
- serverless-webpack
package:
individually: true
custom:
webpack:
webpackConfig: "webpack.config.js"
includeModules: true
packager: "yarn"
functions:
withWebpack:
handler: handler.hello
// webpack.config.js
const path = require("path");
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
module.exports = {
entry: slsw.lib.entries,
target: "node",
mode: slsw.lib.webpack.isLocal ? "development" : "production",
performance: {
hints: false
},
resolve: {
extensions: [".js", ".json"]
},
externals: [nodeExternals()]
};
externals: [nodeExternals()]
将从包中删除所有外部依赖项,并且includeModules: true
仍将它们添加到 zip 下node_modules
- 使用 Lambda 层:
# layer yaml
service: firebase-layer
provider:
name: aws
runtime: nodejs8.10
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-1'}
layers:
firebase:
path: ./layer
description: Layer with all the required dependencies to use firebase
compatibleRuntimes:
- nodejs8.10
- nodejs10.x
licenseInfo: MIT
retain: true
和
service: serverless-layer-firebase
provider:
name: aws
runtime: nodejs10.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-1'}
plugins:
- serverless-webpack
- serverless-pseudo-parameters
package:
individually: true
custom:
webpack:
webpackConfig: "webpack.config.js"
includeModules: false
packager: "yarn"
functions:
withLayer:
handler: handler.hello
layers:
- arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:layer:firebase:1
相同webpack.config.js
,但这次includeModules: false
我们不需要 zip 文件中的依赖项(它们与图层一起加载)。
层结构:
存储库在这里可用:https ://github.com/erezrokah/serverless-webpack-firebase
查看包装尺寸的差异:
推荐阅读
- c# - ASP.NET Core:调用之间的空闲超时有延迟
- c++ - 在模板元编程中使用列表类型
- c# - 从另一个线程调用时不会触发操作
- c# - 在 asp.net 网络表单中注册后,如何通过电子邮件从 sql 数据库向用户发送自动生成的 ID
- r - 在 ddply/dlply 中嵌套 nlm 函数
- java - 连接到 AWS 海王星
- amazon-web-services - AWS 是否根据传入请求的数量或会话的持续时间收费?
- android - 如何在单个文本视图中为特定文本和点击侦听器设置颜色
- ruby-on-rails - React 与 Ruby on Rails 的集成。
- visual-studio - VS2017 15.7.5 不会自动检出文件