使用 github pages, 快速部署你的靜態(tài)網(wǎng)頁(yè)

打個(gè)小廣告:
如果你想獲取更多前端干貨甩恼、鵝廠工程師的前端面試指南,
歡迎關(guān)注我的個(gè)人微信公眾號(hào):
前端夜談

使用 github pages, 快速部署你的靜態(tài)網(wǎng)頁(yè)

Github Pages 官網(wǎng)

Github Pages:
Websites for you and your projects.
Hosted directly from your GitHub repository. Just edit, push, and your changes are live.

前言

在日常工作中, 我們經(jīng)常會(huì)遇到要做 demo 展示的情況. 做 demo 展示不同于做項(xiàng)目開(kāi)發(fā), 我們需要的是快速輕便的開(kāi)發(fā)和部署, 而不是完備的一整套開(kāi)發(fā)流程.

下圖肯定不是我們做一個(gè) demo 想要的流程.

deploy_by_you_own

尤其對(duì)于數(shù)據(jù)可視化工作, 能快速的創(chuàng)建一個(gè) demo 來(lái)驗(yàn)證自己的想法, 并且方便的和同伴分享自己作品是非常重要的.
在這里給大家介紹一種筆者經(jīng)常用來(lái)做 demo 的方法: Github Pages.

選擇 github pages 的理由

  1. 使用零成本: github pages 集成在 github 中, 直接和代碼管理綁定在一起, 隨著代碼更新自動(dòng)重新部署, 使用非常方便.
  2. 免費(fèi): 免費(fèi)提供 username.github.io 的域名, 免費(fèi)的靜態(tài)網(wǎng)站服務(wù)器.
  3. 無(wú)數(shù)量限制: github pages 沒(méi)有使用的數(shù)量限制, 每一個(gè) github repository 都可以部署為一個(gè)靜態(tài)網(wǎng)站.

使用方法

一. 部署靜態(tài)網(wǎng)頁(yè)

首先我們介紹一下部署最基礎(chǔ)的靜態(tài)網(wǎng)頁(yè), 最終的效果是展示出一個(gè) Hello, github pages :) 頁(yè)面.

demo 地址: github repository

github page 地址: https://ssthouse.github.io/github-pages-demo/

1.1 創(chuàng)建一個(gè) github 項(xiàng)目

前往 github 官網(wǎng), 點(diǎn)擊 New repository 創(chuàng)建新項(xiàng)目. 填入項(xiàng)目基本信息, 點(diǎn)擊 Create Repository 確認(rèn).

create_repository

確認(rèn)完成后會(huì)看到如下頁(yè)面:

after_create_repository

1.2 為 repository 開(kāi)啟 github page 選項(xiàng)

如圖, 我們選中 Setting tab

repository_setting_page

往下滾動(dòng), 找到 Github Pages 選項(xiàng), 將 Source 改為 master branch, 最后點(diǎn)擊 Save 按鈕

github_page_finish_setting

最后我們會(huì)得到一個(gè)鏈接, 通過(guò)這個(gè)鏈接, 待會(huì)我們就能通過(guò)這個(gè)鏈接訪問(wèn)到該項(xiàng)目的 github pages 頁(yè)面.

1.3 代碼 clone 到本地, 并創(chuàng)建幾個(gè)基本文件

create_sample_files

1.4 添加基礎(chǔ)代碼

注意這里 html 因?yàn)楹?css 以及 js 放在同一目錄, 所以我們用相對(duì)路徑來(lái)引用.

代碼邏輯很簡(jiǎn)單, 就是在頁(yè)面加載好后在頁(yè)面中添加 Hello, github pages :) 這段文字.

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Github Page demo</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="main.css" />
    <script src="index.js"></script>
</head>
<body>
    <div id="main-content">

    </div>
</body>
</html>

index.js

window.onload = function() {
  document.getElementById('main-content').innerHTML = 'Hello, github pages :)'
}

main.css

#main-content {
  font-size: 36px;
  font-weight: bold;
  padding: 16px;
}

