import { track, trackPerformance } from '@/utils/report'; import { InternalJSModuleEvalError } from '@jolibox/common'; import { reportError, timeline } from '../events'; export const createLoadImplement = ( loadScript: (params: { path: string }) => string | null, params: { bootstrapUrl: string; implementUrl: string; } ) => { const tryLoadScript = (url: string): string => { const funStr = loadScript!({ path: url }); if (!funStr) { throw `module ${url} load failed ${funStr}`; } return funStr; }; function evalLocalJSModule(code: string) { const evalJS = async (code: string) => { try { const blob = new Blob([code], { type: 'application/javascript' }); const blobUrl = URL.createObjectURL(blob); const module = await import(blobUrl); URL.revokeObjectURL(blobUrl); return module; } catch (error) { reportError(new InternalJSModuleEvalError(`implement module evaluate error in native:${error} `)); } }; evalJS(code); } return () => { try { const startToLoad = Date.now(); track('jsSdkBegin', { t: startToLoad }); timeline.startTime = startToLoad; /** * bootstrap module */ const bootstrapModuleStr = tryLoadScript(params.bootstrapUrl); const script = document.createElement('script'); script.type = 'text/javascript'; script.innerHTML = bootstrapModuleStr; document.head.appendChild(script); trackPerformance('bootstrapModuleLoaded', Date.now() - startToLoad, { type: 'native' }); /** * implement module */ const implStartLoad = Date.now(); const implModuleStr = tryLoadScript(params.implementUrl); evalLocalJSModule(implModuleStr); trackPerformance('implementModuleLoaded', Date.now() - implStartLoad, { type: 'native' }); } catch (e) { console.error(`native load script error: ${e}`); // TODO reportError(new InternalJSModuleEvalError(`module load failed ${e}`)); } }; };