UNPKG

vite-plugin-seo-climsi-prerender

Version:

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

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