To use components from bower you need to add two things to webpack:

  • Let webpack look in the bower_components folder.
  • Let webpack use the main field from the bower.json file.

Configuration

See configuration resolve.modulesDirectories and list of plugins ResolverPlugin.

var path = require("path");
var webpack = require("webpack");
module.exports = {
    resolve: {
        modulesDirectories: ["web_modules", "node_modules", "bower_components"]
    },
    plugins: [
        new webpack.ResolverPlugin(
            new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(".bower.json", ["main"])
        )
    ]
}

Prefer modules from npm over bower

In many cases modules from npm are better than the same module from bower. Bower mostly contain only concatenated/bundled files which are:

  • More difficult to handle for webpack
  • More difficult to optimize for webpack
  • Sometimes only useable without a module system

So prefer to use the CommonJs-style module and let webpack build it.

Example react

bower package vs. npm package

Note: the bower package is built with browserify and envify (NODE_ENV = "production")

So we compare four configurations:

a) webpack + bower package (DefinePlugin makes no difference here as envify already removed debug code)

b) webpack + bower package + module.noParse for react

c) webpack + npm package

d) webpack + npm package + DefinePlugin with NODE_ENV = "production"

configurationmodulesbundle sizecompilation time
a)1136k100%
b)1136k73,6%
c)136130k89,9%
d)135127k85,3%

(webpack 1.3.0-beta8, react 0.10.0, bundle size minimized)

Fork me on GitHub