Tim*_*aer 5 amazon-web-services node.js aws-lambda aws-sam esbuild
我有一个 NodeJS AWS Lambda 函数,它根据 html 模板文件 ( ) 生成电子邮件emailTemplate.html。我开始通过 SAM 使用 esbuild 构建我的 lambda。现在我想知道如何配置 SAM/esbuild 将此文件包含到我的 lambda 包中。
这是 lambda 的 SAM 模板配置:
EmailNotificationFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambdas-node/email-notifications/
Handler: daily-summary.handler
Timeout: 120
MemorySize: 512
Runtime: nodejs16.x
Metadata:
BuildMethod: esbuild
BuildProperties:
Sourcemap: true
EntryPoints:
- daily-summary.ts
Run Code Online (Sandbox Code Playgroud)
在我的应用程序代码中,我从本地文件系统读取文件:
fs.readFileSync("./emailTemplate.html", "utf-8")
Run Code Online (Sandbox Code Playgroud)
html 文件很小,所以我想坚持这种简约的方法。我总是可以从 S3 获取文件或将其打包在一个层中,但我不想去那里。
好的,基本上 ESBuild 的文件加载器就是正确的选择。ESBuild 将用对文件的引用替换导入,并将文件复制到结果包中。(这正是我想要的。)
这种行为似乎是 ESBuild 特有的,并且不适用于常规tsc编译器。所以我将构建步骤替换为类型检查tsc和转译esbuild(见下文)
我将 html 文件的导入添加到我的代码中。这将触发 ESBuild 对此文件执行某些操作。
import emailTemplateHtmlUrl from "./emailTemplate.html";
Run Code Online (Sandbox Code Playgroud)
为了让类型检查器满意,我还添加了一个types.d.ts文件(注意d.ts扩展名)
declare module '*.html' {
const value: string;
export default value
}
Run Code Online (Sandbox Code Playgroud)
然后我将其添加Loader到我的 SAM 模板中,以便 ESBuild 复制 html 文件并在导入中引用它们:
EmailNotificationFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambdas-node/email-notifications/
Handler: daily-summary.handler
Timeout: 120
MemorySize: 512
Runtime: nodejs16.x
Metadata:
BuildMethod: esbuild
BuildProperties:
Sourcemap: true
Loader:
- .html=file
EntryPoints:
- daily-summary.ts
Run Code Online (Sandbox Code Playgroud)
最后,我的新测试命令现在如下所示:
tsc --noEmit
npx esbuild daily-summary.ts --outdir=. --loader:.html=file --platform=node
--bundle
mocha *.spec.js
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |