Matsu

Nothing more than curiosity

建立屬於你/妳自己的React專案!

Yesterday is history, tomorrow is a mystery, today is a gift of God, which is why we call it the present.
― Bill Keane
今天要講解的東西很輕鬆,就是用指令去建立一個React的專案。
–預備知識–

  • 知道命令列介面(Command Line Interface)
    • Windows -> cmd
    • Mac -> terminal

–講解流程–

  • 安裝Node.js
  • 建立React專案
  • 結語

安裝Node.js

在透過指令安裝React專案前,我們必須先下載Node.js,如果已經安裝好可以直接跳到下一個步驟。

node

直接安裝16.1.0Current版本也可以,接著就照著安裝指示安裝即可。

建立React專案

安裝完成後打開命令列介面,切換到自己想要建立專案文件夾的路徑後,輸入以下指令建立React的專案。

react

可能會有提示需要安裝create-react-app套件的指示出現,就輸入Y就可以安裝了!
接著就會看到專案成功建立完成!把路徑切換到資料夾裡面後,輸入npm start就可以成功在本地端(自己的電腦)運行。

react-run

接著打開瀏覽器就可以看到React專案預設好的畫面!
react-home

這就是用React開始撰寫網站的第一個步驟!

所謂的套件,在這裡指的是由其他人統整好的函式庫,整個套件含有許多我們在開發React專案的時候需要引入的函式庫等等。因此我們可以知道create-react-app就是負責幫我們把需要的工具都整理好,畢竟工欲善其事,必先利其器,就是這個道理。


結語

其實這個部分只是想要對開發環境重新做一個認識,順便記錄下來心想或許會有剛接觸到React的程式設計師可以快速閱覽一下。我其實還有遇到webpack版本問題,因為之前在開發的時候把webpack安裝到全域裡,導致建立好的React專案的webpack套件版本被覆蓋過去而跳出警示訊息,所以還是應該好好的把全域弄得乾乾淨淨是最好的選擇。畢竟一天到晚都在搞開發環境,而沒有任何心力專注在開發的話,大概會發瘋吧?

React介紹與基本概念淺談

Live as if you were to die tomorrow. Learn as if you were to live forever.
- Mahatma Gandhi

React是近年來盛行的三大框架其一,在ES6後甚至更加盛行。國外統計程式設計師學習React的人數逐年上升,可見React的強勢,因此今天想和大家一起來學習使用React。當然不是隨波逐流,而是在嘗試使用過React後,發現它的強大!更不消說有超級多的第三方函式庫可以使用。那,廢話不多說,我們趕緊往下看!

  • React的定義與用途
  • React的基本概念
    • React的組件(Component)
    • React的兄弟JSX(JS-XML)
  • 結語

React的定義與用途

  • React是用來打造使用者介面(UI)的JS函式庫。
  • React是由組件(Component)所組成。

讀者可能會想說不是有HTML、CSS、JS就可以打造UI了嗎? 為什麼要大費周章去學習一項新的技術? 其實一項新的技術的產生,都是因為舊有的東西的缺點存在,才會促使新的科技、技術的發展。好比人類覺得走路太久才能到達目的地,所以研究出動力機械,這些道理都是一樣的。可想而知,React產生固然是因為傳統的HTML和CSS在撰寫介面上,不管是維護還是新增介面,盡管有PUG和SCSS這些預處理器多少可以加速開發,但是卻還是有其致命的缺點。

使用傳統的HTML和CSS的主要缺點:

  • 頁面轉跳時都需要發送GET請求到Server端後再次渲染頁面
  • 當APP變得複雜且龐大時難以維護以及管理
  • 網頁載入速度慢

使用React的優點:

  • 整個Web只會在第一次開啟時發送GET請求
  • 以組件的方式開發網站
  • 網頁載入速度超快

React的基本概念

網頁最後呈現給使用者的始終是HTML、CSS以及JS。
React使用宣告式方法(Declarative Approach)去執行程式,因此開發者只需要專注在程式的狀態(State),接著React就會幫我們處理JS和DOM的程式碼,聽起來很像魔法,但其實就是我們只需要懂得駕駛React這台跑車,至於引擎是V8還是V12,不懂也沒關係。

有機會我們再來深入研究宣告式(Declarative)與指令式(Imperative)程式設計!

