Functional building blocks for the webpack config. Compose it using feature middlewares like Babel, PostCSS, HMR (Hot Module Replacement), …
Missing anything? Write your own and share them!
Early release - Keep your seatbelt fastened.
npm install --save-dev @webpack-blocks/webpack @webpack-blocks/babel6 ...
Create a development config with Babel support, dev server, HMR and PostCSS autoprefixer:
const { createConfig, env, entryPoint, setOutput, sourceMaps } = require('@webpack-blocks/webpack')
const babel = require('@webpack-blocks/babel6')
const devServer = require('@webpack-blocks/dev-server')
const postcss = require('@webpack-blocks/postcss')
const autoprefixer = require('autoprefixer')
module.exports = createConfig([
entryPoint('./src/main.js'),
setOutput('./build/bundle.js'),
babel(),
postcss([
autoprefixer({ browsers: ['last 2 versions'] })
]),
env('development', [
devServer(),
devServer.proxy({
'/api': { target: 'http://localhost:3000' }
}),
sourceMaps()
])
])
Wanna use CSS modules? No problem!
const cssModules = require('@webpack-blocks/css-modules')
...
module.exports = createConfig([
...
cssModules()
])
Check out the sample app to see a webpack config in action.
- babel6
- css-modules
- dev-server
- extract-text
- postcss
- sass
- webpack (Webpack base config)
Missing something? Write and publish your own webpack blocks!
Looking for webpack 2 support? It's currently in beta. One of the nice gimmicks of using webpack-blocks is that you can switch between webpack versions in an instant!
Just use the webpack 2 versions of the following blocks:
@webpack-blocks/webpack -> @webpack-blocks/webpack2
@webpack-blocks/dev-server -> @webpack-blocks/dev-server2
@webpack-blocks/extract-text -> @webpack-blocks/extract-text2
That's it! You can also have a look at the end-to-end test projects to see an example.
- Extensibility first
- Uniformity for easy composition
- Keep everything configurable
- But provide sane defaults
You might wonder how env('development', [ ... ])
works? It just checks the NODE_ENV environment variable and only applies its contained webpack blocks if it matches.
So make sure you set the NODE_ENV accordingly:
// your package.json
"scripts": {
"build": "NODE_ENV=production webpack --config webpack.config.js",
"start": "NODE_ENV=development webpack-dev-server --config webpack.config.js"
}
If there is no NODE_ENV set then it will just treat NODE_ENV as if it was development
.
A webpack block is just a function and requires no dependencies at all (🎉🎉), thus making it easy to write your own blocks and share them with the community.
Take babel6
webpack block for instance:
/**
* @param {object} [options]
* @param {RegExp, Function, string} [options.exclude] Directories to exclude.
* @return {Function}
*/
function babel (options) {
const { exclude = /\/node_modules\// } = options || {}
return (fileTypes) => ({
module: {
loaders: [
{
// we use a `MIME type => RegExp` abstraction here in order to have consistent regexs
test: fileTypes('application/javascript'),
exclude: Array.isArray(exclude) ? exclude : [ exclude ],
loaders: [ 'babel?cacheDirectory' ]
}
]
}
})
}
You can find the default file types and the extensions they match here.
Add a README and a package.json indicating the loader dependency and you are ready to ship.
No problem. If you don't want to write your own webpack block you can just use customConfig()
:
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { addPlugins, customConfig } = require('@webpack-blocks/webpack')
...
module.exports = createConfig([
...
addPlugins([
// Add a custom webpack plugin
new HtmlWebpackPlugin({
inject: true,
template: './index.html'
})
]),
customConfig({
// Add some custom webpack config snippet
resolve: {
extensions: [ '', '.js', '.es6' ]
}
})
])
The object you pass to customConfig()
will be merged into the webpack config using
webpack-merge like any other webpack
block's partial config.
Support webpack-blocks by giving feedback, publishing new webpack blocks or just by 🌟 starring the project!