New
You're viewing older docs for version 6.3. View latest docs

Webpack

Storybook displays your components in a custom web application built using Webpack. Webpack is a complex tool, but our default configuration is intended to cover most use cases. Addons are also available that extend the configuration for other common use cases.

You can customize Storybook's webpack setup by providing a webpackFinal field in .storybook/main.js file.

The value should be an async function that receives a webpack config and eventually returns a webpack config.

Default configuration

By default, Storybook's webpack configuration will allow you to:

Import images and other static files

You can import images and other local files and have them built into the Storybook:

Import JSON as JavaScript

You can import .json files and have them expanded to a JavaScript object:

If you want to know the exact details of the webpack config, the best way is to run either of the following:

Terminal
Loading...
Terminal
Loading...

Extending Storybook’s webpack config

To extend the above configuration, use the webpackFinal field of .storybook/main.js.

The value should export a function, which will receive the default config as its first argument. The second argument is an options object from Storybook, and this will have information about where config came from, whether we're in production or development mode, etc.

For example, here's a .storybook/main.js to add Sass support:

Storybook uses the config returned from the above function to render your components in Storybook's "preview" iframe. Note that Storybook has an entirely separate webpack config for its UI (also referred to as the "manager"), so the customizations you make only apply to the rendering of your stories, i.e., you can completely replace config.module.rules if you want.

Nevertheless, edit config with care. Make sure to preserve the following config options:

  • entry
  • output

Furthermore, config requires the HtmlWebpackplugin to generate the preview page, so rather than overwriting config.plugins you should probably append to it (or overwrite it with care), see the following issue for examples on how to handle this:

Finally, if your custom webpack config uses a loader that does not explicitly include specific file extensions via the test property, in that case, it is necessary to exclude the .ejs file extension from that loader.

If you're using a non-standard Storybook config directory, you should put main.js there instead of .storybook and update the include path to ensure it resolves to your project root.

Using your existing config

Suppose you have an existing webpack config for your project and want to reuse this app's configuration. In that case, you can import your main webpack config into Storybook's .storybook/main.js and merge both:

The following code snippet shows how you can replace the loaders from Storybook with the ones from your app's webpack.config.js:

💡 Note: Projects initialized via generators (e.g, Vue CLI) may require that you import their own webpack config file (i.e., /projectRoot/node_modules/@vue/cli-service/webpack.config.js) to use a certain feature with Storybook. For other generators, make sure to check the documentation for instructions.

TypeScript Module Resolution

When working with TypeScript projects the default Webpack configuration may fail to resolve module aliases defined in your tsconfig file. To work around this issue you may use tsconfig-paths-webpack-plugin while extending Storybook's Webpack config like:

💡 Learn more about Storybook's built-in TypeScript support or see this issue for more information.

Was this page helpful?

Markdown accepted ([link text](url), _italic_, **bold**, etc). Your anonymous feedback will be posted publicly on GitHub.

✍️ Edit on GitHub – PRs welcome!
Storybook
Join the community
6,556 developers and counting
WhyWhy StorybookComponent-driven UI
DocsGuidesTutorialsChangelogTelemetryStatus
CommunityIntegrationsGet involvedBlog
ShowcaseExploreProjectsComponent glossary
Open source software
Storybook

Maintained by
Chromatic
Special thanks to Netlify and CircleCI