React的組件(Component)

React的核心概念就是組件,所謂的組件就是將HTML、CSS、JS三者合在一起,最後再由組件去建立整個使用者介面(UI)。
因此組件的優點有:

  • 可重複使用(Re-usable)
  • 可回應的(Reactive)

React的架構大概如下:
react

大概就像圖表一樣的架構,抱歉,我沒有美術天分XDD。

React的兄弟JSX(JS-XML)

React的程式碼如下:
jsx

剛開始接觸React一定會充滿困惑,會什麼JS檔案裡面的程式碼相當奇怪? 居然包含像是HTML的標記語言,其實這是React開發團隊為了方便撰寫組件所開發的程式碼,叫做JSX(JS-XML)。在渲染畫面前,React會透過第三方函式庫將JSX轉換成瀏覽器讀得懂的方式。

今日回顧:

  • React是HTML、CSS、JS整合後的框架
  • React的特殊語法JSX
  • React組件的概念

結語

今天只稍微了解一下React框架以及它的由來,接下來我們就會逐步進入React專案實作囉! 能夠用React實作各種大大小小的網站,用想的就覺得興奮對吧!如果重複打繁瑣的Code還不足以讓你學習它的話,那再接下來的文章你一定會愛上React。

はとが的區別

ささいなことが私たちを慰めるのは、ささいなことが私たちを悩みますからだ。
ー 川端康成

到底要怎麼分はとが這兩個小鬼頭?

傻傻分不清,要怎麼知道は和が什麼時候用呢? 看過仿間的文法書,看完還是覺得一頭霧水,網路文章更是五花八門,甚至出現許多的專業名詞還能寫成論文,如: 格助詞、副助詞,最後看完這些名詞最後還是不懂得如何使用は和が。其實就算分不清楚,單憑語感也可以分辨出這兩個助詞的使用時機! 但是我們還是要把語感轉化為文字,一起往下看吧!

  • 一次搞定は和と!
  • 「は」的使用時機
    • 對比
    • 共識
    • 主句
  • 「が」的使用時機
    • 敘述
    • 提示
    • 子句
  • 用英語來理解は和と!
  • 結語

一次搞定は和と!

直接來看句子:

  • 花は綺麗です
  • 花が綺麗です 

要怎麼解釋這兩個句子呢? 它們看起來長的一模一樣,根本就是雙胞胎! 它們確實是雙胞胎沒錯,很多時候は和が可以彼此互換,但互換過後就會有點不一樣。
先試著從強調的重點來理解:

  • 強調は後面的詞,在這個例子是綺麗
  • 強調が前面的詞,在這個例子是花

基本上掌握這個重點,就可以分辨出絕大多數句子的は和が了! 等等,如果這麼簡單那為什麼大家要一直討論呢? 那是因為這兩個小鬼頭很調皮。有時候會偷偷變裝,讓我們分不清楚誰是誰。


「は」的使用時機

は的使用時機可以細分很多種,我們只討論比較常用的三種!

對比

分辨は的一種很簡單的方式就是透過比對,只要句子能夠看出有比較的意思,那用は肯定沒錯。
我們一樣來看剛才舉過的例子:

  • 花は綺麗です

從這短短的句子我們可以知道這朵花強調的重點在於綺麗(漂亮的)這兩個字,而且可以知道比其他的花還要漂亮,有偷偷比較的意味喔!

共識

は的很重要的一點就是大家都必須認識它,我們才可以使用!
我們來看剛才舉過的例子:

  • 花は綺麗です

我們可以知道花必須是我們都知道的一朵花,如果有一個人不知道的話,那不知道在說哪一朵花的人就會沒辦法做比較喔!

主句

は的最後一個要點就是,它可以獨立為一個句子! 可以想像は是哥哥が是弟弟,は是勇敢的哥哥,會獨自出現在眾人面前。
我們再繼續看剛才的例子:

  • 花は綺麗です
  • 花が綺麗です 

可是看到這裡一定會想說が不是也獨立存在了嗎? 沒錯,它確實作為獨立句子存在,但那是因為這時候的が不是作為主句使用,而是單純強調前方的花來使用。
因此我們在這裡需要看看其他的句子:

  • おじいさんは、花が咲いた時 笑えました。

