NodeJS 如何使用AWS SAM esbuild将静态文件包含到lambda包中?

u3r8eeie  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(231)

我有一个NodeJS AWS Lambda函数,它基于一个html模板文件(emailTemplate.html)生成一封电子邮件。我启动了building my lambdas with esbuild via SAM。现在我想知道如何配置SAM/esbuild以将此文件包含到我的lambda包中。
这是lambda的SAM模板配置:

  1. EmailNotificationFunction:
  2. Type: AWS::Serverless::Function
  3. Properties:
  4. CodeUri: ./lambdas-node/email-notifications/
  5. Handler: daily-summary.handler
  6. Timeout: 120
  7. MemorySize: 512
  8. Runtime: nodejs16.x
  9. Metadata:
  10. BuildMethod: esbuild
  11. BuildProperties:
  12. Sourcemap: true
  13. EntryPoints:
  14. - daily-summary.ts

在我的应用程序代码中,我从本地文件系统读取文件:

  1. fs.readFileSync("./emailTemplate.html", "utf-8")

html文件很小,所以我想坚持这种最小化的方法。我总是可以从S3获取文件或将其打包到一个层中,但我不喜欢去那里。

1wnzp6jl

1wnzp6jl1#

好的,基本上ESBuild的文件加载器是可行的方法。ESBuild将用对文件的引用替换导入,并将文件复制到结果包中。(这正是我想要的。)
这种行为似乎是ESBuild特有的,不能在常规的tsc编译器中使用。因此,我用tsc替换了类型检查的构建步骤,用esbuild替换了转换(见下文)。
我在代码中添加了一个html文件的导入。这将触发ESBuild对该文件执行某些操作。

  1. import emailTemplateHtmlUrl from "./emailTemplate.html";

为了让typechecker满意,我还添加了一个types.d.ts文件(注意d.ts扩展名)

  1. declare module '*.html' {
  2. const value: string;
  3. export default value
  4. }

然后,我将Loader添加到SAM模板中,以便ESBuild复制html文件并在导入中引用它们:

  1. EmailNotificationFunction:
  2. Type: AWS::Serverless::Function
  3. Properties:
  4. CodeUri: ./lambdas-node/email-notifications/
  5. Handler: daily-summary.handler
  6. Timeout: 120
  7. MemorySize: 512
  8. Runtime: nodejs16.x
  9. Metadata:
  10. BuildMethod: esbuild
  11. BuildProperties:
  12. Sourcemap: true
  13. Loader:
  14. - .html=file
  15. EntryPoints:
  16. - daily-summary.ts

最后,我的新测试命令现在看起来像这样:

  1. tsc --noEmit
  2. npx esbuild daily-summary.ts --outdir=. --loader:.html=file --platform=node
  3. --bundle
  4. mocha *.spec.js
展开查看全部

相关问题