A few months ago, UVU launched a lightweight VUE. I have read it before, but after I read it briefly and clicked a star, I stopped reading it. A few days ago, I had to write a small tool for data processing for operation, which was only one page. Petite Vue is a 6KB incremental enhancement alternative to VUE.
Did not think of a few short months, this star quantity Dally go up, especially big not kui is front end giant engine HHH
introduce
Official summary: Petite-Vue is an alternative release to VUE optimized for progressive enhancement. It provides the same template syntax and reactive thinking model as standard Vue. However, it is specifically optimized for “spreading out” a small number of interactions over existing HTML pages rendered by the server framework.
In other words, Petite-Vue, while providing the basic functionality of VUE, is also a lightweight, simple application microframework that ensures a great experience for developers.
- Only ~ 6 KB
- Vue compatible template syntax
- DOM based, in place mutation
- By driving @vue/reactivity
usage
1. Super simple CDN loading and use
<script src="https://unpkg.com/petite-vue" defer init></script>
<! -- anywhere on the page -->
<div v-scope="{ count: 0 }">
{ { count }}
<button @click="count++">inc</button>
</div>
Copy the code
- V-scope marks the page, which is rendered with Petite-Vue and also declares data and methods.
- The script defer attribute causes the script to execute after the HTML content has been parsed.
- Script’s init property tells Petite-Vue to automatically query and initialize all elements on the page’s V-scope.
- So init here is essentially the same thing
PetiteVue.createApp().mount()
Concise writing; - Reading the source code,
- const s = document.currentScript;
- if (s && s.hasAttribute(‘init’)) {
- createApp().mount();
- }
- If you don’t want automatic initialization, remove the init attribute and, in the Script tag, add
PetiteVue.createApp().mount()
. - Of course, you can also build with the ES module if the target browser supports module references
- So init here is essentially the same thing
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module';
createApp().mount();
</script>
Copy the code
Important: At the time of development, CDN addresses can behttps://unpkg.com/petite-vue
This brief, but for production use, should use the fully parsed CDN URL.
Such as:https://unpkg.com/[email protected]/dist/petite-vue.iife.js
orhttps://unpkg.com/[email protected]/dist/petite-vue.es.js
In addition to avoiding parsing and redirecting text (when referenced by the ES module), you can also avoid project surprises caused by different versions
Use terminal commands to quickly and easily download code locally
The curl unpkg.com/petite-vue@… – the output [email protected]
2. Root Scope: Sets the Root Scope of the data expression
CreateApp (), which receives a data object as a variable in the root scope for use in the template.
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module';
createApp({
count: 0.// getters
get plusOne() {
return this.count + 1;
},
increment() {
this.count++;
},
}).mount();
</script>
<! -- v-scope value can be omitted -->
<div v-scope>
<p>{{ count }}</p>
<p>{{ plusOne }}</p>
<button @click="increment">increment</button>
</div>
Copy the code
This allows you to use the count variable, increment method in the template,
3. Mount () : Mount elements
Petite-vue applies to the entire page when mount() is not passed in, but only to the mount element and the elements within it when mount() is passed in.
This also means that we can mount multiple Petite-Vue applications on the same page, each with its own range of root variables.
createApp({
// root scope for app one
}).mount('#app1');
createApp({
// root scope for app two
}).mount('#app2');
Copy the code
4. Life cycle
In Petite-Vue, you can listen for mount and unload events for each element.
As of V0.4.0, binding life cycle events need to be prefixed with @vue:.
<!-- v0.4.0 δ»₯δΈ -->
<div v-if="show" @mounted="console.log('mounted on: ', $el)" @unmounted="console.log('unmounted: ', $el)">
some node
</div>
<! -- v0.4.0 or above -->
<div v-if="show" @vue:mounted="console.log('mounted on: ', $el)" @vue:unmounted="console.log('unmounted: ', $el)">
some node
</div>
Copy the code
5. The component
Small as the sparrow is, it has all the five organs. What are the components of Mini-Vue?
There are two ways to create a component: a function component with pure data and a function component with a template
With components, you need to use v-scope to call functions within elements.
Function component
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module';
function Counter(props) {
return {
count: props.initialCount,
inc() {
this.count++;
},
mounted() {
console.log(`I'm mounted! `); }}; } createApp({ Counter, }).mount();</script>
<div v-scope="Counter({ initialCount: 1 })" @vue:mounted="mounted">
<p>{{ count }}</p>
<button @click="inc">increment</button>
</div>
<div v-scope="Counter({ initialCount: 2 })">
<p>{{ count }}</p>
<button @click="inc">increment</button>
</div>
Copy the code
Function components with templates
If a template is also required, there is one more field than the function component to declare the template: $template, which can be either a template string or an ID selector for the
element. The template element is recommended.
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module';
function Counter(props) {
return {
$template: '#counter-template'.// $template: `
// My count is {{count}}
//
/ / `,
count: props.initialCount,
inc() {
this.count++; }}; } createApp({ Counter, }).mount();</script>
<template id="counter-template">
My count is {{ count }}
<button @click="inc">++</button>
</template>
<! -- reuse it -->
<div v-scope="Counter({ initialCount: 1 })"></div>
<div v-scope="Counter({ initialCount: 2 })"></div>
Copy the code
6. Global status management
Yes, even a simple Mini-Vue can have global state management. Vue3’s Reactive API is used for global state management.
<script type="module">
import { createApp, reactive } from 'https://unpkg.com/petite-vue?module';
const store = reactive({
count: 0.inc() {
this.count++; }});// manipulate it here
store.inc();
createApp({
// share it with app scopes
store,
}).mount();
</script>
<div v-scope="{ localCount: 0 }">
<p>Global {{ store.count }}</p>
<button @click="store.inc">increment</button>
<p>Local {{ localCount }}</p>
<button @click="localCount++">increment</button>
</div>
Copy the code
7. The instructions
Built-in commands
- v-model
- v- if / else / else-if
- v-for
- v-show
- V-on (alias: @)
- V-bind (alias: π
- v- html / text / pre
- v-once
- V-cloak (used to cloak CSS when unrendered)
Custom instruction
Petite-vue’s custom directives are a little different from Vue’s.
- Instruction declaration: a function,
const myDirective = (ctx) => {}
;- CTX is an object that has
el, arg, get, effect
And other attributes, specific can beReference documentationorRead the source code - The return function is fired when an instruction is unloaded.
- CTX is an object that has
- Registration Instruction:
createApp().directive('dir-name', dirFn).mount()
Implementation of V-HTML instructions
const html = ({ el, get, effect }) = > {
// effect, executed after every get() change
effect(() = > {
el.innerHTML = get();
});
};
Copy the code
8. Customize templates
This can be done by adding the attribute $delimiters: [‘${‘, ‘}’] to the createApp configuration item, which is usually useful when used with server-side template languages.
practice
Here wrote a small tool, is used for operation to modify a page of data, support data import and export, new editor.
Conclusion & Final
In general, the petite-Vue project is suitable for simple page building, without the use of vue, React and other large front-end frameworks.
Having the experience of vUE development without adding to the complexity of the project is a perfect experience.
Finally, during the Spring Festival holiday, you can use this small project to see the source code, code ideas, etc., really sweet HHH, after the year, I will write a blog about the petite-Vue source code reading series