aws-sam-webpack-plugin icon indicating copy to clipboard operation
aws-sam-webpack-plugin copied to clipboard

Support ES Modules

Open ffMathy opened this issue 2 years ago • 2 comments

See https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/

Here is my template file:

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Runtime: nodejs18.x

Resources:
  Lambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: app.handler
      Timeout: 10
      Architectures:
      - arm64
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /events
            Method: POST

When running the plugin, the final template file generated is this:

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Globals:
  Function:
    Runtime: nodejs18.x
Resources:
  Lambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: Lambda
      Handler: app.mjs.handler
      Timeout: 10
      Architectures:
        - arm64
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /events
            Method: POST

Note that app.mjs.handler is wrong. It should be just app.handler.

In my webpack.config.js, I have:

  • output.library.type set to "module".
  • output.library.chunkFormat set to "module".
  • experiments.outputModule set to true.

In my package.json, type is set to "module".

With this, .mjs files are generated instead of .js files. But because the file generated is called app.mjs.js instead of app.mjs, Lambda doesn't load it as an ES Module.

ffMathy avatar Jul 20 '23 13:07 ffMathy

If I manually go in and rename the app.mjs.js file to app.mjs and then change the template.yml to also point to app.handler instead of app.mjs.handler, it works just fine.

So I suppose this should be an easy fix maybe?

What do you think?

ffMathy avatar Jul 20 '23 13:07 ffMathy

As a workaround, I can do this:

filename: (chunkData) => awsSamPlugin.filename(chunkData).replace(".js", ".mjs")

In the config.

ffMathy avatar Jul 20 '23 13:07 ffMathy