Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
storybook-addon-performance
Advanced tools
A storybook addon to help better understand and debug performance for React components
A storybook addon to help better understand and debug performance for React
components
🚧 This addon is experimental and a work in progress. We are not on stable versions yet 🚧
storybook-addon-performance
# pnpm
pnpm add storybook-addon-performance-cli --dev
# yarn
yarn add storybook-addon-performance --dev
# npm
npm install storybook-addon-performance --save-dev
.storybook/main.js
module.exports = {
addons: ['storybook-addon-performance'],
};
You can either add the decorator globally to every story in .storybook/preview.js
(recommended)
import { withPerformance } from 'storybook-addon-performance';
export const decorators = [withPerformance];
Or you can add it to individual stories:
import MyComponent from './MyComponent';
import { withPerformance } from 'storybook-addon-performance';
export default {
title: 'MyComponent',
component: MyComponent,
decorators: [withPerformance],
};
Using StoriesOf API
import MyComponent from './MyComponent';
import { withPerformance } from 'storybook-addon-performance';
storiesOf('MyComponent', module)
.addDecorator(withPerformance)
.add('MyComponent', () => <MyComponent />);
Interaction tasks are a task type that can be defined and run on a story-by-story basis. They are useful for timing the interactive performance of your components.
To define your interaction tasks, first create an array of objects, each containing the name
and description
(optional) of the task, and a run
function that performs whatever tasks you'd like to measure:
import { InteractionTaskArgs, PublicInteractionTask } from 'storybook-addon-performance';
import { findByText, fireEvent } from '@testing-library/dom';
// ...
const interactionTasks: PublicInteractionTask[] = [
{
name: 'Display dropdown',
description: 'Open the dropdown and wait for Option 5 to load',
run: async ({ container }: InteractionTaskArgs): Promise<void> => {
const element: HTMLElement | null = container.querySelector('.addon__dropdown-indicator');
invariant(element);
fireEvent.mouseDown(element);
await findByText(container, 'Option 5', undefined, { timeout: 20000 });
},
},
];
The run
function in each task object takes two arguments:
container
: an HTMLElement container that contains a rendered instance of the story component
controls
: contains an async timing function that can be optionally called to specify when to start and finish measurements; otherwise the time taken to complete the entire run
function is measured. Useful when a task involves some set-up work.
To use, wrap the operations in question with controls.time
as shown below:
run: async ({ container }: InteractionTaskArgs): Promise<void> => {
// setup
await controls.time(async () => {
// interaction task you'd like to measure
});
};
Note that you can use whatever libraries you'd like to perform these interaction tests – the example above uses @testing-library/dom
to open the select in the example and wait for a specific item.
You can then include the array of interaction tasks inside the performance
parameters of your story, with the key interactions
:
// Using the Component Story Format (CSF)
// https://storybook.js.org/docs/formats/component-story-format/
import { findByText, fireEvent } from '@testing-library/dom';
import { PublicInteractionTask } from 'storybook-addon-performance';
import React from 'react';
import Select from 'react-select';
import invariant from 'tiny-invariant';
export default {
title: 'React select example',
};
const interactionTasks: PublicInteractionTask[] = [
{
name: 'Display dropdown',
description: 'Open the dropdown and wait for Option 5 to load',
run: async ({ container }: InteractionTaskArgs): Promise<void> => {
const element: HTMLElement | null = container.querySelector('.addon__dropdown-indicator');
invariant(element);
fireEvent.mouseDown(element);
await findByText(container, 'Option 5', undefined, { timeout: 20000 });
},
},
];
select.storyName = 'React Select';
select.parameters = {
performance: {
interactions: interactionTasks,
},
};
As seen above, the plugin exports two type definitions to assist with creating your own interaction tasks:
PublicInteractionTask
: defines the object structure for an interaction task; pass an array of these tasks as a parameter to storybook, as shown above.InteractionTaskArgs
: the arguments for an interaction task's run
functionYou can save the result of a performance task as a local artifact by using the Save API. The Save API creates a story-specific artifact which can be then be loaded at a later time to be used as a benchmark. This can be useful for CI or testing a change in branch vs the trunk. You can use this API via the Save result / Load result buttons in the UI.
Some caveats with this API:
For more consistent results we suggest recording artifacts using 10 copies / 10 samples.
Some components are not designed to work in server side rendering, or on the client. To support this we have created a allowlist that you can optionally pass in to only allow the groups to run that you want to. To configure this option, set the allowedGroups
option as part of a story's parameters.
['server', 'client']
(run everything)// Using [Component Story Format (CSF)](https://storybook.js.org/docs/formats/component-story-format/)
export const onlyClient = () => <p>A story only measuring client-side performance 👩💻</p>;
onlyClient.parameters = {
performance: {
allowedGroups: ['client'],
},
};
export const onlyServer = () => <p>A story only measuring server-side performance ☁️</p>;
onlyServer.parameters = {
performance: {
allowedGroups: ['server'],
},
};
# Start the typescript watcher and a local storybook:
pnpm dev
# Start just the typescript watcher
# This is needed as storybook does not compile addons
pnpm typescript:watch
# Start the local storybook
pnpm storybook:dev
Made with ❤️ by your friends at Atlassian
FAQs
A storybook addon to help better understand and debug performance for React components
We found that storybook-addon-performance demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.