vite-plugin-html-prerender
Advanced tools
Comparing version
import type { Plugin } from "vite"; | ||
import { HtmlPrerenderOptions } from "./types"; | ||
declare function htmlPrerender(options: HtmlPrerenderOptions): Plugin; | ||
declare const htmlPrerender: (options: HtmlPrerenderOptions) => Plugin; | ||
export default htmlPrerender; |
@@ -6,8 +6,6 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const server_1 = __importDefault(require("./server")); | ||
const renderer_1 = __importDefault(require("./renderer")); | ||
const html_minifier_1 = require("html-minifier"); | ||
const path_1 = __importDefault(require("path")); | ||
const fs_1 = __importDefault(require("fs")); | ||
const Prerenderer = require("@prerenderer/prerenderer"); | ||
const PuppeteerRenderer = require("@prerenderer/renderer-puppeteer"); | ||
function htmlPrerender(options) { | ||
const htmlPrerender = (options) => { | ||
return { | ||
@@ -21,48 +19,40 @@ name: "vite-plugin-html-prerender", | ||
}; | ||
} | ||
function emitRendered(options) { | ||
const prerenderer = new Prerenderer({ | ||
...options, | ||
renderer: new PuppeteerRenderer() | ||
}); | ||
prerenderer.initialize().then(() => { | ||
console.log(`[vite-plugin-html-prerender] Pre-rendering routes (${options.routes})...`); | ||
return prerenderer.renderRoutes(options.routes); | ||
}).then((renderedRoutes) => { | ||
// NOTE: Minify html files | ||
console.log("[vite-plugin-html-prerender] All routes rendered successfully."); | ||
if (!options.minify) { | ||
return renderedRoutes; | ||
}; | ||
const emitRendered = (options) => { | ||
const port = 17581; | ||
const server = new server_1.default(port); | ||
const renderer = new renderer_1.default(port); | ||
server.init(options.staticDir).then(async () => { | ||
console.log("\n[vite-plugin-html-prerender] Starting headless browser..."); | ||
return renderer.init(); | ||
}).then(async () => { | ||
const renderedRoutes = []; | ||
for (let route of options.routes) { | ||
console.log("[vite-plugin-html-prerender] Pre-rendering route:", route); | ||
renderedRoutes.push(await renderer.renderRoute(route)); | ||
} | ||
console.log("[vite-plugin-html-prerender] Minifying rendered html files..."); | ||
renderedRoutes.forEach(route => { | ||
route.html = (0, html_minifier_1.minify)(route.html, options.minify); | ||
}); | ||
return renderedRoutes; | ||
}).then((renderedRoutes) => { | ||
// NOTE: Set the output paths | ||
return renderedRoutes.map(route => { | ||
route.output = path_1.default.join(options.staticDir, route.route, "index.html"); | ||
return route; | ||
}); | ||
}).then((renderedRoutes) => { | ||
// NOTE: Write files to output directory | ||
renderedRoutes.forEach(route => { | ||
fs_1.default.mkdir(path_1.default.dirname(route.output), { recursive: true }, () => { | ||
console.log(`Appending file [${route.route}]`); | ||
fs_1.default.writeFile(route.output, route.html, error => { | ||
if (error) { | ||
throw error; | ||
} | ||
}); | ||
}).then(renderedRoutes => { | ||
if (options.minify) { | ||
console.log("[vite-plugin-html-prerender] Minifying rendered HTML..."); | ||
renderedRoutes.forEach(route => { | ||
route.html = (0, html_minifier_1.minify)(route.html, options.minify); | ||
}); | ||
}); | ||
}).then(() => { | ||
prerenderer.destroy(); | ||
console.log("[vite-plugin-html-prerender] Completed."); | ||
}).catch((err) => { | ||
prerenderer.destroy(); | ||
console.error("[vite-plugin-html-prerender] Failed to prerender routes: ", err); | ||
} | ||
return renderedRoutes; | ||
}).then(async (renderedRoutes) => { | ||
console.log("[vite-plugin-html-prerender] Saving pre-rendered routes to output..."); | ||
for (let renderedRoute of renderedRoutes) { | ||
await renderer.saveToFile(options.staticDir, renderedRoute); | ||
} | ||
}).then(async () => { | ||
await renderer.destroy(); | ||
await server.destroy(); | ||
console.log("[vite-plugin-html-prerender] Pre-rendering routes completed."); | ||
}).catch(async (e) => { | ||
await renderer.destroy(); | ||
await server.destroy(); | ||
console.error("[vite-plugin-html-prerender] Failed to prerender routes:", e); | ||
}); | ||
} | ||
}; | ||
exports.default = htmlPrerender; |
@@ -17,6 +17,5 @@ import { Options } from "html-minifier"; | ||
} | ||
export type RenderedRoutes = Array<{ | ||
export type RenderedRoute = { | ||
route: string; | ||
html: string; | ||
output: string; | ||
}>; | ||
}; |
{ | ||
"name": "vite-plugin-html-prerender", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "Vite.js plugin for pre-rendering html for SPAs.", | ||
@@ -29,7 +29,8 @@ "main": "dist/index.js", | ||
"dependencies": { | ||
"@prerenderer/prerenderer": "^0.7.2", | ||
"@prerenderer/renderer-puppeteer": "^0.2.0", | ||
"html-minifier": "^4.0.0" | ||
"express": "^4.18.2", | ||
"html-minifier": "^4.0.0", | ||
"puppeteer": "^19.6.3" | ||
}, | ||
"devDependencies": { | ||
"@types/express": "^4.17.17", | ||
"@types/html-minifier": "^4.0.2", | ||
@@ -36,0 +37,0 @@ "@types/node": "^18.11.18", |
# vite-plugin-html-prerender | ||
Vite.js plugin for pre-rendering html for SPAs. | ||
## Install | ||
```shell | ||
npm i -D vite-plugin-html-prerender | ||
``` | ||
## Usage | ||
Add `htmlPrerender` to your configuration (`vite.config.js`/`vite.config.ts`): | ||
```typescript | ||
import { defineConfig } from "vite"; | ||
import { htmlPrerender } from "vite-plugin-html-prerender"; | ||
import path from "path"; | ||
export default defineConfig({ | ||
plugins: [ | ||
htmlPrerender({ | ||
/** | ||
* Required: Output directory of "vite build" | ||
*/ | ||
staticDir: path.join(__dirname, "dist"), | ||
/** | ||
* Required: List of routes to pre-render. | ||
*/ | ||
routes: ["/", "/about"], | ||
/** | ||
* Optional: To minify html. Uses https://github.com/kangax/html-minifier. | ||
*/ | ||
minify: { | ||
collapseBooleanAttributes: true, | ||
collapseWhitespace: true, | ||
decodeEntities: true, | ||
keepClosingSlash: true, | ||
sortAttributes: true | ||
} | ||
}) | ||
] | ||
}); | ||
``` |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
10080
72.25%13
44.44%189
83.5%44
1000%5
25%2
100%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed