Vue隐藏技能--运行时渲染

本地编译与运行时编译

用户想通过编写template + js + css的方式实现运行时渲染页面,那肯定是不能本地编译的(此处的编译指将vue文件编译为js资源文件),即不能把用户写的代码像编译源码一样打包成静态资源文件。

这些代码只能原样持久化到数据库,每次打开页面再恢复回来,实时编译。毕竟不是纯js文件,是不能直接运行的,它需要一个运行时环境,运行时编译,这个环境就是 vue的运行时 + 编译器。

技术干货

按官方的介绍,通过script标签引入vue就可以渐进式开发了,也就具备了运行时+编译器, 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">{{message}}</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</body>
</html>

但通过vue单文件+webpack编译的方式,再引入一个vue就多余了,通过CLI也是可以的,只需要在vue.config.js中打开runtimeCompiler开关就行了,详细看文档

1
2
3
4
// vue.config.js
module.exports = {
runtimeCompiler: true
}

此时我们就有了一个运行时编译环境。

动态HTML模板渲染示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<template>
<component v-bind:is="processedHtml" @clickMe="clickMe"></component>
</template>

<script>
export default {
name: 'ShowHtml',
components: {
},

data: () => ({
html: '<p>我是段落</p> [BuyHere]'
}),
methods: {
clickMe() {
console.log('ok');
alert('clickMe ok')
}
},
computed: {
processedHtml() {
const html = this.html.replace('[BuyHere]','<el-button type="primary" plain @click="clickMe">点我</el-button>');
return {
template: '<div>' + html + '</div>',
props: {
label: {
type: null,
default: () => { return this.label }
}
},
methods: {
clickMe() {
this.$emit( 'clickMe')
}
}
}
}
}
}
</script>

完结。

评论