1.5 將代碼更新到 github 倉(cāng)庫(kù)

    cd github-pages-demo
    git add .
    git commit -m "Add simple code"
    git push

1.6 看看效果

現(xiàn)在我們?cè)L問(wèn)之前開(kāi)啟 github pages 選項(xiàng)時(shí)獲得的 url, 就可以看到效果了

注: 代碼 push 上去后, 可能要過(guò)幾分鐘才會(huì)部署好生效

效果如圖 :arrow_down:

simplest demo

二. 使用前端框架時(shí), 如何使用 github pages

如今我們創(chuàng)建一個(gè)前端項(xiàng)目的時(shí)候, 已經(jīng)很少手動(dòng)創(chuàng)建 index.html, main.js , main.css 這文件了, 通常我們都會(huì)選擇一個(gè)前端框架, 并使用相應(yīng)的 command line tool 來(lái)初始化項(xiàng)目.

這里筆者用 Vue 的 webpack 項(xiàng)目 做介紹, rect 和 angular 進(jìn)行類似的配置即可.

創(chuàng)建項(xiàng)目

首先我們用 vue-cli 創(chuàng)建一個(gè) webpack 管理的 vue 項(xiàng)目 (點(diǎn)我安裝 vue-cli),

vue init webpack github-page-vue-demo

然后我們進(jìn)入項(xiàng)目, 看看目錄結(jié)構(gòu):

simplest demo

可以看到 config 目錄中有三個(gè)文件:

config                     //  配置目錄
├── dev.env.js             // 用于development模式的環(huán)境變量
├── index.js               // 用于配置 `dev` 模式和 `prod` 模式的 webpack config 文件
└── prod.env.js            // 用于product模式的環(huán)境變量

這里我們需要配置的就是 index.js 文件, 先看看該文件內(nèi)容 (這里將不相關(guān)的代碼用...略過(guò)), 其中我們需要關(guān)注的是 module.exportsbuild 屬性, 我們將在這里配置 webpack build 時(shí)生成文件的路徑

module.exports = {
  dev: {
      ...
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    ...
  }
}

可以看到圖中主要配置了 index 文件和 assets 文件的路徑. 默認(rèn)執(zhí)行 yarn run build 后 webpack 會(huì)將項(xiàng)目打包到項(xiàng)目根目錄的 ./dist 文件夾, 如圖:

default build result

修改編譯配置

但是 github pages 默認(rèn)只能識(shí)別項(xiàng)目根目錄的 index 文件, 如果我們想要讓 github pages 識(shí)別到我們 build 出來(lái)的文件應(yīng)該怎么辦呢?

你可能會(huì)想到直接將 dist 文件夾中 build 生成的文件直接復(fù)制到項(xiàng)目的根目錄, 這確實(shí)是個(gè)辦法. 但是這樣的話, 我們每次 build 完, 都需要手動(dòng)復(fù)制一邊文件, 這無(wú)疑增加了很多重復(fù)性的工作.

我們可以通過(guò)修改默認(rèn)的配置來(lái)達(dá)到項(xiàng)目 build 的文件直接生成到項(xiàng)目根目錄的目的, 像這樣:

module.exports = {
  dev: {
      ...
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../index.html'),  //之前是 '../dist/index.html'

    // Paths
    assetsRoot: path.resolve(__dirname, '../'),  // 之前是 '../dist'
    assetsSubDirectory: 'static',
    assetsPublicPath: './',    // 之前是 '/'
    ...
  }
}

所做的改動(dòng)就是去掉了默認(rèn)的 dist 目錄, 并且將 assets 的引用路徑從 絕對(duì)路徑 改為了 相對(duì)路徑.

去掉 dist 目錄是為了將 buildtarget 路徑改為項(xiàng)目根目錄. 改為相對(duì)路徑是因?yàn)樵诓渴鸬?github pages 的時(shí)候, 我們的域名是 https://username.github.io/repositoryName, 也就是說(shuō)我們的項(xiàng)目是部署在子域名上的, 如果用絕對(duì)路徑會(huì)導(dǎo)致 assets 文件 404.

