時(shí)間:2023-07-25 14:18:02 | 來源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-25 14:18:02 來源:網(wǎng)站運(yùn)營(yíng)
100行node.js搭建一個(gè)簡(jiǎn)單的靜態(tài)站點(diǎn)生成器:最近我(作者 Victor Parmar)的一個(gè)同事想開一個(gè)博客,問我有沒有什么建議。在研究了一些靜態(tài)站點(diǎn)生成器和博客引擎后,我覺得 Hugo 是個(gè)很不錯(cuò)的選擇。然而,我同事還有一些其它需求,比如想讓博客都有自定義 URL 以及自定義 CSS 主題。雖然用 Hugo 也能實(shí)現(xiàn)這些要求,但是我還是決定跳過學(xué)習(xí)使用 Hugo 這部分,看看如果我同事已經(jīng)有隨時(shí)可用的 HTML 而且在 HTML 中寫博客沒有問題,能否創(chuàng)建一個(gè)很簡(jiǎn)單的靜態(tài)站點(diǎn)生成器。npm initnpm i --save-exact bluebird chokidar fs-extra mustachemkdir srcmkdir public
const Promise = require("bluebird");const fse = require("fs-extra");Promise.resolve().then(async () => { await main();});const main = async() => { await generateSite();};const generateSite = async() => { await copyAssets();};const copyAssets = async() => { await fse.emptyDir("public"); await fse.copy("src", "public");};
const chokidar = require("chokidar");const main = async() => { await generateSite(); watchFiles();};const watchFiles = () => { const watcher = chokidar.watch( [ "src" ], { ignored: /(^|[////])/../, // chokidar will watch folders recursively ignoreInitial: false, persistent: true } ); watcher.on("change", async path => { console.log("changed " + path + ", recompiling"); await generateSite(); }); // catch ctrl+c event and exit normally process.on("SIGINT", function() { watcher.close(); });};
const env = process.env.NODE_ENV || "dev";const main = async () => { console.log("Running app in " + env); await generateSite(); if (env === "dev") { watchFiles(); }};
const fs = require("fs");const generateSite = async () => { await copyAssets(); await buildContent();};const buildContent = async () => { const pages = await compilePages(); await writePages(pages);};const compilePages = async () => { const partials = await loadPartials(); const result = {}; const pagesDir = path.join("src", "pages"); const fileNames = await fs.readdirAsync(pagesDir); for (const fileName of fileNames) { const name = path.parse(fileName).name; const fileContent = await fs.readFileAsync(path.join(pagesDir, fileName)); result[name] = Mustache.render(fileContent.toString(), {}, partials); } return result;};const loadPartials = async () => { const result = {}; const partialsDir = path.join("src", "partials"); const fileNames = await fs.readdirAsync(partialsDir); for (const fileName of fileNames) { const name = path.parse(fileName).name; const content = await fs.readFileAsync(path.join(partialsDir, fileName)); result[name] = content.toString(); } return result;};const writePages = async pages => { for (const page of Object.keys(pages)) { await fs.writeFileAsync(path.join("public", page + ".html"), pages[page]); }};
參考資料:
https://smalldata.tech/blog/2018/08/16/building-a-simple-static-site-generator-using-node-js
關(guān)鍵詞:靜態(tài),成器,簡(jiǎn)單
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。