UNPKG

luykin-vite-plugin-seo-prerender

Version:

`vite-plugin-seo-prerender` 插件是一个用于 `Vite` 构建工具的预渲染插件,它可以将你的单页面应用 (SPA) 在构建时静态预渲染为 HTML 文件,以提高首次加载速度和SEO友好性。适用于对站点少量页面生成静态HTML。支持 `Vue、React`等所有框架

10 lines (9 loc) 5.97 kB
/** * name: luykin-vite-plugin-seo-prerender * version: 0.11.0 */ "use strict";var M=Object.create;var y=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var O=(t,e)=>{for(var n in e)y(t,n,{get:e[n],enumerable:!0})},P=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of R(e))!I.call(t,r)&&r!==n&&y(t,r,{get:()=>e[r],enumerable:!(o=A(e,r))||o.enumerable});return t};var g=(t,e,n)=>(n=t!=null?M(W(t)):{},P(e||!t||!t.__esModule?y(n,"default",{value:t,enumerable:!0}):n,t)),B=t=>P(y({},"__esModule",{value:!0}),t);var K={};O(K,{default:()=>J});module.exports=B(K);var H=g(require("child_process"),1),m=g(require("path"),1),E=g(require("fs"),1),L=g(require("sass"),1);var v=g(require("puppeteer"),1),D=g(require("fs"),1),w=g(require("path"),1);var h=g(require("fs"),1),j=g(require("path"),1),u=t=>t&&t.replace(/\\/g,"/"),d=t=>{let e=j.default.dirname(t);h.default.existsSync(e)||d(e),h.default.existsSync(t)||h.default.mkdirSync(t)};function G(t){return new Promise(e=>setTimeout(e,t))}var N=async config=>{let browser=await v.default.launch(Object.assign({headless:"new"},config.puppeteer||{})),page=await browser.newPage(),logTip="[vite-plugin-seo-prerender:routes]",network={};config.network&&(network={waitUntil:"networkidle0"}),config.injectScript&&await page.evaluateOnNewDocument(scriptContent=>{eval(scriptContent)},config.injectScript);for(let t of config.routes){let e=config.local+t;config.hashHistory&&(e=`${config.local}/#${t}`),await page.goto(e,network),await page.setViewport({width:1024,height:768}),await page.waitForSelector("body"),config.delay&&await G(config.delay);let n=await page.content();config.removeStyle!==!1&&(n=n.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,""));let o=new RegExp(config.local,"g");if(n=n.replace(o,""),config.callback&&(n=config.callback(n,t)||n),t.indexOf("?")!==-1)console.log(`${logTip} ${t} is error, unexpected ?`);else{let r=w.default.join(config.outDir,t);d(r);let s=w.default.join(r,"index.html");D.default.writeFileSync(s,n),console.log(`${logTip} ${s.replace(/\\/g,"/")} is success!`)}}await browser.close(),console.log(`${logTip} is complete`)},F=N;var c=g(require("fs"),1),f=g(require("path"),1);var b="",V=(t,e,n)=>{let o=c.default.readFileSync(f.default.join(t,"index.html"),"utf-8");if(e==="server"){let r=/<script[^>]*?\b\/main\b[^>]*?>.*?<\/script>/gi;return(o.match(r)||[]).join(` `)}else{let r=/<link[^>]*?rel=['|"]stylesheet['|"][^>]*?\.css[^>]*?>/gi,s=o.match(r),l=c.default.readFileSync(f.default.join(t,n||"","index.html"),"utf-8").match(r)||[],a=l;return s&&(a=l.filter(p=>!s.includes(p))),a.join(` `).replace('"./','"/')}},U=(t,e)=>t.replace(/<!--link\shref="(.*)"-->/gi,function(n,o){let r=f.default.join(e,o);return c.default.existsSync(r)?c.default.readFileSync(r,{encoding:"utf8"}):n}),C=(t,e,n)=>{let r=c.default.readFileSync(e,"utf-8").replace("</head>",`${b} </head>`);r=U(r,t),typeof n=="function"&&(r=n(r,e)||r),c.default.writeFileSync(e,r),console.log("[vite-plugin-seo-prerender:publicHtml] "+u(f.default.relative(t,e)))},$=(t,e,n,o)=>{if(!c.default.existsSync(t)){console.log(`${t}\u8DEF\u5F84\u4E0D\u5B58\u5728`);return}c.default.readdirSync(t).forEach(s=>{let i=f.default.join(t,s);c.default.statSync(i).isFile()&&f.default.extname(i)===".html"&&!u(i).endsWith(e)&&C(n,i,o),c.default.statSync(i).isDirectory()&&$(i,e,n,o)})},q=async t=>{let{mode:e,root:n,filePath:o,outDir:r=""}=t;if(b||(b=V(n,e,r)),e==="server"){let s=f.default.join(n,"public",o),i=c.default.readFileSync(s,"utf-8");return i=i.replace("</body>",`${b} </body>`),i=U(i,n),typeof t.callback=="function"&&(i=t.callback(i,o)||i),i}else if(typeof o=="boolean"){let s=f.default.join(n,r),i=u(f.default.join(r,"index.html"));$(s,i,n,t.callback)}else for(let s in o){let i=f.default.join(n,r,o[s]);C(n,i,t.callback)}},S=q;var k=t=>{let e=[];return typeof t=="object"&&(e=t||[]),{allUrl:e,isAllUrl:typeof t=="boolean"&&t}},T=(t,e)=>{let n=m.default.join(t,e.entry),o=L.compile(n),r=m.default.join(t,e.outDir);d(m.default.dirname(r)),E.default.writeFileSync(r,o.css),console.log(`transform scss: ${e.entry} => ${e.outDir}`)},z=t=>{let e={outDir:"",mode:"",root:"",local:"",base:"",isProduction:!1,command:""},n=t.publicHtml||!1;return{name:"vitePluginSeoPrerender",enforce:"post",configResolved(o){e.outDir=o.build.outDir,e.mode=o.mode,e.root=o.root,e.base=o.base,e.isProduction=o.isProduction,e.command=o.command},buildStart(){var o;(o=t==null?void 0:t.scss)!=null&&o.length&&t.scss.forEach(r=>{T(e.root,r)})},configureServer(o){let{allUrl:r,isAllUrl:s}=k(n);(r.length||s)&&o.middlewares.use(async(i,l,a)=>{let p=decodeURIComponent(i.url.replace(e.base,"/"));if(s&&p.endsWith(".html")||r.includes(p)){let x=await S({root:e.root,filePath:p,mode:"server",callback:t.callback});if(x){l.setHeader("Content-Type","text/html"),l.end(x);return}}a()})},handleHotUpdate({file:o,server:r}){var s;if(o.endsWith(".html")){let{allUrl:i,isAllUrl:l}=k(n);if(l||i.length){let a=m.default.join(e.root,"public"),p=m.default.relative(a,o);r.ws.send({type:"full-reload",path:"/"+u(p)})}}if((s=t==null?void 0:t.scss)!=null&&s.length&&o.endsWith(".scss")){let i=u(o);t.scss.forEach(l=>{i.includes(l.entry)&&T(e.root,l)})}},async closeBundle(){var l;if(!e.isProduction)return;let{allUrl:o,isAllUrl:r}=k(n);if((r||o.length)&&await S({root:e.root,filePath:r||o,mode:"build",outDir:e.outDir,callback:t.callback}),!((l=t==null?void 0:t.routes)!=null&&l.length))return;console.log("[vite-plugin-seo-prerender:routes] is start..");let s=H.default.exec("vite preview",a=>{if(a){console.error("\u6267\u884C\u547D\u4EE4\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A",a);return}}),i="";s.stdout.on("data",async a=>{let p=a.match(/http:\/\/(.*?)\//g);p&&p.length&&!i&&(i=p[0].replace(/\x1B\[\d+m/g,"").slice(0,-1),console.log("Local: "+i),e.local=i,await F(Object.assign(t,e)),s.kill("SIGTERM"),process.exit(),i="")})}}},J=z;