這樣修改完后我們又發(fā)現(xiàn)一個(gè)問(wèn)題: 在這樣的配置下, build 結(jié)束生成的 index.html 文件會(huì)覆蓋原有的 template index.html 文件, 并且根目錄多了一個(gè) static 文件夾, 很容易讓人對(duì)這個(gè)文件夾的作用產(chǎn)生疑惑. 有沒(méi)有更好的解決辦法呢 ?

讓我們回到 github page 的 setting 頁(yè)面:


default build result

可以看到這里有一個(gè)選項(xiàng)是 master branch /docs folder . 當(dāng)前狀態(tài)是不可選的, 原因是我們的項(xiàng)目代碼里面沒(méi)有 /docs 目錄.

這個(gè)選項(xiàng)的意思是 github page 可以識(shí)別我們項(xiàng)目中的 docs 文件夾, 并在這個(gè)文件夾中尋找 index 文件進(jìn)行部署. 選中這個(gè)選項(xiàng)后, 我們只需要將之前 webpack 默認(rèn)的 dist 文件夾改為 docs 文件夾即可, 修改后配置如下:

module.exports = {
  dev: {
      ...
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../docs/index.html'),  //之前是'../dist/index.html'

    // Paths
    assetsRoot: path.resolve(__dirname, '../docs'),  // 之前是 '../dist'
    assetsSubDirectory: 'static',
    assetsPublicPath: './',    // 之前是 '/'
    ...
  }
}

完成以上的修改后, 我們?cè)俅芜\(yùn)行 yarn run build, 你會(huì)發(fā)現(xiàn)根目錄下多了一個(gè) docs 文件夾, 里面承載了 index 文件和 static 文件夾. 我們講 docs 目錄以及其下的文件全部加入 git 版本管理, 并 push 到 github.

再次來(lái)到 該項(xiàng)目的 github page setting 頁(yè)面, 這時(shí) master branch /docs folder 就變成可選中的了. 我們選中這個(gè)選項(xiàng), 并保存設(shè)置.

過(guò)兩分鐘左右, 我們?cè)俅卧L問(wèn)我們項(xiàng)目的 github page url, 就會(huì)發(fā)現(xiàn)項(xiàng)目已經(jīng)部署成功了 :tada:

自定義 template

在上一步中, 我們自己配置了一個(gè) 基于 Vue + Webpack 的項(xiàng)目配置. 但如果每次我們想創(chuàng)建一個(gè) demo, 我們都要修改一遍配置的話, 還是很花費(fèi)時(shí)間. 特別是忘記了配置步驟的話, 還得再查找之前的配置方法.

一個(gè)比較好的解決方案是創(chuàng)建一個(gè)基礎(chǔ)的 template repository, 在下次需要?jiǎng)?chuàng)建一個(gè) demo 項(xiàng)目的時(shí)候, 直接 fork 過(guò)來(lái), 基于這個(gè)項(xiàng)目著手開(kāi)發(fā)即可.

比如我經(jīng)常使用的技術(shù)棧是: Vue + D3.js + Webpack, 我就給自己創(chuàng)建了一個(gè)這樣的 template, 并做好 github page 的配置. 下次要做數(shù)據(jù)可視化 demo 的時(shí)候, 直接 fork 這個(gè) repository 進(jìn)行開(kāi)發(fā), 節(jié)省了許多項(xiàng)目配置的時(shí)間, 如果有和我類似技術(shù)棧的小伙伴, 不妨一試:

Vue + D3.js + Webpack (github page ready)
github 地址

三. 只可以是靜態(tài)網(wǎng)站嗎?

github page 可以非常方便的部署靜態(tài)網(wǎng)頁(yè). 但是因?yàn)闆](méi)有數(shù)據(jù)庫(kù), 無(wú)法存儲(chǔ)數(shù)據(jù), 也就沒(méi)辦法實(shí)現(xiàn)較為復(fù)雜的業(yè)務(wù)邏輯. 但是 github page 真的就只能做做簡(jiǎn)單的純靜態(tài)網(wǎng)站了嗎?

