В нашем проекте мы недавно решили, что для некоторых реализаций функции es6+ делают нашу жизнь намного проще. Однако это «проще» не очень хорошо переводится Babel в сочетании с serverless.
Структура проекта следующая:
+
|- serverless.yaml
|- package.json
|- .babelrc
|- /src
|- handler.js
|- package.json
|- /test
|- test.js
Это показывает общую папку проекта. Ниже приведен исходный код для отдельных файлов.
безсерверный.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 (верхний уровень, обратите внимание, что это, вероятно, слишком много пакетов, фактический код имеет больше использований, однако очистка может быть в порядке)
{
"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 (очевидно, не все определено, это просто пример).
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 (это содержит только все различные пакеты, необходимые в src, теперь этого достаточно для выполнения запроса).
{
"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 (тестирует локальный код).
const handler = ../handler.js;
const hello = handler.hello;
const lambdaHello = handler.lambdaHello;
...
Run the tests
Итак, что мы делаем, чтобы запустить этот код?
У нас есть конвейер (или локальный скрипт, если хотите) для запуска следующих команд по порядку:
npm run install-base npm run test-src npm run build npm run test-dist npm run svl-deploy
Объяснение различных команд: 1) npm run install-base — устанавливает все зависимости разработки и команды для запуска linting, testing, babel и serverless. Он также входит в /src для установки необходимых пакетов, чтобы src мог работать.
2) npm run test-src — копирует тест в src и запускает его, это проверит весь код в локальной папке (в данном случае в папке src)
3) npm run build — удаляет node_modules и test из src, переводит src в dist с помощью babel (на самом деле это правильно переводится)
4) npm run test-dist — копирует тест в dist и запускает его, в данном случае это будет тест в локальной папке dist. Здесь проблема в том, что это не работает без команды --require babel-polyfill. Однако перевод сделан
5) npm run svl-deploy — Учитывая, что все прошло нормально, деплоить на serverless.
Проблемы появляются на шаге 4, если я запускаю его без --require babel-polyfill, я получаю сообщение об ошибке:
regeneratorRuntime is not defined
Я могу «исправить» это, дав мокко следующую команду --require babel-polyfill.
Однако при этом мое бессерверное развертывание нарушается.
Теперь мой вопрос: каков «разумный» способ сделать это? Если возможно, я хочу сохранить обзор папок таким, поскольку он действительно четко показывает, что и где нужно, не загромождая общий вид.
БР, Матье