在上述的句子當中,我們拆開成各自的句子:

  • おじいさんは笑えました
  • 花が咲いた時 

我們可以發現おじいさんは笑えました直接讀起來也沒有問題,但是花が咲いた時讀起來就會有種話還沒說完的感覺,不妨把が想成是因為太害羞,而還有話沒說出來吧!


「が」的使用時機

が的使用時機我們一樣只討論比較常用的三種!

敘述

が有種比較客觀的感覺,像是單純在敘述,而不加油添醋對眼前發生的事情預設立場。
我們同樣看最一開始的例子:

  • 花が綺麗です 

在這句花が綺麗です,我們可以知道在說花很美,單純地說花很美,沒有一點點個人的偏見。

提示

が特別重要的概念是作為提示使用,因為我們剛才提過は是必須在大家都知道的情況下使用,但若遇到真的有人不知道的時候呢? 這個時候很簡單,我們就要先用が來開場白,讓大家都知道我們在說什麼。在這裡我們同樣需要舉其他的例子,才能理解這個差異:

  • 花が咲きました
  • 本当ですか? 

上面的句子看起來像是單純的敘述,但是下方若接了一個問句,我們就可以知道花が咲きました是為了讓大家先了解花已經開了,但可能有人還不知道花開了,我們不能自己認為大家都要知道花已經盛開,畢竟が很膽小,有些話還沒說出來。

子句

は作為主句的例子就可以完美詮釋が身為子句的角色。

  • おじいさんは笑えました
  • 花が咲いた時 

因為が很膽小,所以總是要躲在は的背後喔!


用英語來理解は和と!

試著嘗試用英語理解的話,那麼は大概就會像是定冠詞the,が則像是冠詞an

  • 花は綺麗です
  • 花が綺麗です 

則上面的句子就會是

  • A flower is beautiful.
  • The flower is beautiful.

回到我們最一開始的重點:

  • 強調は後面的詞,在這個例子是綺麗
  • 強調が前面的詞,在這個例子是花

結語

希望這樣對於各位理解は和が能夠更深入,我個人覺得理解到這個程度在閱讀文章上應該不會有太大的障礙,當然我們可以繼續細分更多使用的情境,不過有時候會想花那麼多時間,卻只搞定這兩個小鬼頭,會不會太不划算了呢? 學習日語的路途很有趣! 不要放棄,一起學下去!! 接下來有時間的話會來寫動詞的變換部分,我曾經也在動詞苦惱了許久。日語的動詞變化真的是很需要花時間,對於初學者來說,更是容易搞混的重點,希望我能用淺顯易懂的方式傳達出去。

JS - ES6快速入門

The only true wisdom is in knowing you know nothing.
- Socrates

JS語法釐清

今天重溫JS的基礎,徹底了解ES5與ES6間的差異,那麼廢話不多說,趕緊來看!

  • 變數命名 let & const
  • 箭頭函數 ES6
    • ES5函數
    • ES6函數
  • 觀念釐清 Export & Import
  • 類別與繼承 Class
  • 展開/其餘運算子 Spread & Rest
  • 拆解 Destructuring
  • 原始型態和參照型態 Primitive & Reference
  • 結語

以下範例程式碼都可以在JSbin實際執行看看喔!不妨動手試試吧!
JSbin: https://jsbin.com/?js,console


變數命名 let & const

在ES6,var開始出現分身,就是let和const! 簡單來說,它們的功用都是用來定義變數,實際舉例:
var number = 5;
let number = 5;
const number = 5;
一般區別在於let所命名的變數是可變的,const所命名的變數則是不可變的。
其實還有Scope的問題,但暫且不討論那一塊。


箭頭函數 ES6

接下來比較大的改變莫過於箭頭函數,若沒有事先了解,肯定出現ES5和ES6是不同程式語言的錯覺。

ES5函數

首先先來看看ES5的函數寫法:

1
2
3
4
5
function say(name){
console.log(name + " Hey! You cool!");
}

say('Johnny');

在ES5撰寫函數的時候,會先寫下function這個關鍵字建立函數,接著再寫上函數的名稱,以本例來說say就是函數的名稱,往後在呼叫這個函數時則要寫上say,而括號()內則填入參數,所以呼叫時我在這裡傳入Johnny,這就是ES5典型的函數呼叫方式。
實際在JSbin執行過後可以得到結果是"Johnny Hey! You cool!"

