提:
安裝配置有node環(huán)境
一、初始化node項目
在項目的工作目錄,執(zhí)行命令
npm init
初始化參數(shù)設(shè)置,可以根據(jù)情況設(shè)置,或者直接全部默認(rèn)也行:
初始化項目
二、安裝express模塊
Express是目前最流行的基于Node.js的Web開發(fā)框架,可以快速地搭建一個完整功能的網(wǎng)站。
直接通過命令行安裝
npm i express --save
G:\app-server>npm i -g express --save
+ express@4.17.1
added 2 packages from 2 contributors and updated 24 packages in 23.892s
三、編寫app.js
新建一個app.js文件
var express=require('express');
var app=express();
app.use(express.static(__dirname + '/public'));
app.listen(8080, ()=> {
console.log(`App listening at port 8080`)
})
在express添加中間件,設(shè)置靜態(tài)資源路徑為public,所有的HTML、CSS、JS等文件都放在public下即可。默認(rèn)訪問public下面的index.html
新建index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Web測試平臺</title>
</head>
<body>
<h1>Web測試平臺</h1>
</body>
</html>
四、啟動服務(wù)
node app.js
即可運行
G:\app-server>node app.js
App listening at port 8080
訪問ip:8080
就可以訪問到index.html那個頁面了哦。
好了,各位老鐵。相信你一定也學(xué)會搭建這個服務(wù)器環(huán)境了哦。
有問題歡迎留言哦。一起學(xué)習(xí)。
日,我的一位同事向我尋求建議,她打算為自己構(gòu)建一個博客。于是,我對靜態(tài)網(wǎng)站生成器和博客引擎進(jìn)行了一番研究,發(fā)現(xiàn) Hugo 是一個很不錯的選擇。但是,我的同事還有一些特殊要求,比如,她想要一個自定義的博客網(wǎng)址和 CSS 主題。盡管這些 Hugo 都可以實現(xiàn),但我并不打算花時間來學(xué)習(xí)它。我想自己創(chuàng)建一個簡單的靜態(tài)網(wǎng)站生成器,以便我的同事在她已經(jīng)準(zhǔn)備好的 HTML 中編寫博客文章。
這個靜態(tài)網(wǎng)站生成器的代碼大約 100 行,非常簡潔。它提供了詳細(xì)代碼和示例博客 。眾所周知,GitLab 提供靜態(tài)頁面的免費托管服務(wù),還帶有 CI/CD 功能,它允許你在部署之前編譯頁面。
以下教程將帶你使用 Node.js 設(shè)置自己的靜態(tài)網(wǎng)站生成器,Node.js 的版本需要 “>=8.11.x”。
npm init npm i --save-exact bluebird chokidar fs-extra mustache mkdir src mkdir public
首先,設(shè)置項目:
開始之前,我們需要弄清楚一個問題:為什么需要靜態(tài)網(wǎng)站生成器?因為某些情況并不需要靜態(tài)網(wǎng)站生成器。假如你的博客訪問量很小,你只需簡單地手工創(chuàng)建 HTML 頁面并發(fā)布它們即可。實際上,在服務(wù)器編程興起之前,在很長時間內(nèi)這就是大多數(shù) Web 的發(fā)布方式。但是,一旦頁面和內(nèi)容增加,對這些頁面中的通用部分(例如頁面底部)進(jìn)行更改將會變得非常重復(fù)和乏味。因此,我們開始尋找一種更加理想的方法,嘗試使用某種簡單的模板引擎來分離常見內(nèi)容,然后在特定的地方插入所需的內(nèi)容。
開始研究模板引擎之前,先設(shè)置我們的網(wǎng)站。我們需要在項目根目錄下創(chuàng)建 2 個文件夾 :
我們的目標(biāo)是將 src 目錄的內(nèi)容復(fù)制到 public 目錄中。在項目根目錄下創(chuàng)建 index.js 文件,其內(nèi)容如下:
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"); };
執(zhí)行命令 node index.js,即可啟動該腳本。
祝賀你!此刻,你已榮升為一名后端開發(fā)人員。
接下來,我們將添加文件監(jiān)視器,src 文件夾中的內(nèi)容一旦發(fā)生更改就將重新生成網(wǎng)站。該博客總共包含 500-1000 個文件,我們可以在任何變化發(fā)生時重新生成整個網(wǎng)站:
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(); }); };
上面的代碼清楚地說明了為什么初始版本有一個名為 generateSite 的函數(shù)。現(xiàn)在執(zhí)行命令 node index.js 啟動我們的靜態(tài)網(wǎng)站生成器,如果在 src 目錄中編輯任何文件,public 都會發(fā)生變化。此時,我們還將添加一個環(huán)境變量來區(qū)分開發(fā)和生產(chǎn)模式。在開發(fā)模式中,我們將關(guān)注更改情況并重新生成網(wǎng)站,而在生產(chǎn)模式中,我們只需重新生成:
const env=process.env.NODE_ENV || "dev"; const main=async ()=> { console.log("Running app in " + env); await generateSite(); if (env==="dev") { watchFiles(); } };
我們可以執(zhí)行命令 export NODE_ENV=prod || set NODE_ENV=prod && node index.js 來運行以上代碼。請注意,觀察源目錄的更改和重新編譯并不是每次都必須的,你可以跳過此步驟,只需在每次進(jìn)行更改時運行腳本即可。
至此,差不多完成了!現(xiàn)在來說說模板。我們將使用 Mustache.js 模板,它非常簡單易用,并且我們的需求并不復(fù)雜。創(chuàng)建一個文件夾 src/partials,用來存放網(wǎng)站的公共部分。然后稍微修改我們的網(wǎng)站結(jié)構(gòu),保證所有頁面都存放在 src/pages 目錄中。接下來加載頁面并使用 Mustache 渲染:
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]); } };
想要了解最終版本,請查看 Software Dawg 項目(https://gitlab.com/wheresvic/software-dawg)。它與本教程有一些細(xì)微差別:
此外,你還可以安裝 browser-sync 軟件包,然后通過命令 npm run live-reload 運行它,如此一來,只要有任何更改發(fā)生瀏覽器就會自動刷新。請注意,由于任何更改都將重新生成整個網(wǎng)站,因此并不適用于 Windows。
GitLab 提供靜態(tài)網(wǎng)站免費托管,只需一個 .gitlab-ci.yml 配置文件即可。真正令人難以置信之處在于,你可以自定義構(gòu)建過程,這意味著在該例中,我們可以在部署之前生成網(wǎng)站!有關(guān)此功能的詳細(xì)信息,請參見https://about.gitlab.com/features/pages/。
本教程到此結(jié)束,我的同事對此非常滿意,該方案非常靈活,它允許她根據(jù)自己的喜好進(jìn)行自定義,也希望對你有所助益!
原文:https://smalldata.tech/blog/2018/08/16/building-a-simple-static-site-generator-using-node-js
作者簡介:Victor Parmar,是一位全棧工程師,熱愛旅行,熱愛 DIY。
譯者:安翔,責(zé)編:屠敏
Nodejs是GoogleV8引擎的一個JavaScript腳本語言,實際上也就是相當(dāng)于服務(wù)器一樣,可以解析網(wǎng)頁內(nèi)容并產(chǎn)生效果。它的出現(xiàn)令JavaScript如虎添翼,而且Node比JavaScript執(zhí)行更為快速,并且支持分布式,因為它使用了事件驅(qū)動型的非阻塞式的模型。說太多反而沒意思,不如我們自己搭建一個。
由于小編是Win7的系統(tǒng),新版Nodejs不支持,不知道為什么?倒是對Win8很友好。于是小編在清華鏡像下載了下來,分享給大家。這里有兩個版本,一個是安裝包版本(后綴是.msi)無需配置環(huán)境變量;另一個是壓縮包,直接解壓然后配置環(huán)境變量即可。這里小編建議大家下載安裝包,考慮到有些人不懂的怎么設(shè)置環(huán)境變量,還是安裝包好點,小編偷個懶也下安裝包。
首先我們需要同意它的用戶協(xié)議,然后選擇安裝路徑,沒有硬性規(guī)定非得放在系統(tǒng)盤,那么就請放在其它盤,如下:
然后點擊下一步,會看到環(huán)境設(shè)置和安裝依賴項,不用管,Next繼續(xù),如下:
然后我們會看到有一個選項,如圖:
這個是讓我們是否選擇這個工具,選擇了它就會下載,建議選上,然后等待片刻,安裝立馬就好了,如圖:
這個時候會出現(xiàn)一個CMD窗口,提示我們要下載工具了,并且需要關(guān)掉所有的窗口,如圖:
按回車后,完成閃退,進(jìn)入CMD,輸入命令獲取Node版本號,若返回則說明安裝成功,如下:
首先創(chuàng)建一個文件夾,名字不要使用中文和大寫字母,然后我們在該目錄下打開命令提示符,并輸入命令“npm init”,如下:
這里我們一步步按回車,最后輸入Yes,即可創(chuàng)建一個Node的項目了。上面給出的都是項目的配置。打開文件夾去看看,如圖:
會創(chuàng)建一個Json格式的文件。然后我們需要給這個項目建立一個靜態(tài)的資源庫,一般放置圖片,HTML什么的,取名為Static好了,然后放一個HTML文件進(jìn)去,取名“index.html”,至于內(nèi)容隨便寫;然后我們需要在Json文件目錄建立一個Json文件,用作啟動服務(wù)器使用,先隨便寫一個,如圖:
然后我們訪問它,這個時候這個Js 文件就是服務(wù)端的程序,訪問就會出結(jié)果,如圖:
上面我們所建立的只能在Node中訪問,瀏覽器中不行,下面建立個瀏覽器中能訪問的,這樣才叫服務(wù)器嗎?我們先創(chuàng)建一個服務(wù)器的Js文件,內(nèi)容如下:
var http=require('http');
var server=http.createServer(function (req,res)
{
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
server.listen(8080,'127.0.0.1');
console.log('Server running on http://127.0.0.1:8080/');
然后我們在CMD中啟動服務(wù),如下所示:
成功。
看完Nodejs搭建服務(wù)器是不是覺得很簡單了,不著急,更精彩的還在后面等著你,這才只是個開端而已。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。