其實(shí), 如今前后端分離, 只要有后端 api, 前端完全可以單獨(dú)開(kāi)發(fā)和部署.

如果我們的網(wǎng)站已有現(xiàn)成的后端 api, 使用 github page, 再加上 javascript 調(diào)用后端 api, 完全可以實(shí)現(xiàn)所有的業(yè)務(wù)邏輯.

如果沒(méi)有現(xiàn)有后端 api, 但是想要實(shí)現(xiàn)簡(jiǎn)單的后端邏輯的話, 這里推薦一個(gè)筆者常用的小 tip:

使用 leancloud 作為對(duì)象存儲(chǔ)的后端數(shù)據(jù)庫(kù)
前端調(diào)用 leancloud api 實(shí)現(xiàn)所有的業(yè)務(wù)邏輯

如果感興趣不妨看看我的這個(gè)項(xiàng)目: github visualization

這個(gè)項(xiàng)目就是部署在 github pages 上, 并使用 leancloud api 實(shí)現(xiàn)的 用戶訪問(wèn)信息記錄 的功能.
具體的 leancloud 使用細(xì)節(jié), 請(qǐng)參見(jiàn) leancloud 文檔

最后

github pages 可以說(shuō)是為我節(jié)省了許多的時(shí)間, 為我開(kāi)發(fā) demo 展示提供了非常多的便利. 推薦沒(méi)有使用過(guò)的小伙伴試試, 相信也會(huì)給你們帶來(lái)很多便利.

如果覺(jué)得這篇文章不錯(cuò)的話, 不妨關(guān)注一下 : )

github 主頁(yè)

知乎專欄

掘金

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市置尔,隨后出現(xiàn)的幾起案子妄讯,更是在濱河造成了極大的恐慌,老刑警劉巖鸟顺,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惦蚊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡讯嫂,警方通過(guò)查閱死者的電腦和手機(jī)蹦锋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)欧芽,“玉大人莉掂,你說(shuō)我怎么就攤上這事∏樱” “怎么了憎妙?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵库正,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厘唾,道長(zhǎng)褥符,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任抚垃,我火速辦了婚禮喷楣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讯柔。我一直安慰自己抡蛙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布魂迄。 她就那樣靜靜地躺著粗截,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捣炬。 梳的紋絲不亂的頭發(fā)上熊昌,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音湿酸,去河邊找鬼婿屹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛推溃,可吹牛的內(nèi)容都是我干的昂利。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铁坎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜂奸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起硬萍,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扩所,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后朴乖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祖屏,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年买羞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袁勺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畜普,死狀恐怖期丰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤咐汞,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布盖呼,位于F島的核電站,受9級(jí)特大地震影響化撕,放射性物質(zhì)發(fā)生泄漏几晤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一植阴、第九天 我趴在偏房一處隱蔽的房頂上張望蟹瘾。 院中可真熱鬧,春花似錦掠手、人聲如沸憾朴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)众雷。三九已至,卻和暖如春做祝,著一層夾襖步出監(jiān)牢的瞬間砾省,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工混槐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留编兄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓声登,卻偏偏與公主長(zhǎng)得像狠鸳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悯嗓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理件舵,服務(wù)發(fā)現(xiàn),斷路器绅作,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • 今天在朋友圈看到一個(gè)文章標(biāo)題:請(qǐng)告訴孩子芦圾,讀書是最容易走的那條路蛾派。 放在以前一定不認(rèn)同這句話俄认,放在當(dāng)下,對(duì)這句話的...
    他說(shuō)他的不說(shuō)閱讀 114評(píng)論 0 0
  • 父親的身體明顯大不如以前了,說(shuō)來(lái),竟也是古稀之年又三,想到他,最先想到的就是瘦如柳條的身板,,175厘米的個(gè)...
    考試路上閱讀 175評(píng)論 1 0
  • 最近總是覺(jué)得記憶力大不如前了洪乍,甚至上周發(fā)生的事情都記不起來(lái)眯杏,所以我想在我還能想起以前的時(shí)候記錄下來(lái) 回憶也罷憂傷也...
    深信不疑i我是光閱讀 105評(píng)論 1 1