ccl*_*eve 6 javascript vue.js vue-dynamic-components
我们有一个 Vue 应用程序,并希望允许第三方创建插件。我们希望插件以 Vue 单文件组件的形式构建。
在运行时,最终用户会选择一个插件添加到应用程序中。该应用程序将获取纯文本 .vue 文件,即时编译它,并将其显示在应用程序中。
Vue 支持动态和异步组件,但这些需要提前编译到应用程序中。我们想做同样的事情,除了动态加载代码。
我怎样才能使这项工作?
这是我到目前为止所得到的:
<template>
<div>
The component goes here:
<component :is="pluginComponent"></component>
</div>
</template>
<script>
import { parseComponent } from "vue-template-compiler";
export default {
data() {
return {
pluginComponent: null
};
},
mounted() {
// fetch code from some external source here
let code = "<template><div>hello</div></template>";
let comp = parseComponent(code);
this.pluginComponent = comp;
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
(我修改了构建,所以 vue-template-compiler 存在。)
上面的代码生成此错误:
[Vue warn]: invalid template option:[object Object]
found in
---> <Anonymous>
<Pages/plugin/PluginId.vue> at pages/plugin/_plugin_id.vue
<Nuxt>
<Layouts/default.vue> at layouts/default.vue
<Root> instrument.js:110
instrumentConsole instrument.js:110
VueJS 15
TypeError: "vnode is null"
VueJS 14
instrument.js:110
Run Code Online (Sandbox Code Playgroud)
我猜 parseComponent() 产生的不是我们<component>想要的。
我猜想
parseComponent()产生的东西都不是<component>我们想要的东西
我会说是的,因为它似乎没有编译成任何render函数。
如文档中所述,vue-template-compiler用于运行时编译。在大多数情况下,您应该将它与vue-loader.
我怎样才能做到这一点?
您可能想要使用Vue.compile,因为它允许您将模板字符串编译成render函数;然后您可以将其绑定到异步或动态组件的对象。
但请注意,这仅在完整构建中可用,它比仅运行时构建的对应版本重大约 30%。了解有关运行时 + 编译器与仅运行时的更多信息。
考虑到这一点,由于您在问题中没有提到您正在使用哪个捆绑器,所以我将假设使用 Vue-CLI 的 Webpack,下面是您如何配置别名vue(作为导入时的参考点)。
在控制台(从项目的根目录)中,运行:
vue inspect resolve.alias.vue$
Run Code Online (Sandbox Code Playgroud)
如果这会导致“vue/dist/vue.runtime.esm.js”(默认情况下应该如此),那么很明显我们需要更改这部分。
现在,由于内部 webpack 配置是使用 维护的webpack-chain,我们将像这样配置/重置别名:
vue inspect resolve.alias.vue$
Run Code Online (Sandbox Code Playgroud)
查看不同构建的解释。
此时,您需要做的就是将“动态”模板传递给函数compile,<template>但不包括标记。
module.exports = {
chainWebpack: config => {
config.resolve.alias
.set('vue$', 'vue/dist/vue.esm.js')
}
}
Run Code Online (Sandbox Code Playgroud)
import Vue from 'vue';
export default {
mounted() {
// fetch code from some external source here
let code = '<div>hello</div>';
let comp = Vue.compile(code);
this.pluginComponent = comp;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1755 次 |
| 最近记录: |