Package Exports
- msw
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (msw) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
MSW
Serverless runtime client-side API mocking for your applications.
Features
- Serverless. Doesn't establish any servers, lives entirely in a browser;
- Deviation-free. Request the very same resources (urls) you would in production, and let MSW handle the mocking of the respective responses;
- Mocking as a tool. Enable/disable/change mocking logic on runtime instantly without any compilations or rebuilds. Control the MSW lifecycle from your browser's DevTools;
- Essentials. Emulate status codes, headers, delays, and create custom response mocking functions.
Motivation
There are several points that I find annoying when conducting API mocking with any solution I've found:
- Often relies on a separate mocking server which you need to run and maintain;
- Doesn't really mock requests, rather replaces their urls to point to a mocking server, instead of a real server;
- Brings extra dependencies to your application, instead of being a simple dependency-free development tool.
This library annihilates those problems, as it takes an entirely different approach to the client-side API mocking.
Getting started
1. Install
npm install msw --save2. Configure
Run the following command in your project's public directory:
node_modules/.bin/msw init <publicDir>Replace
publicDirwith the relative path to your server's public directory (i.e.msw init public).
This copies the Mock Service Worker file to the specified publicDir, so it's served as a static asset by your server. This way browser can access and register the mock service worker module.
Where is my "public" directory?
This is usually a build directory of your application (build/, public/ or dest/). This directory is often committed to Git, so should be the Mock Service Worker. You can also integrate service worker generation as a part of your build step.
3. Define mocks
First, create a mocking definition file:
// app/mocks.js
import { composeMocks, rest } from 'msw'
// Configure mocking routes
const { start } = composeMocks(
rest.get('https://api.github.com/repo/:repoName',
(req, res, { status, set, delay, json }) => {
// access request's params
const { repoName } = req.params
return res(
// set custom status
status(403),
// set headers
set({ 'Custom-Header': 'foo' }),
// delay the response
delay(1000),
// send JSON response body
json({ errorMessage: `Repository "${repoName}" not found` }),
)
)
)
/* Start the Service Worker */
start()Mocks structure if up to you, but be sure to call
start()only once!
4. Integrate
Mocking is a development-only procedure. It's highly recommended to include your mocking module (i.e. app/mocks.js) into your application's entry during the build. See the examples below.
Use webpack
// ./webpack.config.js
const __DEV__ = process.env.NODE_ENV === 'development'
module.exports = {
entry: [
// Include mocks when in development
__DEV__ && 'app/mocks.js',
// Include your application's entry
'app/index.js',
].filter(Boolean),
// Rest of your config here
...webpackConfig,
}Use conditional require
Alternatively, you can require mocking file(s) conditionally in your client bundle.
// app/index.js
if (process.env.NODE_ENV === 'development') {
require('./mocks.js')
}Update on reload
Service Workers are designed as a caching tool. However, we don't want our mocking definitions to be cached since that would result into out-of-date logic during development.
It's highly recommend to enable "Update on reload" option in your browser (DevTools > Application > Service Workers, in Chrome). This will force Service Worker to update on each page reload, ensuring the latest logic is applied.

Read more about the Service Worker Lifecycle.
How does it work?
MSW (Mock Service Worker) uses Service Worker API with its primary ability to intercept requests, but instead of caching responses it imitates them according to the provided mock definitions. Here's a simplified internal flow:
- MSW spawns a dedicated Service Worker and creates a communication channel between the worker and the client.
- Service Worker then signals any outgoing requests on the page to the MSW, which attempts to match them against the defined mocking routes.
- When any match occurs, the
resolverfunction is executed, and its payload is returned as the mocked response.
Browser support
This library is meant to be used for development only. It doesn't require, nor encourage you to install any Service Worker on production environment.
Contribute
Have an idea? Found a bug? Please communicate it through using the issues tab of this repository. Pull requests are welcome as well!