Javascript 如何为AWS Lambda nodejs运行时构建单个js文件

Javascript 如何为AWS Lambda nodejs运行时构建单个js文件,javascript,browserify,webpack,aws-lambda,systemjs,Javascript,Browserify,Webpack,Aws Lambda,Systemjs,我们正在开发一个可以帮助在AWS Lambda中部署和维护代码的工具。我想将lambda函数的所有node.js代码构建/捆绑到一个js文件中,因为: 较小的代码库有助于解决lambda冷启动问题 Lambda的邮政编码大小限制为50MB 我们不想创建一个自定义绑定器来实现这一点,因为已经有很多选项(systemjs、browserify、webpack等)。然而,我们关注的是一些节点模块与绑定器/构建器的关系不好的问题 特别是aws sdkhas,说它有,但我已经和那些浏览aws sdk有

我们正在开发一个可以帮助在AWS Lambda中部署和维护代码的工具。我想将lambda函数的所有node.js代码构建/捆绑到一个js文件中,因为:

  • 较小的代码库有助于解决lambda冷启动问题
  • Lambda的邮政编码大小限制为50MB
我们不想创建一个自定义绑定器来实现这一点,因为已经有很多选项(systemjs、browserify、webpack等)。然而,我们关注的是一些节点模块与绑定器/构建器的关系不好的问题

特别是
aws sdk
has,说它有,但我已经和那些浏览aws sdk有问题的人谈过了

我们希望选择一个现有的bundler(或2个),但我们希望确保它能适用于尽可能多的模块/代码。我们正在尝试为JAWS创建一个插件生态系统,因此正确使用插件生态系统是很重要的(不要因为他们使用的模块X不会捆绑而关闭人们)

问题:

  • 我将如何进行捆绑/构建以满足这些约束
  • 我们是否可以向我们产品的消费者提供任何指导方针,以确保他们编写/使用的代码将被捆绑?例如:Dynamic require()会导致问题

  • 可能的答案是使函数的行为类似于引导加载程序。让函数从S3下载打包的代码,解包并运行它


    必须按您建议的方式处理代码似乎是个坏主意,可能会导致无法预测和难以调试的错误。

    我不喜欢使用单一文件解决方案,而是上传压缩了所有代码的zip文件。我用大口喝这个。下面的代码只上载生产依赖项,不包括以前上载的开发依赖项和zip存档。您还可以使用
    gulp.src
    的参数排除测试文件夹或任何其他文件

    请注意,
    aws sdk
    库在我的开发依赖项中,因为aws Lambda已经有一个副本;)


    这并不能直接回答您的问题,但该项目可能正是处于这种情况下的人所需要的

    它允许您在正常的webpack样式的多文件体系结构中构建项目,然后使用CLI实用程序将项目构建到Lambda优化的文件中

    CLI还处理函数初始化、部署和一系列我还不需要的其他函数。它甚至会创建/配置触发器(例如,s3对象创建或通过AWS API服务设置新的REST API)

    我只有几个Lambda函数,但在我开始使用
    serverless
    之前,即使维护这些函数也是一件痛苦的事情

    (这是一个奉承的帖子,但要明确的是,我不是该项目的附属机构)

    现在正式发布了。你可以解释为什么这是一件伟大的事情

    我已经创建了一个名为的无服务器插件,它将以最小的配置完成所有繁重的工作

    为了具体回答这个问题,我用这个browserify配置解决了这个问题:

    {
      disable: false, //Not an official option, used as internal option to skip browserify
      exclude: [],    //Not an option, but will use for setting browserify.exclude() if defined in yml
      ignore:  [],    //Not an option, but will use for setting browserify.ignore() if defined in yml
    
      basedir:          this.serverless.config.servicePath,
      entries:          [],
      standalone:       'lambda',
      browserField:     false,  // Setup for node app (copy logic of --node in bin/args.js)
      builtins:         false,
      commondir:        false,
      ignoreMissing:    true,  // Do not fail on missing optional dependencies
      detectGlobals:    true,  // We don't care if its slower, we want more mods to work
      insertGlobalVars: {      // Handle process https://github.com/substack/node-browserify/issues/1277
        //__filename: insertGlobals.lets.__filename,
        //__dirname: insertGlobals.lets.__dirname,
        process: function() {
        },
      },
      debug:            false,
    }
    

    您可以通过完整的示例查看我的完整代码

    您是否尝试过使用以下选项进行browserify:“{builtins:false,commondir:false,browserField:false,detectGlobals:false,ignoreMissing:true,}”```
    {
      disable: false, //Not an official option, used as internal option to skip browserify
      exclude: [],    //Not an option, but will use for setting browserify.exclude() if defined in yml
      ignore:  [],    //Not an option, but will use for setting browserify.ignore() if defined in yml
    
      basedir:          this.serverless.config.servicePath,
      entries:          [],
      standalone:       'lambda',
      browserField:     false,  // Setup for node app (copy logic of --node in bin/args.js)
      builtins:         false,
      commondir:        false,
      ignoreMissing:    true,  // Do not fail on missing optional dependencies
      detectGlobals:    true,  // We don't care if its slower, we want more mods to work
      insertGlobalVars: {      // Handle process https://github.com/substack/node-browserify/issues/1277
        //__filename: insertGlobals.lets.__filename,
        //__dirname: insertGlobals.lets.__dirname,
        process: function() {
        },
      },
      debug:            false,
    }