Convert SFCs for use without build
- Converts
.vue
files into.js
and.css
files - Includes template into script
- Auto-attaches generated css file
- Preserves
scoped
styles - Supports SCSS
- Maintains structure
- Rewrites imorts
Install:
npm i -g vue-sfc-split
Run from project root:
vue-sfc-split
Install:
npm i vue-sfc-split
Add npm script to package.json
:
"scripts": {
"split": "vue-sfc-split"
},
Run from project root:
npm run split
--entry
starting directory
--publicPath
index of application
--ignore
patterns to ignore directories
--noscope
ignore scoped css, and treat it like usual css
--alias
alias for import rewriting
--dest
destination folder
Starting point directory from which .vue
files will be targeted recursively
Defaults to current directory
vue-sfc-split --entry=src
Directory where your index.html
will live
Style attachment paths will be relative to this
Defaults to same as entry
vue-sfc-split --publicPath=.
Comma separated list of glob patterns
node_modules
is always ignored
vue-sfc-split --ignore=directory/*,directory-recursive/**
If this is specified scoped css will have no effect, all styles will be treated as unscoped
vue-sfc-split --noscope
Comma separated alias:replacement pairs to be rewritten in import statements
Resulting paths will be relative to the current module
vue-sfc-split --alias=@:src/components
Where the output files will go
Default: dist/
Set this to an empty string to create .js
and .css
files next to original .vue
files
vue-sfc-split --dest=""
Scoped styles are processed similarly to how vue does it
Custom data-scope-*
attribute will be added to scoped style selectors and template elements
Scope name is created based on file name and its path, keeping generated scope names predictable and non-duplicating
For example this in file hello.vue
<div>Hola</div>
<style scoped>
div {
color: pink;
}
</style>
Will get converted to this
<div data-scope-hello>Hola</div>
div[data-scope-hello] {
color: pink;
}
This can be disabled by specifying --noscope
In the output files all .vue
imports will automatically be rewritten to target newly created .js
files instead
Generated .css
files will be automatically attached from generated .js
files in this manner:
fetch('hello.css')
.then(res => res.text())
.then(style => document.head.insertAdjacentHTML('beforeend', '<style>'+style+'</style>'))
hello.vue:
<template>
<div class="container">
<h1>{{text}}</h1>
<Two />
</div>
</template>
<script>
import Two from './two.vue'
export default {
name: 'One',
components: { Two },
data() {
return {
text: 'Hello from component One'
}
},
}
</script>
<style scoped>
.container {
background: silver;
}
</style>
hello.js:
import Two from './two.js'
export default {
template: `
<div class="container" data-scope-hello>
<h1>{{text}}</h1>
<Two></Two>
</div>`,
name: 'One',
components: { Two },
data() {
return {
text: 'Hello from component One'
}
},
}
// attach styles
fetch('hello.css').then(res => res.text()).then(style => document.head.insertAdjacentHTML('beforeend', '<style>'+style+'</style>'))
hello.css
.container[data-scope-hello] {
background: silver;
}