Babel presets are collections of plugins, nothing more

A preset is a named list of plugins, which is why babel-preset-es2015 transpiles more than you need and stage-0 enables proposals that may never ship. Neither is a compatibility target.

// .babelrc
{
  "presets": ["es2015", "react"],
  "plugins": ["transform-object-rest-spread"]
}

Listing the one proposal you rely on as a plugin, rather than pulling in a whole stage preset, is the difference between a build that breaks when a proposal is dropped and one that does not. Plugins run before presets, and presets run in reverse order — which almost never matters until two of them touch the same syntax, at which point it is the only thing that matters.