ES6函數

根據ES5的函數寫法,我們來改寫成ES6的箭頭函數:

1
2
3
4
const say = (name) => {
console.log(name + " Hey! You cool!");
}
say('Johnny');

一般來說要將ES6寫成等同於ES5的程式碼都必須指派到某變數,同樣可以根據函數是否會更動而宣告為let或者是const。我們可以看到參數的傳遞寫在等號後方,接著才接上箭頭函數。好處在於簡潔的語法外,最重要的優點在於this關鍵字的範圍變得更加明瞭,而不會像ES5函數的this常常會超出我們所想。
同樣在JSbin執行過後可以得到結果也是"Johnny Hey! You cool!"

TIP:
單一參數,箭頭函數可以簡化成下方寫法:

1
const say = name => console.log(name + " Hey! You cool!");

無參數或多參數,括號()不得省略:

1
2
const say = () => console.log("Hey! You cool!");
const say = (fname, lname) => console.log(fname + " " + lname + " Hey! You cool!");

觀念釐清 Export & Import

在專案當中,把程式模組化是一件相當明智的選擇。
首先模組化的檔案必須先匯出Export,才能由其他程式匯入Import後使用。
匯出Export有兩種方式,我們以ES6的函數為例:
–預設匯出–
export default say

–命名匯出–
export const say = (name) => console.log(" Hey! You cool!")
export const name = "Johnny"
預設匯出的檔案只有一個模組,以上例來說就是只匯出say這個函數,命名匯出則是會根據名稱匯出不同的模組,以上例來說就是匯出say這個函數外,還能夠再匯出其他函數或變數。

匯入Import則會根據匯出的方式對應:
–預設匯入–
import say from './say.js'
當然say可以當成alias任意命名,如下:
import greet from './say.js'

–命名匯入–
import {say} from './say.js'
import {name} from './say.js'
可以清楚看到若是預設匯入則可以任意命名,但若是命名匯入則必須指定要匯入的函數或變數等等。
總結來看,一個檔案只能包含一個預設匯出及數個命名匯出,因此若檔案包含數個模組或變數等,我們也可以一次匯入所有的模組如下:
import * as all from './say.js
存取則可以透過all.sayall.name存取我們匯出的模組或變數。


類別與繼承 Class

噹噹噹,Java跟Javascript就像是Ham跟Hamburger,除了開頭三個英文字其他都不一樣,但自從ES6加入了Class後,它們的相似性又提高了一點,對,就是那麼一點。對於熟悉物件導向程式語言的各位來說,肯定是一件再熟悉不過的事情,不過我們還是來看看JS的Class吧!畢竟三大框架Angular,React,Vue幾乎可以說是完全基於它的概念而發展出來。
關鍵字起頭不廢話:

1
2
3
4
5
6
7
8
9
10
11
12
class Fish {
constructor(){
this.species = 'fish';
}
swim () {
console.log("swims...");
}
}

const shark = new Fish();
console.log(shark.species);
shark.swim();

上方定義魚的類別,裡面有一個建構子與方法Swim。典型的類別寫法,同時也是比較的寫法。constructor可以理解為一開始實體化(初始化)時就具備的東西,以Fish類別來說,鯊魚剛生出來就有個名字叫做’fish’。
實際執行後顯示結果"fish""swims..."

接著我們來看看繼承的範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Shark extends Fish{
constructor(){
super();
this.name = 'shark';
}
swim() {
console.log("swims pretty fast...");
}
}

const shark = new Shark();
console.log(shark.species);
console.log(shark.name);
shark.swim();

鯊魚這個類別繼承魚,鯊魚這次完成進化,游得非常快而且有個更酷炫的名字shark!需要特別注意的是,繼承父類別Fish必須要寫上super()才可以確保父類別屬性的建構子也經過實體化。
不過這樣看下來好像JS在class上沒有什麼獨到之處啊? No.No..No…
以上的程式碼都能改寫成更有ES6的味道:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fish {
species = 'fish';
swim = () => {
console.log("swims...");
}
}

class Shark extends Fish {
name = 'shark';
swim = () => {
console.log("swims pretty fast...");
}
}

const shark = new Shark();
console.log(shark.species);
console.log(shark.name);
shark.swim();

