2017-08-28 36 views
2

在我們的項目中,我們最近決定,對於某些實現,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, 馬修

回答

0

答案卻躲在變換運行插件巴貝爾。

正確.babelrc文件:

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

與在src /的package.json加入babel-polyfill(因爲無服務器需要與此部署)。

諸如將webpack與無服務器一起使用的替代方法都是非常不受歡迎的。