无服务器 NodeJS 文件/文件夹结构

Flu*_*yte 6 node.js aws-lambda serverless-framework

我正在使用无服务器设置我的第一个项目,虽然我找到了很多很棒的“入门”教程,但我很难找到有关实际项目结构的任何信息。

我的想法是对我的函数、共享库和核心配置/依赖项使用以下结构:

.
??? functions/
?   ?
?   ??? users/
?   ?   ??? handler.js
?   ?   ??? serverless.yml
?   ?
?   ??? roles/
?       ??? handler.js
?       ??? serverless.yml
?
??? shared/
?   ??? common.js
?   
??? node_modules/
??? package.json
Run Code Online (Sandbox Code Playgroud)

我的主要好奇心是关于部署以及它与依赖项和共享文件的关系。此外,自动部署此结构似乎很奇怪,因为我正在收集我需要单独部署每个我可以编写脚本的功能,但想知道是否需要或建议这样做。

Mar*_*yer 4

我已经处理过这个问题了,发现它非常令人沮丧。如果您从设置中进行部署,您的 api 是什么样的?对于单个serverless.yaml文件,您最终会得到独立的 api 端点(假设您是通过 api 调用而不是像 s3 之类的东西触发)。

我最终得到了这样的结构:

|- serverless/
|--- serverlsss.yml
|--- web pack.config.js
|--- dist/
|--- node_modules() /* dev and common code */
|--- src/
|----- function1/
|-------- node_modules
|-------- package.json
|-------- index.js
|----- function2/
|-------- node_modules
|-------- package.json
|-------- index.js
Run Code Online (Sandbox Code Playgroud)

我使用无服务器 webpack 插件将各个函数输出到dist/目录中。thenserverless.yaml指向这些。

看起来webpack.config.js像这样:

const nodeExternals = require('webpack-node-externals');
const path = require('path');

module.exports = {
  entry: {
    'function1': './src/function1/index.js', 
    'function2': './src/function2/index.js',
  },
  target: 'node',
  output:{
    libraryTarget: 'commonjs2',
    path: path.join(__dirname, './dist'),
    filename: '[name].js'
  },
  externals: [nodeExternals()],
  module: {
    loaders: [
      /* Babel is nice, but it's adding a some bulk and I don't need it
      {
        test: /\.js$/,
        loaders: ['babel'],
        include: __dirname,
        exclude: /node_modules/,
      }, */
      { 
        test: /\.json$/,
        loaders: ['json']} 
    ],
  },
};

//  externals: [nodeExternals()],
//  nodeExternals seems to break aws-sdk when serving locally
//  aws-sdk should be in dev-dependencies of root folder
//  that way it's available in dev but doesn't get packaged.
//  It's available to the lambdas when deployed.
Run Code Online (Sandbox Code Playgroud)

之后,请确保您在中设置了单独的标志serverless.yml

package:
  individually: true
Run Code Online (Sandbox Code Playgroud)

webpack 插件非常好,可以完成大部分繁重的工作。有了这个,我可以进行一次部署,所有函数最终都作为单个 lambda 函数全部位于一个 api 端点下。您还可以获得 Webpack 开发服务器,以便可以运行serverless webpack serve来测试您的功能。

设置起来有点痛苦,但效果很好。