Skip to content

Support ES Modules #87

@ffMathy

Description

@ffMathy

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions