2017-08-28 5 views
2

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

Répondre

0

La réponse se cachait dans transformer runtime plugin pour babel.

fichier correct de .babelrc:

{ 
    "plugins": [ 
    "transform-async-to-generator", 
    "transform-runtime" 
    ], 
    "presets": ["es2015"] 
} 

avec l'ajout de babel-polyfill dans src/package.json (depuis Serverless doit être déployée à ce sujet).

Des alternatives telles que l'utilisation de webpack conjointement avec serverless sont fortement déconseillées.