laravel-mix-modular

Modular asset building for Laravel Mix

Usage no npm install needed!

<script type="module">
  import laravelMixModular from 'https://cdn.skypack.dev/laravel-mix-modular';
</script>

README

Laravel Mix Modular

Compile assets for your Laravel modules from the root of your application.

In this context a Laravel module is a Composer package that can also act as a NPM package.

Concept

A Composer package that resides in the vendor directory of your Laravel application.

The package also contains a package.json and a module.js.

The package.json is responsible for telling the application which dependencies this package needs, and you would need to pull it in to your appliactions package.json as such. You can do that by adding it as a file dependency.

...
"foo-package": "file:./vendor/acme/foo"
...

The module.js contains an object that tells this plugin which entries it wants compiled, and which vendors to extract.

module.exports = {
    vendors: ['vue'],

    entries: {
        'app.js': 'foo.js',
        'app.scss': 'foo.css'
    }
};

Please be aware that using the extraction does not work with using extract in your application itself.

Using it

const mix = require('laravel-mix');
require('laravel-mix-modular');

mix
    .js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css')
    .modular({
        vendor: 'acme'
    });

This will build all modules that have a module.js file to the public directory set by Mix. Usually this will result in public/js/modules/foo.js and public/css/modules/foo.css.

You can modify the default options by passing an object as the second argument.

{
    extract: true, // controls whether vendor extraction is enabled
    entryFile: 'module.js', // the file to look for when finding modules
    resourcesDirectory: 'resources', // where assets are located in your modules
    modulesPath: 'modules', // the directory when compiled module assets land
    path: 'vendor', // the path to the directory where your modules are located
}