看到JS有多潮了嗎?大概就跟鯊魚一樣潮,海中霸主。可以注意到在JS裡的Class並不是純粹的Class而是經過簡化的Class,所以常常可以聽到有人說JS的Class是類Class也是有點道理在。因為ES6幫我們處理許多像是constructor跟super(),在JS這些都可以省略不寫,因此我們只需要專注在High-Level的部分,裝備穿好了,還不趕快出發嗎?


展開/其餘運算子 Spread & Rest

ES6可以與箭頭函數與之比肩的大概就非屬於展開和其餘運算子了,讓我們來了解它們的各自功能。
展開運算子(Spread Operator): 將陣列元素或者是物件屬性分割出來
其餘運算子(Rest Operator): 將一連串的函數參數合併到陣列中

不需要懷疑,這兩個運算子放在一起講就是因為它們的寫法一樣都是**…**,沒錯就是點點點,想必大家看完心中也是點點點,但我們立刻來抽絲剝繭。
展開運算子其實相當好理解,就是將陣列分開再使用:

1
2
3
const oldYear = [2018, 2019, 2020];
const newYear = [...oldYear, 2021];
console.log(newYear);

我們可以了解到newYear第一個參數…oldYear會先將oldYear這個陣列本身切割開來成為單一元素,接著再建立一個新的陣列給newYear並且再加上後續的參數。
實際執行後顯示結果[2018, 2019, 2020, 2021]
同樣地,我們也可以將展開運算子運用在物件上:

1
2
3
4
5
6
7
8
const fish = {
species: 'fish',
}

const shark = {
...fish,
name: 'shark'
};

實際執行後顯示結果

1
2
3
4
[object Object] {
name: "shark",
species: "fish"
}

可以發現fish的屬性一樣被添加到shark裡面,這就是展開運算子的功能,帶來意想不到的便捷性,尤其是在複製陣列或物件身上。

接著來討論其餘運算子:

1
2
3
4
const filterNums = (...args) => {
return args.filter(el => el > 5);
}
console.log(filterNums(1,3,5,7,9,11,13,15,17));

我們在這個函數傳入其餘運算子(…args),args可以任意命名,接著我們回傳args的內建函數filter。因為args在經過其餘運算子後已經轉換為陣列,因此可以套用陣列的內建方法,如:sort(), map(), slice(), splice()等等的方法。特別注意的是filterNums()並不能傳入一組陣列,會造成其餘運算子無法將陣列轉換成功而直接回傳空陣列。
實際執行後顯示[7, 9, 11, 13, 15, 17]


拆解 Destructuring

藉由拆解我們可以很容易的去存取陣列或物件裡面的元素或屬性,我們實際來看點例子。
首先是陣列:

1
2
3
4
5
6
const breakMeUp = [2, 0, 2, 1, "is", "cool"];
const [a, b, , d, e] = breakMeUp;
console.log(a);
console.log(b);
console.log(d);
console.log(e);

透過直接拆解陣列可以對應到breakMeUp陣列裡面的元素,而不需要透過其他方式去索引。
實際執行後顯示
接著是物件:

1
2
3
4
5
6
7
8
const Shark = {
species: 'fish',
name: 'shark'
}

const {species} = Shark;
console.log(species);
console.log(name);

物件的拆解就像是一對一的對應,中括號{}內寫的變數能夠對應到物件的屬性,就能夠讀取,如果沒有對應的屬性則會回傳undefined.
實際結果:"fish"和"Undefined"


原始型態和參照型態 Primitive & Reference

終於來到本日的最後一個段落,喘口氣~茶。
JS最重要的概念大概在於釐清原始型態(Primitive)和參照型態(Reference),基本上數值、字串、布林值、Null、undefined都隸屬於原始型態,至於在JS常常操作的陣列與物件則是所謂的參照型態。
等等,什麼型態? 難不成我還得會開二、三檔,接著伸縮機關槍嗎? 不會可能真的打不出機關槍來。
首先是原始型態:

1
2
3
4
5
6
7
let num = 1111;
let num2 = num;
console.log(num);
console.log(num2);
num = 2222;
console.log(num);
console.log(num2)

