UNPKG

vite-plugin-seo-prerender

Version:

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

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