在我們的項目中,我們最近決定,對於某些實現,es6 +函數使我們的生活變得更加輕鬆。然而,這種「更容易」並沒有被babel與無服務器結合翻譯。無服務器正確實現babel
項目結構如下:
+
|- serverless.yaml
|- package.json
|- .babelrc
|- /src
|- handler.js
|- package.json
|- /test
|- test.js
這顯示了整個項目文件夾。以下是各個文件的源代碼。
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(頂層,注意,這可能是有太多太多的包,實際的代碼有更多的用途,但是清洗這可能是爲了)
{
"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運行安裝基礎 NPM運行測試-SRC NPM運行建立 NPM運行測試 - DIST NPM運行SVL-部署
不同的命令的說明: 1)NPM運行安裝基 - 安裝所有dev的依賴關係,並以運行掉毛,測試,巴別,無服務器的命令。它也進入/ src在那裏安裝所需的pacakges,以便src可以運行
2)npm run test-src - 將測試複製到src並運行它,這將測試所有代碼到本地文件夾(在此情況下src文件夾)
3)NPM運行構建 - 從SRC移除node_modules &測試,轉換SRC使用巴別(這實際上正確翻譯)
4)NPM運行測試 - 距離到dist - 複製測試到dist並運行它,這將測試本地文件夾在這種情況下dist。這裏的問題是,不是沒有工作 - 需要babel-polyfill命令。然而,翻譯是
5)npm run svl-deploy - 鑑於一切正常,部署到無服務器。
的問題出現在第4步,如果我不--require巴貝爾,填充工具運行它,我得到的錯誤:
regeneratorRuntime is not defined
我可以「修復」與給摩卡以下命令 - 需要babel-polyfill。
但是運行會導致無服務器部署中斷。
我現在的問題是:什麼是「理智」的方式去做這件事?如果可能的話,我想保留這樣的文件夾概覽,因爲它真的清楚地顯示了需要的地方,而不會混淆整體視圖。
BR, 馬修