UNPKG

react-repl-plus

Version:

React component for editing React components, it is similar to vue repl

76 lines (68 loc) 2.16 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Vite + React + TS</title> <script type="importmap"> <!--IMPORT_MAP--> </script> </head> <body> <div id="root"></div> <script type="module"> window.__export__ = (mod, key, get) => { Object.defineProperty(mod, key, { enumerable: true, configurable: true, get, }) } async function handle_message(e) { const send_message = (payload) => parent.postMessage({ ...payload }, e.origin) const send_reply = (payload) => send_message({ ...payload }) const send_ok = () => send_reply({ action: 'cmd_ok' }) let { action } = e.data if (action === 'eval') { try { const { script: scripts } = e.data.args for (const script of scripts) { const scriptEl = document.createElement("script"); const done = new Promise((resolve) => { window.__next__ = resolve }) scriptEl.innerHTML = script + `\nwindow.__next__()` scriptEl.type = "module"; document.body.appendChild(scriptEl); await done } send_ok() } catch (error) { } } } // 渲染编译完成之后的代码 window.addEventListener("message", handle_message); // 预览代码在运行时错误捕获,抛出提示 window.onerror = function (msg, url, lineNo, columnNo, error) { // ignore errors from import map polyfill - these are necessary for // it to detect browser support if (msg.includes('module specifier “vue”')) { // firefox only error, ignore return false } if (msg.includes("Module specifier, 'vue")) { // Safari only return false } try { parent.postMessage({ action: 'error', value: error }, '*') } catch (e) { parent.postMessage({ action: 'error', value: msg }, '*') } } </script> </body> </html>