2017-07-01 1 views
3

Je configure mon premier projet en utilisant serverless et pendant que je trouve beaucoup de bons tutoriels de "mise en route", j'ai du mal à trouver quoi que ce soit sur la structure réelle du projet.Structure de fichier/dossier NodeJS sans serveur

Mes pensées est d'utiliser la structure ci-dessous pour mes fonctions, librairies partagées et la configuration de base/dépendances:

|- functions/ 
|--- users/ 
|----- handler.js 
|----- serverless.yml 
|--- roles/ 
|----- handler.js 
|----- serverless.yml 
|- shared/ 
|--- common.js 
|- node_modules/ 
|- package.json 

Ma principale curiosité est autour de déploiement et comment cela se rapporte à des dépendances et des fichiers partagés. De plus, l'automatisation du déploiement de cette structure semble étrange car je vais devoir déployer chacune des fonctions séparément que je peux écrire, mais je me demande si cela est nécessaire ou conseillé.

Répondre

1

J'ai traité cela un peu et j'ai trouvé ça assez frustrant. Si vous déployez à partir de votre configuration, à quoi ressemble votre API? Avec des fichiers individuels serverless.yaml, vous obtenez des points d'extrémité api indépendants (en supposant que vous déclenchiez avec des appels api et pas quelque chose comme s3).

J'ai fini avec une structure comme celle-ci:

|- 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 

J'utilise le plugin webpack serverless pour produire les fonctions individuelles dans le répertoire dist/. Le serverless.yaml pointe ensuite vers ceux-ci.

Le webpack.config.js ressemble à ceci:

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. 

Après cela assurez-vous de mettre le drapeau individuel dans serverless.yml

package: 
    individually: true 

Le plugin webpack est tout à fait agréable et fait la plupart du levage de charges lourdes. Avec cela, je peux faire un déploiement unique et toutes les fonctions se terminent comme des fonctions lambda individuelles sous un point d'extrémité API. Vous obtenez également le serveur de développement Webpack afin que vous puissiez exécuter serverless webpack serve pour tester vos fonctions.

C'était un peu difficile à installer, mais ça a plutôt bien fonctionné.