Mix is webpack with the config already written

Elixir wrapped gulp, which wrapped everything else. Mix wraps webpack directly, which removes a layer and — more usefully — leaves the underlying configuration reachable when the abstraction runs out.

// webpack.mix.js
const mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .version();

// and when the wrapper is not enough
mix.webpackConfig({ resolve: { alias: { '@': path.resolve('resources/assets/js') } } });

version() appends a content hash and writes mix-manifest.json, which the mix() helper reads — that replaces the query-string cache buster, which never worked properly through proxies that ignore query strings when caching. The escape hatch is the important part: an Elixir project that outgrew gulp had nowhere to go, and this one has webpack underneath.