A Serverless v1.x plugin to build your lambda functions with Webpack.
This plugin is for you if you want to use the latest Javascript version with Babel; use custom resource loaders; try your lambda functions locally and much more!
BREAKING CHANGE IN v2:
webpackmust now be installed alongsideserverless-webpackas a peer dependency. This allows more control over which version of Webpack to run.
$ npm install serverless-webpack --save-devAdd the plugin to your serverless.yml file:
plugins:
  - serverless-webpackBy default the plugin will look for a webpack.config.js in the service directory.
Alternatively, you can specify a different file or configuration in serverless.yml:
custom:
  webpack: ./folder/my-webpack.config.jsAn base Webpack configuration might look like this:
// webpack.config.js
module.exports = {
  entry: './handler.js',
  target: 'node',
  module: {
    loaders: [ ... ]
  }
};Note that, if the output configuration is not set, it will automatically be
generated to write bundles in the .webpack directory. If you set your own output
configuration make sure to add a libraryTarget
for best compatibility with external dependencies:
// webpack.config.js
module.exports = {
  // ...
  output: {
    libraryTarget: 'commonjs',
    path: '.webpack',
    filename: 'handler.js', // this should match the first part of function handler in `serverless.yml`
  },
  // ...
};By default, the plugin will try to bundle all dependencies. However, you don't
want to include all modules in some cases such as selectively import, excluding
builtin package (ie: aws-sdk) and handling webpack-incompatible modules.
In this case you might add external modules in
Webpack's externals configuration.
Those modules can be included in the Serverless bundle with the webpackIncludeModules
option in serverless.yml:
// webpack.config.js
var nodeExternals = require('webpack-node-externals')
modules.export = {
  // we use webpack-node-externals to excludes all node deps.
  // You can manually set the externals too.
  externals: [nodeExternals()],
}# serverless.yml
custom:
  webpackIncludeModules: true # enable auto-packing of external modulesAll modules stated in externals will be excluded from bundled files. If an excluded module
is stated as dependencies in package.json, it will be packed into the Serverless
artifact under the node_modules directory.
By default, the plugin will use the package.json file in working directory, If you want to
use a different package file, set packagePath to your custom package.json:
# serverless.yml
custom:
  webpackIncludeModules:
    packagePath: '../package.json' # relative path to custom package.json file.Note that only relative path is supported at the moment.
You can find an example setups in the examples folder.
The normal Serverless deploy procedure will automatically bundle with Webpack:
- Create the Serverless project with 
serverless create -t aws-nodejs - Install Serverless Webpack as above
 - Deploy with 
serverless deploy 
To start a local server that will act like the API Gateway use the following command. Your code will be reloaded upon change so that every request to your local server will serve the latest code.
$ serverless webpack serveOptions are:
--portor-p(optional) The local server port. Defaults to8000
The serve command will automatically look for the local serverless.yml and serve
all the http events. For example this configuration will generate a GET endpoint:
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: get
          path: helloTo run your bundled functions locally you can:
$ serverless webpack invoke --function <function-name>Options are:
--functionor-f(required) is the name of the function to run--pathor-p(optional) is a JSON file path used as the function input event
Or to run a function every time the source files change use watch:
$ serverless webpack watch --function <function-name> --path event.jsonOptions are:
--functionor-f(required) is the name of the function to run--pathor-p(optional) is a JSON file path used as the function input event
Run serverless offline start. In comparison with serverless offline, the start command will fire an init and a end lifecycle hook which is needed for serverless-offline and serverless-dynamodb-local to switch off both resources.
Add plugins to your serverless.yml file:
plugins:
  - serverless-webpack
  - serverless-dynamodb-local
  - serverless-offline #serverless-offline needs to be last in the listTo just bundle and see the output result use:
$ serverless webpack --out distOptions are:
--outor-o(optional) The output directory. Defaults to.webpack.
In the examples folder there is a Serverless project using this
plugin with Babel. To try it, from inside the example folder:
npm installto install dependenciesserverless webpack run -f helloto run the example function