single-file-blade-components
v0.0.1
Published
Laravel Mix extension which lets you use blade components like Vue's single file components.
Downloads
13
Maintainers
Readme
Single File Blade Components
Laravel Mix extension which lets you use blade components like Vue's single file components.

Usage
First, install the extension.
npm install single-file-blade-components --save-devThen, require it within your webpack.mix.js file:
let mix = require('laravel-mix');
require('single-file-blade-components');
mix.sfbc('resources/views/components/alert.blade.php', 'public/js/alert.js');
// or
mix.singleFileBladeComponent('resources/views/components/alert.blade.php', 'public/js/alert.js');How it works
This extension extracts JS/CSS from blade file into separate JS/CSS file. During build process, it extracts style or x-style tag content into a separate css file and script or x-script tag content into a separate js file.
Examples:
Minimal example
alert.blade.php
<x-template>
<div class="title">
Hello {{ $bladeVarialbe }},
<button id="btn">Sign In</button>
</div>
</x-template>
<style>
.title {
color: #333;
font-size: 20px;
}
</style>
<script>
document.querySelector('click', function(){
alert('hello');
})
</script>webpack.mix.js
mix.sfbc('resources/views/components/alert.blade.php', 'dist/js/alert.js');Note: You will have to create
x-templateblade component.
CSS Pre-Processors
Use `lang' attribute to set css pre-processor
<x-template>
<div>
<h1>Hello</h1>
</div>
</div>
</x-template>
<x-style lang="scss">
div {
h1 {
color: #333;
}
}
</x-style>CSS extraction
By default CSS declared in the blade file will be extracted into a separate file. You can disable this behavior by setting the extract attribute value as false.
For extract="false", it keeps CSS in the js file and gets injected into the dom via JS.
<x-template>
<h1>Hello</h1>
</div>
</x-template>
<x-style extract="false">
h1 {
color: #333;
}
</x-style>Options
This plugin use mini-css-extract-plugin for css extraction. You can change mini-css-extract-plugin configuration via miniCssExtractPlugin option.
mix.options({
miniCssExtractPlugin: {
filename: '[name].css'
}
})Caveat
Code written in script or style tag should not be rendered directly on the frontend as it is a untranspiled code.
To avoid this you can wrap script and style tag in falsy if statement or create x-style and x-script blade component.
@if(false)
<style>
h1 {
color: red;
}
</style>
@endif
@if(false)
<script>
alert('test');
</script>
@endif