上述程式我們可以理解到何謂原始型態,簡單來說就是參值(Call By Value),因此num在後續變更後並不會改動num2的值。可以理解為num2模仿num蓋房子,蓋完後即便num改建,num2的房子還是長的跟num之前的房子一樣。原理就是因為num2其實擁有自己的記憶體位置0x0f03。
實際執行結果顯示:1111 1111 2222 1111

1
2
3
4
5
6
7
8
9
const fish = {
species: 'fish'
}
const shark = fish;
console.log(shark.species);
fish.species = 'animal'
console.log(shark.species);
shark.species = 'fish';
console.log(fish.species);

上述程式我們理解參照型態,簡單來說就是參址(Call By Reference),既然它們住的地方都一樣,只要有人去改動房子的,那自然它們就會彼此影響,換句話說,fish和shark都參照到同一個記憶體位址,理解這一點後,就可以理解JS不論是展開、其餘運算子還是陣列內建方法,都會產生新的陣列的原因在,一方面是要避免副作用,試想如果不小心改動陣列,卻把最一開始的值都搞混了,那還需要繼承什麼呢? 可能哪天fish的種類變成dog都不一定對吧?
實際執行結果顯示:"fish", "animal", "fish"


結語

哇! 今天一個興起就把文章打好打滿,花了不少時間。其實會突然想打這篇文章主要是因為在網路上學React的課程,剛好講師複習JS一些比較需要去注意的改動,
像是箭頭函數、展開運算子、類別其實都逐漸讓JS在程式語言的世界裡稱霸,當然還是有許多很好的語言,但JS的強勢卻是無庸置疑,以前或許沒人敢說,但現在肯定大家都會認同JS是很強勢的語言,即便它是弱型態語言,仔細想一想JS根本就是扮豬吃老虎,有夠過分,但大家還是對它愛不釋手,我也是。

希望今天的系列文能夠快速幫助需要的人複習ES5.6間的改動,其實有些許改動牽連到ES7,有機會再拿出來討論,相信應該不會等上太久的時間。許多細節沒有講到,但我想理解基本概念,等到實務上遇到問題再去深入理解也不遲,畢竟要學的東西太多了!

謝謝各位看到最後!!

踏上Hexo的旅途,開始為自己做紀錄

In three words I can sum up everything I have learned about life: it goes on.
- Robert Frost

種一棵樹最好的時機是十年前,其次是現在。
是否曾經想過紀錄生活的點滴,是否想要開始改變自己。每一天晚上睡前都想著要變得更好,隔一天早起床卻又是日復一日的一天,走到今日,是否忘記那些人生感動的片刻,是否覺得許多事情都變得不再有意義,面對生活的壓力,是否開始漫無目的,好像人本來就是要不斷奔波直到跑不動為止。

很多時候的沒意義,都只是因為忘記那感動的瞬間,可還記得聽見過讓你感動的音樂,可還記得令人樂此不疲的一件,可還記得最美的幾個瞬間。如果能夠回味,一定會很懷念吧!

前言 用Hexo記住生活的每個片刻

今天開始Hexo系列文,希望能對想要有自己的Blog,卻苦於一些制式Blog不是那麼討喜的人,能夠帶來一些幫助,少走一點冤枉路。那,我們馬上開始吧!
以下是本篇文章講解的順序,盡情挑選自己想看的重點吧!

  • Hexo是什麼?
  • 踏上旅途整理行李 -> Git與Node
  • 正式趟上Hexo旅途
  • 出發吧! Hexo
  • 屬於每個人的Hexo路
  • 結語

Hexo是什麼?

簡單來說,Hexo是一個部落格的框架,部落客只需要撰寫Markdown格式的檔案就可以上傳到自己的部落格上,當然在這之前需要自己先踏上名為Hexo的這條路,才可以享受一路上的風景。Hexo非常容易入門,更有相當多元的主題(模板)可以套用到自己的部落格上,以更客製化的方式。

Hexo為想要有自己部落格卻又不想使用現有市面部落格平台的人,無疑帶來許多好處,具有高度客製化外,還能夠享受自己架設網站的感覺。對於我自己來說,雖然不盡理想卻是一個現況最佳的作法,畢竟完完全全架起自己的網站,知識層面的時間成本就相當高,若再算上購買網域和虛擬主機,長期下來也是相當可觀的。


踏上旅途整理行李 Git與Node

