Dans notre projet, nous avons récemment décidé que pour certaines implémentations, les fonctions es6 + nous facilitent la vie. Cependant, ce "plus facile" n'est pas très traduit par babel en combinaison avec serverless.Mise en œuvre correcte de babel avec serverless
La structure du projet est le suivant:
+
|- serverless.yaml
|- package.json
|- .babelrc
|- /src
|- handler.js
|- package.json
|- /test
|- test.js
Cela montre le dossier global du projet. Voici le code source pour les fichiers individuels.
serverless.yaml
provider:
name: aws
runtime: nodejs6.10
functions:
getHello:
handler: handler.lambdaGetHello
events:
- http:
path: api/hello
method: GET
authorizer: aws_iam
cors: true
package:
include:
- handler.js
- node_modules/**
package.json (premier niveau, notez que cela a probablement trop trop de paquets, le code actuel a d'autres fonctions, le nettoyage mais cela pourrait être dans l'ordre)
{
"name": "Default-package-JSON-file",
"version": "0.1.0",
"description": "Simple serverless test",
"scripts": {
"build": "npm run build:init && npm run build:js && npm run build:install",
"build:init": "rm -rf dist && mkdir dist && rm -rf src/node_modules && rm -rf src/test",
"build:install": "cp src/package.json dist/ && cd dist && yarn",
"build:js": "babel src --out-dir dist",
"install-base": "npm run install-base:tld && npm run install-base:src",
"install-base:tld": "yarn",
"install-base:src": "cd src/ && yarn",
"svl-deploy": "cp serverless.yaml dist/ && cd dist && serverless deploy",
"test-dist": "cp -R test/ dist/ && cd dist && mocha",
"test-src": "cp -R test/ src/ && cd src && mocha"
},
"author": "Mathieu Devos",
"license": "UNLICENSED",
"dependencies": {
"add": "^2.0.6",
"babel-runtime": "^6.26.0",
"chai": "^4.0.1",
"mocha": "^3.4.2",
"serverless": "^1.20.2"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-eslint": "^7.2.3",
"babel-plugin-transform-async-to-generator": "^6.24.1",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-polyfill": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-register": "^6.26.0"
},
"private": true
}
.babelrc
{
"plugins": [
"transform-async-to-generator",
"transform-runtime", {
"polyfill": false,
"regenerator": true
}],
"presets": ["es2015"]
}
src/handler.js (évidemment pas tout est défini, C'est juste un exemple).
async function hello(items = []) {
const output = [];
for (const item of items) {
output.push(await item.handle());
}
return output;
};
module.exports.hello = hello;
const lambdaAddItems = (event, context, cb) => {
const req = new Request(event);
const args = context.args;
magicFunction(hello, [args], callback);
};
module.export.lambdaHello = hello;
src/package.json (celui-ci ne contient que tous les différents paquets nécessaires Src, maintenant ce juste contient assez pour faire la demande).
{
"name": "source-package-json-file",
"version": "0.1.0",
"description": "Generic package module for source code",
"scripts": {},
"author": "Mathieu Devos",
"license": "UNLICENSED",
"dependencies": {
"lambda-proxy-utils": "^1.2.4"
},
"devDependencies": {},
"private": true
}
test/test.js (teste le code local).
const handler = ../handler.js;
const hello = handler.hello;
const lambdaHello = handler.lambdaHello;
...
Run the tests
Alors, que faisons-nous pour exécuter ce code?
Nous avons un pipeline (ou un script local si vous le s'il vous plaît) pour exécuter les commandes suivantes dans l'ordre:
NPM Exécutez install base NPM run test src run de NPM construire NPM run test- dist npm run-SVL déployer
Explication des différentes commandes: 1) exécuter npm install-base - installe toutes les dépendances de dev et les commandes à exécuter le peluchage, les essais, babel, et serverless. 2) npm run test-src - Copie le test sur src et l'exécute, ce qui va tester tout le code dans le dossier local (dans ce cas-là, il est possible de lancer src). Si le dossier src)
3) NPM exécuter build - Supprime node_modules & Test de src, se traduit par src à dist en utilisant babel (cela se traduit en fait correctement)
4) NPM exécuter test dist - test de copies à dist et l'exécute, cela va tester dans le dossier local dans ce cas dist. Ici, le problème est que cela fonctionne pas travail sans - commande babel-polyfill. Cependant, la traduction est faite
5) npm run svl-deploy - Étant donné que tout s'est bien passé, déployez-le sur serverless.
Les problèmes apparaissent à l'étape 4, si je lance sans --require babel-polyfill Je reçois l'erreur:
regeneratorRuntime is not defined
je peux « réparer » que de donner la mocha la commande suivante --Faire appel à babel-polyfill.
Cependant en cours d'exécution qui laisse mon déploiement sans serveur cassé.
Ma question est maintenant: quelle est la façon «saine» d'y parvenir? Si possible, je veux garder l'aperçu des dossiers comme celui-ci, car il montre clairement ce qui est nécessaire, sans encombrer la vue d'ensemble.
BR, Mathieu