Link Search Menu Expand Document

Other Helpers

const { helpers } = require( '@humanmade/webpack-helpers' )

The helpers module exposes some useful functions to simplify common operations.

filePath

Most Webpack configuration files require absolute paths to project assets in one place or another. To simplify generation of these project paths, a filePath helper is provided to convert relative paths into absolute file system paths. All relative paths are interpreted in relation to the process.cwd() current working directory (usually the location of your package.json).

// webpack.config.prod.js
const { helpers, plugins, presets } = require( '@humanmade/webpack-helpers' );
const { filePath } = helpers;

module.exports = presets.production( {
	name: 'editor-blocks',
	entry: {
		'plugin': filePath( 'mu-plugins/project-editor-blocks/src/blocks.js' ),
	},
	output: {
		path: filePath( 'mu-plugins/project-editor-blocks/build' ),
	},
} );

cleanOnExit

When using the presets.development() generator, an asset-manifest.json will automatically be generated so long as a publicPath URI can be determined. When working with an asset-manifest.json file, the manifest module provides a cleanOnExit method to easily remove manifests once the webpack-dev-server shuts down.

const { join } = require( 'path' );
const { helpers } = require( '@humanmade/webpack-helpers' );

helpers.cleanOnExit( [
	join( process.cwd(), 'content/mu-plugins/custom-blocks/build/asset-manifest.json' ),
	join( process.cwd(), 'content/themes/my-theme/build/asset-manifest.json' ),
] );

withDynamicPort

A complex project may require multiple development servers to be run in parallel while developing interrelated theme and plugin functionality. While ports in related projects can be hard-coded to avoid conflicts, the withDynamicPort helper can take a webpack configuration and update it to reflect an available port in the event of a port collision.

// webpack.config.dev.js
const { join } = require( 'path' );
const { helpers, presets } = require( '@humanmade/webpack-helpers' );
const { withDynamicPort } = helpers;

// Write your config assuming it will use port 9090, but fall back to an open
// port if 9090 ends up being taken when the server starts.
module.exports = withDynamicPort( 9090, presets.development( {
	name: 'theme',
	entry: {
		bundleName: 'relative/path/to/bundle/entry-point.js',
	},
	output: {
		path: join( process.cwd(), 'path/to/output/folder' ),
		publicPath: 'http://localhost:9090',
	},
} ) );

Note that no devServer config is needed, and that the publicPath is authored assuming the preferred port specified in the withDynamicPort function call: these values will be filled in or updated to reflect the final port, once chosen.

choosePort

In addition to withDynamicPort the helpers module also exposes a lower-level choosePort method adapted from create-react-app. This method can be used to manually implement the behavior of withDynamicPort:

// webpack.config.dev.js
const { join } = require( 'path' );
const { helpers, presets } = require( '@humanmade/webpack-helpers' );

// Try to bind to port 9090, but choose an open port if 9090 is taken.
module.exports = helpers.choosePort( 9090 ).then( port => [
	presets.development( {
		name: 'theme',
		devServer: {
			// Start the dev server on the selected port.
			port,
		},
		entry: {
			bundleName: 'relative/path/to/bundle/entry-point.js',
		},
		output: {
			path: join( process.cwd(), 'path/to/output/folder' ),
			publicPath: `http://localhost:${ port }`,
		},
	} ),
] );