執行Hexo需要使用到Git與Node,首先根據以下網址下載安裝對應電腦作業系統(OS)的檔案:

  1. 安裝Node.js https://nodejs.org/en/
  2. 安裝Git https://git-scm.com/downloads

Version

接下來會在Command Line(命令提示字元)上執行指令,以縮寫cmd代表Command Line,在macOS則是Terminal。
以上是我的Node和Git版本,檢驗是否成功在cmd輸入:

  • node –version
  • git –version

需要特別注意的是Hexo要求Node的版本必須高於 Node.js 10.13,官方推薦最好是 Node.js 12.0以上,安裝最新版的話基本上就沒有問題。


正式趟上Hexo旅途

成功安裝Node和Git後,我們可以直接在cmd執行以下的指令安裝Hexo:
> npm install -g hexo-cli (-g代表global)

若想單純安裝在專案的話則執行以下指令安裝Hexo:
> npm install hexo

在一切都平安無事安裝完後,讓我們正式來看看Hexo一路上有什麼特別的風景吧!
首先執行下方指令:
>hexo init <folder name> (init代表initialize: 初始化)
>cd <folder name>(cd代表change direcoty: 切換路徑)
>npm install (安裝需要的套件)

所謂的初始化是將既有的檔案回復預設的樣子,如果沒有檔案則建立檔案,把它想成手機的回復原廠設定就可以理解了,對吧!至於npm install則是會安裝我們在初始化hexo init時,產生一個叫做package.json的檔案裡面寫好的檔案,在執行後才會將所需的套件安裝到這個資料夾裡面,需要安裝的套件都寫在dependencies裡面。

package.json

不過在最新版Hexo執行初始化的時候,都會順便安裝完成,不執行npm install我想也是沒問題的!
接著可以看到建立好的資料夾(以下稱為專案)裡面的檔案有:

init

可以看到有許多的資料夾,在下一篇會介紹這些資料夾各自的意義和用途。
目前為止已經完成所需的準備了!


出發吧! Hexo

>hexo server (server別名 s)
上方指令代表啟動伺服器,執行後cmd上顯示

>hexo s
INFO Validating config
INFO Start processing
INFO Hexo is running at http://localhost:4000
在Chrome輸入localhost:4000,就可以看見以下驚奇的畫面!

localhost

恭喜你/妳,我們已經正式出發了!
接下來的問題是…怎麼在網路上連接到我們的網站呢?


屬於每個人的Hexox旅途

我們會使用Github Pages作為網域去架起Hexo的部落格,若不喜歡或不想要使用Github Pages當然也可以自己購買網域和主機,只是成本就會相對高一點,若未來有機會我們再針對這部分做討論。

首先註冊一個Github的帳號後,在建立Repository頁面輸入Repository的檔案名為:
/<username>.github.io

gitpage

完成後在cmd安裝發布Deployment的套件
git install hexo-deployer-git --save
再來修改**_config.yml組態文件**中修改url欄位與deploy部署的欄位為剛才在Github建立的Repository的名字

1
2
3
4
5
6
url: http://Mizukikouyou.github.io
permalink: :year/:month/:day/:title/
permalink_defaults:
pretty_urls:
trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
trailing_html: true # Set to false to remove trailing '.html' from permalinks
1
2
3
4
deploy:
type: git
repo: https://github.com/Mizukikouyou/Mizukikouyou.github.io
branch: main

最後執行以下的指令
>hexo d
就可以在你自己的github名稱的github.io裡面看到Git Pages與Hexo成功的搭載上去啦!
以上就是今天的Hexo系列文的第一篇!


結語

原本預期很快就可以完成第一篇文章,但卻在Github上面摔了一大跤,主要是在使用兩個不同的帳戶去做Deploy,卻一直遇到SSH的問題,測試了好幾種方法,最後卻還是沒辦法解決問題,折衷方案是先用Git Bash強硬推上去,卻遇到更詭異的問題,過幾天再找時間解決它!

我想成功建完Hexo的部落格多多少少會有一點成就感對吧!但,這只是一個開始,再接下來,讓我們一起研究怎麼客製化專屬於自己的Hexo部落格。辛苦看到結尾的你們,還有許多沒有提到,但礙於篇幅就留到下一篇吧!

若有任何缺失或錯誤,再煩請跟我說,謝謝您。


0%