【问题标题】:Serverless NodeJS File/Folder Structure无服务器 NodeJS 文件/文件夹结构
【发布时间】:2017-12-05 11:39:04
【问题描述】:

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

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

.
├── functions/
│   │
│   ├── users/
│   │   ├── handler.js
│   │   └── serverless.yml
│   │
│   └── roles/
│       ├── handler.js
│       └── serverless.yml
│
├── shared/
│   └── common.js
│   
├── node_modules/
└── package.json

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

【问题讨论】:

    标签: node.js aws-lambda serverless-framework


    【解决方案1】:

    我已经处理了一点,发现它非常令人沮丧。如果您从您的设置中部署,您的 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
    

    我使用无服务器 webpack 插件将各个函数输出到 dist/ 目录中。 serverless.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.
    

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

    package:
      individually: true
    

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

    设置起来有点麻烦,但运行良好。

    【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2013-04-19
    • 2022-01-11
    • 1970-01-01
    • 2018-04-21
    • 2016-05-01
    相关资源
    最近更新 更多