我需要能够从 asp.net 核心 WebApi 导入和呈现 vue 组件
我跟着这篇文章得到了一个想法,并想出了下面的代码。
端点确实被命中,并按我的预期返回了打包的组件字符串,但我在控制台中看到了这些错误:
拒绝从 'https://localhost:44385/api/DistributedComponent/Test' 执行脚本,因为其 MIME 类型 ('application/json') 不可执行,并且启用了严格的 MIME 类型检查。
和
vue.js:634 [Vue 警告]:无法解析异步组件:function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch ( a.label ) { case 0: return [4 / yield /, Object( js_util_external_component__WEBPACK_IMPORTED_MODULE_3 ["default"])('https://localhost:44385/api/DistributedComponent/Test')]; case 1: return [2 / return /, _a.sent()]; } }); }); 原因:TypeError:为promise检测到链接循环#
我怀疑我没有正确返回组件字符串,但我应该如何返回它?以及如何使用这些错误消息来帮助我了解我做错了什么?
外部组件.js
export default async function externalComponent(url) {
const name = 'MyComponent';
if (window[name]) return window[name];
window[name] = new Promise((resolve, reject) => {
const script = document.createElement('script');
script.async = true;
script.addEventListener('load', () => {
resolve(window[name]);
});
script.addEventListener('error', () => {
reject(new Error(`Error loading ${url}`));
});
script.src = url;
document.head.appendChild(script);
});
return window[name];
}
控制器端点:
[HttpGet("Test")]
public string Test()
{
// This is the output of the component after running
// npx vue-cli-service build --target lib --formats umd-min --no-clean --dest server/components/MyComponent --name "MyComponent.[chunkhash]" server/components/MyComponent/MyComponent.vue
return @"(function(e,t){""object""===typeof exports&&""object""===typeof module?module.exports=t():""function""===typeof define&&define.amd?define([],t):""object""===typeof exports?exports[""MyComponent.c9b7fae39bb9d71ad3e7""]=t():e[""MyComponent.c9b7fae39bb9d71ad3e7""]=t()})(""undefined""!==typeof self?self:this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){""undefined""!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:""Module""}),Object.defineProperty(e,""__esModule"",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&""object""===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,""default"",{enumerable:!0,value:e}),2&t&&""string""!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e[""default""]}:function(){return e};return n.d(t,""a"",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="""",n(n.s=""fb15"")}({f6fd:function(e,t){(function(e){var t=""currentScript"",n=e.getElementsByTagName(""script"");t in e||Object.defineProperty(e,t,{get:function(){try{throw new Error}catch(r){var e,t=(/.*at [^\(]*\((.*):.+:.+\)$/gi.exec(r.stack)||[!1])[1];for(e in n)if(n[e].src==t||""interactive""==n[e].readyState)return n[e];return null}}})})(document)},fb15:function(e,t,n){""use strict"";var r;(n.r(t),""undefined""!==typeof window)&&(n(""f6fd""),(r=window.document.currentScript)&&(r=r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/))&&(n.p=r[1]));var o=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n(""h2"",[e._v(""Hello from the Distribution Server!"")])},i=[];function f(e,t,n,r,o,i,f,u){var c,a=""function""===typeof e?e.options:e;if(t&&(a.render=t,a.staticRenderFns=n,a._compiled=!0),r&&(a.functional=!0),i&&(a._scopeId=""data-v-""+i),f?(c=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||""undefined""===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(f)},a._ssrRegister=c):o&&(c=u?function(){o.call(this,(a.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(a.functional){a._injectStyles=c;var s=a.render;a.render=function(e,t){return c.call(t),s(e,t)}}else{var d=a.beforeCreate;a.beforeCreate=d?[].concat(d,c):[c]}return{exports:e,options:a}}var u={},c=f(u,o,i,!1,null,null,null),a=c.exports;t[""default""]=a}})[""default""]}));";
}
主要 Vue 组件:
<template>
<MyComponent />
</template>
<script lang="ts">
import { Vue, Component, Mixins } from "vue-property-decorator";
import externalComponent from '../../js/util/external-component';
const MyComponent = () => externalComponent('https://localhost:44385/api/DistributedComponent/Test');
@Component({
name: "Dashboard",
components: {
MyComponent
}
})
export default class Dashboard extends Vue {
constructor() {
super();
}
}
</script>
我通过将控制器端点更新为:
[HttpGet("Test")]
public async Task<IActionResult> Test()
{
var bytes = await System.IO.File.ReadAllBytesAsync(@"Path\To\MyComponent.c9b7fae39bb9d71ad3e7.umd.min.js");
return File(bytes, "application/javascript", "MyComponent.umd.min.js");
}
其中解决了 MIME 类型问题,并且external-component.js到
export default async function externalComponent(url) {
const name = 'MyComponent';
if (window[name]) return window[name];
window[name] = await new Promise((resolve, reject) => {
const script = document.createElement('script');
script.async = true;
script.addEventListener('load', () => {
console.log('load');
resolve(window[name]);
});
script.addEventListener('error', () => {
console.log('error');
reject(new Error(`Error loading ${url}`));
});
script.src = url;
document.head.appendChild(script);
});
return window[name];
}
这摆脱了异步组件错误(我们现在正在等待组件加载 Promise,然后再返回 window[name]
我现在得到一个
类型错误:无法读取未定义的属性“__esModule”
为此我打开了这个问题
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句