整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          nodejs搭建服務(wù)器顯示靜態(tài)html頁面

          nodejs搭建服務(wù)器顯示靜態(tài)html頁面

          提:

          安裝配置有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 個文件夾 :

          1. SRC:我們當(dāng)前網(wǎng)站所在的位置;
          2. Public:用來存放我們生成的網(wǎng)站。

          我們的目標(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ì)微差別:

          • 腳本本身位于 src 目錄下。
          • 代碼略超過了 100 行,大約 130 行,為了遵循簡潔的代碼實踐風(fēng)格,使用常量而不是文件夾路徑的字符串。
          • 該腳本不會復(fù)制整個 src 文件夾,而只復(fù)制必要的資源,比如 CSS 文件、圖片等。
          • 該項目使用 node-sass 編譯模板 CSS。然而,這種依賴性不是必需的,因為已編譯的 CSS 文件也被提交到了 Git。

          此外,你還可以安裝 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ū)動型的非阻塞式的模型。說太多反而沒意思,不如我們自己搭建一個。


          一、下載Nodejs

          由于小編是Win7的系統(tǒng),新版Nodejs不支持,不知道為什么?倒是對Win8很友好。于是小編在清華鏡像下載了下來,分享給大家。這里有兩個版本,一個是安裝包版本(后綴是.msi)無需配置環(huán)境變量;另一個是壓縮包,直接解壓然后配置環(huán)境變量即可。這里小編建議大家下載安裝包,考慮到有些人不懂的怎么設(shè)置環(huán)境變量,還是安裝包好點,小編偷個懶也下安裝包。


          二、安裝Nodejs

          首先我們需要同意它的用戶協(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é)果,如圖:


          四、建立一個可以在瀏覽器中訪問的服務(wù)器

          上面我們所建立的只能在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ù),如下所示:

          成功。


          五、總結(jié)

          看完Nodejs搭建服務(wù)器是不是覺得很簡單了,不著急,更精彩的還在后面等著你,這才只是個開端而已。


          主站蜘蛛池模板: 日韩有码一区二区| 久久se精品一区精品二区国产| 日本精品一区二区久久久 | 国产精品久久无码一区二区三区网| 中文字幕无码不卡一区二区三区| 久久se精品一区二区国产| 国产成人高清视频一区二区| 成人区人妻精品一区二区三区| 日韩精品无码免费一区二区三区 | 久久国产精品最新一区| 成人精品视频一区二区三区不卡 | 国产一区二区三区在线2021| 无码精品一区二区三区在线| 日本一区二区三区精品中文字幕| 成人精品视频一区二区三区| 国产AV国片精品一区二区| 国产91一区二区在线播放不卡 | 国产激情一区二区三区 | 美女视频一区二区| 一区二区三区人妻无码| 本免费AV无码专区一区| 精品一区二区久久| 一区二区三区无码被窝影院| 成人久久精品一区二区三区| 精品乱码一区内射人妻无码 | 日本一区二区三区不卡视频| 国产伦精品一区二区三区不卡| 精品一区二区三区自拍图片区| 日韩人妻精品无码一区二区三区| 亚洲性无码一区二区三区 | 亚洲av福利无码无一区二区| 国产精品亚洲一区二区麻豆| 亚洲一区二区精品视频| 一区二区精品在线| 四虎精品亚洲一区二区三区| 中文字幕一区二区免费| 精品国产一区二区三区久久狼| chinese国产一区二区| 一区二区三区在线观看| 一区二区三区伦理高清| 国产日本一区二区三区|