{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021-11-13-gatsby-js-note/","result":{"data":{"site":{"siteMetadata":{"title":"Howard's Note","disqusShortname":""}},"markdownRemark":{"id":"6bb4a404-053b-5d76-a572-17531ca9f628","html":"<h2>Static site generactor</h2>\n<p>根據wiki <code class=\"language-text\">Web template system</code> 條目，Static site generactor (SSG) 指的是可能有使用 tepmlate lanugage、可以用來產生網頁、不用重撰相同內容的工具。\n除了重覆的網頁內容外，可能也包含CSS，例如 FrontPage 和 Dreamweaver 這種網頁編輯器。</p>\n<p>SSG 不是近幾年才產生的概念。例如 Jekyll，非常流行的SSG，早在2008年的時候就已經誕生了。</p>\n<p>SSG是前端的其中一種解決方案，選用不同的技術當前端的解決方案時，應該選擇最適合問題本身的方案，沒有所謂的最佳解。</p>\n<p>GatsbyJs 是個基於 js、react 的SSG框架。</p>\n<h2>JAMStack</h2>\n<p>JAMStack 指的是使用 <code class=\"language-text\">javascript</code>、<code class=\"language-text\">API</code>、<code class=\"language-text\">Markup</code>的技術線。所謂的<code class=\"language-text\">Markup</code>，在這裡指的是包含一些已經被事先定義好「顯示語義」的標記語言。例如Html就是在網頁中被廣範使用的 Markup stack。</p>\n<p>JAMStack 會有一種特徴：程式的邏輯大多會在client端，而不緊緊依賴 backend。</p>\n<p>這幾年講到JAMStack，M有時指的是 <code class=\"language-text\">Markdown</code>。</p>\n<p>GatsbyJs 捏供 plugin，可以用 Markdown 來寫網頁內容。</p>\n<h2>GatsbyJS基本架構</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8243259cbaa2ea1609f372b019cc4517/e5ca1/gatsby-architecture.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABOUlEQVQoz51Ty07EMAzc//8JfoILf8CJ+x44ICSkhaXv5u0Yj9PQ7ipcsGRFsT3jcZ2ecs6ciDikyF48UGKSGGXSU/O55Es83+RRH2jPnQTCXgJjMNyHlUdvtBgkIIMB0Lvlt0EVAZukfvCrxpRQ1dnEbgm8dJa9iTtA+Crp0arq+5wSEgidEBohHK2eiEHlkeDeK2F1NC+EDQUpEceUOHrxkJoqlZAbCgG2s+fxunJ3mXn6NpxiUfj08MLPj2ctHr5WHj4X7qUGk2hDabYMVjFuDYrRkUkIgpcNu6iqqsL385Uvb0NZjOS8La41VEbGfepkkZQ3wsN3QDCLgxAAqJ57wy2rI0Pxx2vH6+T0vo0cdDEAoztUA6BdKTcXU5eCsVVApH0pzS1u7wxd/8q3n83h9eebP+F//gMRfmLb13vsmwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"gatsby architecture\"\n        title=\"gatsby architecture\"\n        src=\"/static/8243259cbaa2ea1609f372b019cc4517/f058b/gatsby-architecture.png\"\n        srcset=\"/static/8243259cbaa2ea1609f372b019cc4517/c26ae/gatsby-architecture.png 158w,\n/static/8243259cbaa2ea1609f372b019cc4517/6bdcf/gatsby-architecture.png 315w,\n/static/8243259cbaa2ea1609f372b019cc4517/f058b/gatsby-architecture.png 630w,\n/static/8243259cbaa2ea1609f372b019cc4517/40601/gatsby-architecture.png 945w,\n/static/8243259cbaa2ea1609f372b019cc4517/78612/gatsby-architecture.png 1260w,\n/static/8243259cbaa2ea1609f372b019cc4517/e5ca1/gatsby-architecture.png 1332w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>GatsbyJS 是一個 SSG框架，本身使用React做為視圖層。在資料來源層，使用了 <code class=\"language-text\">GraphQL</code> 做了一層抽象。除了框架本身會自動從指定的檔案路徑內取得內容外，<code class=\"language-text\">GraphQL</code> 社群也提供了非常多的 <code class=\"language-text\">plugin</code>，用來取得、解析資料。例如<code class=\"language-text\">gatsby-transformer-remark</code>，可以用來解析 <code class=\"language-text\">markdown</code>。</p>\n<p>GatsbyJS 主要的程式設定檔有三個：</p>\n<ul>\n<li>gatsby-config.js</li>\n<li>gatsby-node.js</li>\n<li>gatsby-browser.js</li>\n</ul>\n<p>另外 <code class=\"language-text\">src/pages</code> 資料夾底下的檔案，會被 <code class=\"language-text\">File System Route</code> API 自動解析，產生對應的網頁內容。</p>\n<p>目前三個預設的js，似乎都還不支援 EMCAscript module，必須使用 <code class=\"language-text\">common script</code> 撰寫。</p>\n<h3>gatsby-config.js</h3>\n<p>gatsby-config.js 裡面包含了跟框架及網頁有關的設定檔。包含使用的 plugins、proxy、 siteMetaData等等。</p>\n<p>其中 <code class=\"language-text\">plugins</code>的使用很重要，可以從豐富的 plugin librarys 中，找到很多有用的 plugin，加速網站的開發、或是增加網站的功能等。</p>\n<p><code class=\"language-text\">siteMetaData</code> 可以用來存放一些 meta資訊，例如作者、email等等資訊。</p>\n<h3>gatsby-browser.js</h3>\n<p>gatsby-browser.js 中包含一些在Browser中、框架定義的事件，例如 <code class=\"language-text\">onClientEntry</code>。另外也可以攜代一些網頁元件當作全域的元件。</p>\n<h3>gatsby-node.js</h3>\n<p>gatsby-cnode.js 相對復雜，它包含了產生頁面、產生gastby field 的 API、及在建置階段中的一些事件處理。之後再整理一下它的API。</p>\n<blockquote>\n<p>懶了好久，剛剛看一下突然發現我寫錯好久…</p>\n</blockquote>","frontmatter":{"title":"Hello, gatsby","date":"November 13, 2021","description":null,"tags":["gatsby"],"template":"post"}}},"pageContext":{"slug":"/2021-11-13-gatsby-js-note/","previous":{"node":{"fields":{"slug":"/2020-10-16--Ref_note.md/2020-10-16--Ref_note/"},"frontmatter":{"date":"16 October, 2020","title":"rust RefCell、Cell筆記","tags":["rust","archive"]}}},"next":{"node":{"fields":{"slug":"/2021-11-20-gatsby-js-config/"},"frontmatter":{"date":"20 November, 2021","title":"gatsby config api","tags":["gatsby"]}}}}},"staticQueryHashes":["2841359383","3810545343","916993862"]}