packages/plugin-icestark/src/index.ts (78 lines of code) (raw):

import type { Plugin } from '@ice/app/types'; interface PluginOptions { type: 'child' | 'framework'; library?: string | string[]; } const PLUGIN_NAME = '@ice/plugin-icestark'; const plugin: Plugin<PluginOptions> = ({ type, library }) => ({ name: PLUGIN_NAME, setup: ({ onGetConfig, context, generator, modifyUserConfig }) => { const libraryName = library || context.pkg?.name as string || 'microApp'; onGetConfig((config) => { config.configureWebpack ??= []; config.configureWebpack.push((webpackConfig) => { if (type === 'child') { webpackConfig.output.library = libraryName; webpackConfig.output.libraryTarget = 'umd'; } return webpackConfig; }); return config; }); if (type === 'child') { // Modify basename when render as a child app. generator.modifyRenderData((data) => { return { ...data, basename: `(typeof window !== 'undefined' && window.ICESTARK?.basename || ${data.basename})`, }; }); generator.addEntryCode(() => { return `let root; if (!window.ICESTARK?.root && !window.__POWERED_BY_QIANKUN__) { root = render(); } // Set library name if (typeof window !== 'undefined' && window.ICESTARK) { window.ICESTARK.library = ${JSON.stringify(libraryName)}; } // For qiankun lifecycle validation. export async function bootstrap(props) { await app?.icestark?.bootstrap?.(props); } export async function mount(props) { await app?.icestark?.mount?.(props); // Avoid remount when app mount in other micro app framework. if (!root) { // When app mount in qiankun, do not use props passed by. // Props of container if conflict with render node in ice, it may cause node overwritten. let runtimeOptions = props; if (props.singleSpa) { const iceContainer = props.container?.querySelector('#ice-container'); if (iceContainer) { runtimeOptions = {...props, container: iceContainer }; } else { const ele = document.createElement('div'); ele.id = 'ice-container'; props.container.appendChild(ele); runtimeOptions = {...props, container: ele }; } } root = render({ runtimeOptions }); } await root; } export async function unmount(props) { root?.then((res) => res.unmount()); await app?.icestark?.unmount?.(props); // Reset root to null when app unmount. root = null; }`; }); } else { // Plugin icestark do not support ssr yet. modifyUserConfig('ssr', false); modifyUserConfig('ssg', false); } }, runtime: `${PLUGIN_NAME}/esm/runtime/${type === 'framework' ? 'framework' : 'child'}`, }); export default plugin;