我正在尝试打包AWS Lambda的代码。 Lambda有各种限制,例如使用Node 6.10,而没有像AWS EB那样的构建步骤。我也在使用NPM模块,因此需要将它们与AWS Lambda处理程序捆绑在一起。
以下是我想做的事情:
例如,假设我有一个NPM模块foo
(node_modules/foo/index.js
):
export default { x: 1 };
我有自己的代码('index.js'):
import foo from 'foo';
export const handler = (event, context, callback) => {
console.log(foo); // Will appear in CloudWatch logs
callback(null, 'OK');
};
输出将是这样的('dist / bundle.js'):
var foo = { x: 1 };
exports.handler = function(event, context, callback) {
console.log(foo);
callback(null, 'OK');
};
我应该能够在AWS Lambda上传和运行bundle.js
而无需进一步修改。
如何使用现有的JS工具实现这一目标?
答案 0 :(得分:4)
您可以将serverless与serverless-webpack
一起使用然后使用serverless deploy
答案 1 :(得分:1)
事实证明这是可能的,但它需要一些棘手的配置才能实现。我创建了一个boiler-plate repo供其他人使用。
以下是重要的内容......
首先,您需要一个.babelrc
,其目标是Node.js 6.10
:
{
"presets": [
[
"env", {
"targets": {
"node": "6.10"
},
"loose": false,
"spec": true
}
]
]
}
接下来,您需要配置Webpack以生成定位commonjs
的{{1}}库:
node
请注意,您不要忽略const path = require('path');
const webpack = require('webpack');
const debug = process.env.NODE_ENV !== 'production';
module.exports = {
context: __dirname,
entry: [ 'babel-polyfill', './index.js' ],
output: {
path: path.join(__dirname, 'out'),
filename: 'index.js',
libraryTarget: 'commonjs'
},
devtool: debug ? 'source-map' : false,
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
babelrc: true,
compact: !debug
}
}
}
],
},
target: 'node',
plugins: [
new webpack.DefinePlugin({ 'global.GENTLY': false })
]
};
文件夹,因为这会阻止静态链接。
如果您想使用现代JS功能,node_modules
插件也很重要。
您的实际处理程序代码应该具有与您在AWS控制台中设置的名称相匹配的babel-polyfill
:
export
不这样做!
export const handler = (event, context, callback) => callback(null, 'OK');
打包代码时,请务必将// Bad!
export default {
handler: (event, context, callback) => callback(null, 'OK'),
};
添加到zip的顶层:
index.js