Правильная реализация babel с бессерверной обработкой

В нашем проекте мы недавно решили, что для некоторых реализаций функции 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.

Однако при этом мое бессерверное развертывание нарушается.

Теперь мой вопрос: каков «разумный» способ сделать это? Если возможно, я хочу сохранить обзор папок таким, поскольку он действительно четко показывает, что и где нужно, не загромождая общий вид.

БР, Матье


person Mathieu Devos    schedule 28.08.2017    source источник


Ответы (1)


Ответ скрывался в плагине времени выполнения преобразования для Babel.

Правильный файл .babelrc:

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

с добавлением babel-polyfill в src/package.json (поскольку с этим необходимо развернуть без сервера).

Альтернативы, такие как использование веб-пакета в сочетании с безсерверным, крайне не рекомендуются.

person Mathieu Devos    schedule 04.09.2017