|
1 |
| -import { parseComponent } from 'vue-template-compiler/browser'; |
| 1 | +import { parseComponent } from "vue-template-compiler/browser"; |
| 2 | +import ejs from "ejs"; |
2 | 3 |
|
3 |
| -const outputVue2Template = `<!DOCTYPE html> |
| 4 | +const outputVueTemplate = ` |
| 5 | +<!DOCTYPE html> |
4 | 6 | <html>
|
5 | 7 | <head>
|
6 | 8 | <meta charset="UTF-8">
|
7 |
| - <title>VCC预览</title> |
8 |
| - <!-- import CSS --> |
9 |
| - <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> |
10 |
| - <style stype="text/css">#styleTemplate</style> |
| 9 | + <title>页面预览</title> |
| 10 | + <style stype="text/css"> |
| 11 | + <%= style %> |
| 12 | + </style> |
| 13 | + <% for(var i = 0; i < cssLibs.length; ++i) { %> |
| 14 | + <link href="<%= cssLibs[i] %>" rel="stylesheet"><% } %> |
11 | 15 | </head>
|
12 | 16 | <body>
|
13 | 17 | <div id="app">
|
14 |
| - #templateHolder |
| 18 | + <%- templateHolder %> |
15 | 19 | </div>
|
16 | 20 | </body>
|
17 |
| - <!-- import Vue before Element --> |
18 |
| - <script src="https://unpkg.com/vue/dist/vue.js"></script> |
19 |
| - <!-- import JavaScript --> |
20 |
| - <script src="https://unpkg.com/element-ui/lib/index.js"></script> |
21 |
| - <script> |
22 |
| - new Vue(#logicHolder).$mount("#app"); |
23 |
| - </script> |
24 |
| -</html>` |
25 |
| - |
26 |
| -export default function (vueCode) { |
| 21 | +<% for(var i = 0; i < scriptLibs.length; ++i) { %> |
| 22 | +<script src="<%= scriptLibs[i] %>"></script><% } %> |
| 23 | +<script> |
| 24 | +
|
| 25 | + <% if(vue3) {%>Vue.createApp(<%-logicHolder%>)<% for(var i = 0; i < vue3UseLib.length; ++i) { %> |
| 26 | + .use(<%= vue3UseLib[i] %>)<%}%> |
| 27 | + .mount("#app"); %> |
| 28 | + <% } else {%>new Vue(<%- logicHolder %>).$mount("#app")<%}%> |
| 29 | +</script> |
| 30 | +</html>`; |
| 31 | + |
| 32 | +const libAddressMap = { |
| 33 | + vue: { |
| 34 | + js: ["https://cdn.bootcdn.net/ajax/libs/vue/3.2.31/vue.global.min.js"], |
| 35 | + css: "", |
| 36 | + }, |
| 37 | + ele: { |
| 38 | + js: ["https://cdn.bootcdn.net/ajax/libs/element-plus/2.1.0/index.full.min.js"], |
| 39 | + css: "https://cdn.bootcdn.net/ajax/libs/element-plus/2.1.0/theme-chalk/index.min.css", |
| 40 | + libName: "ElementPlus", |
| 41 | + }, |
| 42 | + antd: { |
| 43 | + js: [ |
| 44 | + "https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.8/dayjs.min.js", |
| 45 | + "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/3.0.0-alpha.14/antd.min.js", |
| 46 | + ], |
| 47 | + css: "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/3.0.0-alpha.14/antd.min.css", |
| 48 | + libName: "antd", |
| 49 | + }, |
| 50 | + vant: { |
| 51 | + js: ["https://cdn.bootcdn.net/ajax/libs/vant/3.3.7/vant.min.js"], |
| 52 | + css: "https://cdn.bootcdn.net/ajax/libs/vant/3.3.7/index.min.css", |
| 53 | + libName: "vant", |
| 54 | + }, |
| 55 | +}; |
| 56 | + |
| 57 | +export default function (vueCode, dependenciesLibs, vue3 = true) { |
27 | 58 | const { template, script, styles, customBlocks } = parseComponent(vueCode);
|
28 | 59 |
|
29 | 60 | let newScript = script.content.replace(/\s*export default\s*/, "");
|
30 | 61 |
|
31 |
| - let output = outputVue2Template; |
| 62 | + const tempDependenciesLibs = dependenciesLibs.slice(); |
| 63 | + const tempLibAddressMap = vue3 ? libAddressMap: libAddressMapForVue2 |
| 64 | + |
| 65 | + tempDependenciesLibs.unshift("vue"); |
32 | 66 |
|
33 |
| - output = output.replace("#templateHolder", template.content); |
34 |
| - output = output.replace("#logicHolder", newScript); |
35 |
| - output = output.replace("#styleTemplate", styles[0].content); |
| 67 | + const output = ejs.render(outputVueTemplate, { |
| 68 | + cssLibs: tempDependenciesLibs.map((item) => tempLibAddressMap[item].css).filter((item) => !!item), |
| 69 | + scriptLibs: tempDependenciesLibs |
| 70 | + .map((item) => tempLibAddressMap[item].js) |
| 71 | + .flat() |
| 72 | + .filter((item) => !!item), |
| 73 | + vue3, |
| 74 | + vue3UseLib: tempDependenciesLibs |
| 75 | + .filter((item) => item != "vue") |
| 76 | + .map((item) => tempLibAddressMap[item].libName), |
| 77 | + style: styles[0].content, |
| 78 | + templateHolder: template.content, |
| 79 | + logicHolder: newScript, |
| 80 | + }); |
36 | 81 |
|
37 | 82 | return output;
|
38 | 83 | }
|
39 | 84 |
|
| 85 | +const libAddressMapForVue2 = { |
| 86 | + vue: { |
| 87 | + js: ["https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"], |
| 88 | + css: "", |
| 89 | + }, |
| 90 | + ele: { |
| 91 | + js: ["https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.7/index.min.js"], |
| 92 | + css: "https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.7/theme-chalk/index.min.css", |
| 93 | + }, |
| 94 | + antd: { |
| 95 | + js: [ |
| 96 | + "https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.1/moment.min.js", |
| 97 | + "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.7.8/antd.js", |
| 98 | + ], |
| 99 | + css: "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.7.8/antd.css", |
| 100 | + }, |
| 101 | + vant: { |
| 102 | + js: ["https://cdn.bootcdn.net/ajax/libs/vant/2.12.44/vant.min.js"], |
| 103 | + css: "https://cdn.bootcdn.net/ajax/libs/vant/2.12.44/index.min.css", |
| 104 | + }, |
| 105 | +}; |
0 commit comments