【问题标题】:Vue - Load External Components From Another SiteVue - 从另一个站点加载外部组件
【发布时间】:2019-07-02 03:41:06
【问题描述】:

我正在尝试从外部站点检索 vue 组件并将其加载到我的应用程序中,但我终其一生都无法弄清楚。

这是完整的场景;

  • 站点 A(内部托管站点)加载 VueJS 应用程序
  • 站点 A 从站点 B 请求一个 VueJS 组件(内部托管站点,不同的子域)
    • 理想情况下,站点 B 将包含 .vue 文件,它们可以是原生 .vue 格式,也可以是预编译的(可能是 vue-cli?)
  • 站点 A 加载并呈现应用程序中的组件

假设我想从站点 B 加载一个非常简单的组件;

{
    "template": "<div><span>{{message}}</span></div>",
    "data": function() {
        return { "message": "Hello World" };
    }
}

我尝试了以下这些,结果好坏参半;

在我的 index.ts 中(使用 TypeScript)

Vue.component('my-external-component', () => (Vue as any).http.get("http://test.local/test.js"));

在我的 .vue 文件中

<my-external-component></my-external-component>

这会导致这条评论被添加到 DOM 中

<!--function (a, b, c, d) { return createElement(vm, a, b, c, d, true); }-->

不过添加

<component :is="my-external-component"></component>

导致向 DOM 添加空注释

<!---->

我还对此做了一些变体,包括使用 cli 将模板编译成 js 文件并尝试加载该文件,出现关于无法访问 template.trim 或类似内容的奇怪错误。

【问题讨论】:

  • 你的“非常简单的组件”应该有一个data 函数,而不是一个普通的对象
  • @Phil 感谢您指出这一点,我已经更新了我的本地测试以及问题,它仍然只是添加功能注释。我还更新了问题以反映对组件的此更改。
  • 仅供参考,您的 test.json 不再是 JSON
  • 你认为 JSON 的 MIME 类型会导致我的一些麻烦吗?我将尝试将其更改为 JS,因为这就是它现在的样子。

标签: vue.js vue-component vue-cli


【解决方案1】:

鉴于您的组件定义是(或曾经是)JSON 并且组件 data 应该是一个函数,您应该在解析异步组件之前转换结果。

例如(使用fetch,因为我不知道Vue.http是什么)

Vue.component('MyExternalComponent', () =>
  fetch('http://test.local/test.json').then(res => res.json()).then(defn => ({
    ...defn,
    data () { // transform defn.data into a function
      return defn.data
    }
  }))
)

JSFiddle demo here 使用他们的/echo/json service 来模拟外部组件定义。


从远程 .js 文件中导出组件定义会很棘手。

【讨论】:

  • 非常感谢您的帮助,这太棒了,但是您能否稍微扩展一下 jsonpCallbackFunctionName 的正文会是什么样子?
  • @AdamH 不确定您的意思,但 Vue.http 是什么?是阿信吗?如果是这样,我认为它不支持开箱即用的 JSONP
  • 我可以改成fetch,此时我们处于POC阶段。 Vue.http 来自vue-resource,你可能已经看到它像this.$http 一样使用过。
  • @AdamH 非常确定vue-resource is retired now。老实说,我不推荐 JSONP 选项,因为它要么在远程资源上引入服务器端要求,要么在 Vue 应用程序中引入全局范围的函数。我会坚持转换 JSON
  • 好的,非常感谢您的帮助。如果可以的话,我会投票两次,但相反,你将不得不接受我永恒的感激。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多