in packages/editor-core/src/editor.ts [129:209]
async setAssets(assets: IPublicTypeAssetsJson) {
const { components } = assets;
if (components && components.length) {
const componentDescriptions: IPublicTypeComponentDescription[] = [];
const remoteComponentDescriptions: IPublicTypeRemoteComponentDescription[] = [];
components.forEach((component: any) => {
if (!component) {
return;
}
if (component.exportName && component.url) {
remoteComponentDescriptions.push(component);
} else {
componentDescriptions.push(component);
}
});
assets.components = componentDescriptions;
assets.componentList = assets.componentList || [];
// 如果有远程组件描述协议,则自动加载并补充到资产包中,同时出发 designer.incrementalAssetsReady 通知组件面板更新数据
if (remoteComponentDescriptions && remoteComponentDescriptions.length) {
await Promise.all(
remoteComponentDescriptions.map(async (component: IPublicTypeRemoteComponentDescription) => {
const { exportName, url, npm } = component;
if (!url || !exportName) {
return;
}
if (!AssetsCache[exportName] || !npm?.version || AssetsCache[exportName].npm?.version !== npm?.version) {
await (new AssetLoader()).load(url);
}
AssetsCache[exportName] = component;
function setAssetsComponent(component: any, extraNpmInfo: any = {}) {
const components = component.components;
assets.componentList = assets.componentList?.concat(component.componentList || []);
if (Array.isArray(components)) {
components.forEach(d => {
assets.components = assets.components.concat({
npm: {
...npm,
...extraNpmInfo,
},
...d,
} || []);
});
return;
}
if (component.components) {
assets.components = assets.components.concat({
npm: {
...npm,
...extraNpmInfo,
},
...component.components,
} || []);
}
}
function setArrayAssets(value: any[], preExportName: string = '', preSubName: string = '') {
value.forEach((d: any, i: number) => {
const exportName = [preExportName, i.toString()].filter(d => !!d).join('.');
const subName = [preSubName, i.toString()].filter(d => !!d).join('.');
Array.isArray(d) ? setArrayAssets(d, exportName, subName) : setAssetsComponent(d, {
exportName,
subName,
});
});
}
if ((window as any)[exportName]) {
if (Array.isArray((window as any)[exportName])) {
setArrayAssets((window as any)[exportName] as any);
} else {
setAssetsComponent((window as any)[exportName] as any);
}
}
return (window as any)[exportName];
}),
);
}
}
const innerAssets = assetsTransform(assets);
this.context.set('assets', innerAssets);
this.notifyGot('assets');
}