{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021-11-20-gatsby-js-config/","result":{"data":{"site":{"siteMetadata":{"title":"Howard's Note","disqusShortname":""}},"markdownRemark":{"id":"d02f29a1-265d-5f85-bf07-3553a7e186f5","html":"<h1>gatsby config api</h1>\n<p>gatsby 包含了一個<code class=\"language-text\">gatsby-config.js</code>，可以提供以下設定：</p>\n<ul>\n<li>siteMetaData</li>\n<li>plugin</li>\n<li>mapping</li>\n<li>flags</li>\n<li>pathPrefix</li>\n<li>polyfill</li>\n<li>Proxy</li>\n<li>developmentMiddleware</li>\n</ul>\n<p> 此config檔僅支援commonJs。</p>\n<h2>siteMetaData</h2>\n<p>可以定義一些各頁面間共享的參數。gatsby會產生一個 graphQL的 <code class=\"language-text\">field</code> 叫做 <code class=\"language-text\">siteMetaData</code>，供各頁面查詢。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">siteMetadata</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Gatsby</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">siteUrl</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://www.gatsbyjs.com</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">description</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Blazing fast modern site generator for React</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>plugin</h2>\n<p>gatsby 不支援直接使用 <code class=\"language-text\">npm</code>安裝插件。如果要使用gatsby的插件，必須在<code class=\"language-text\">gatsby-config.js</code>底下定義要使用的插件。</p>\n<p><code class=\"language-text\">plugin</code> 是一個 Array。可以直接使用string指定要使用的插件名稱：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-plugin-name</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>若該插件支援option，也可以傳入包含<code class=\"language-text\">options</code>的object：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">resolve</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-plugin-name</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">optionA</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">optionB</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Another option</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>plugin 欄位也可以是混合的 array。可以混合不需要指定option的 plugin (型別為string)以及需要指定option的plugin（型別為object）：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-transform-plugin</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">resolve</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-plugin-name</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">optionA</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">optionB</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Another option</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>flag</h2>\n<p>設定flag可以指定開啟一些正在實驗中的功能。</p>\n<h2>pathPrefix</h2>\n<p>pathPrefix可以加入產生的網頁路由前綴。</p>\n<h2>Polyfill</h2>\n<p>gatsbyjs 使用 es6的 promise api。預設為未支援promise的瀏覽器提供了polyfill。如果要提供自已版本的 Promise polyfill，可以將此flag 設為 false。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">polyfill</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>mapping node type</h2>\n<blockquote>\n<p>官方建議使用 <code class=\"language-text\">@Link</code> grapthQL directives\n<a href=\"https://www.gatsbyjs.com/docs/reference/graphql-data-layer/schema-customization/#foreign-key-fields\">https://www.gatsbyjs.com/docs/reference/graphql-data-layer/schema-customization/#foreign-key-fields</a></p>\n</blockquote>\n<p><code class=\"language-text\">mapping</code> 屬性支援將不同來源的資料做 mapping。</p>\n<p>在資料 mapping 前。要先確定是否有裝該資料來源的 transformer (i.e. transformer of yaml, json… )，並且設定<code class=\"language-text\">gatsby-source-filesystem</code>讓gatsby可以正確取得mapping 檔案。</p>\n<p>以下範例，假設一個多作者協同的blog，有一個 <code class=\"language-text\">author.yaml</code>：</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Kyle Mathews\n  <span class=\"token key atrule\">bio</span><span class=\"token punctuation\">:</span> Founder @ GatsbyJS. Likes tech<span class=\"token punctuation\">,</span> reading/writing<span class=\"token punctuation\">,</span> founding things. Blogs at bricolage.io.\n  <span class=\"token key atrule\">twitter</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@kylemathews\"</span></code></pre></div>\n<p>markdown 的 frontmatter：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">---\ntitle: A blog post\nauthor: Kyle Mathews\n---</code></pre></div>\n<p>設定 author 的 mapping 關係：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">mapping</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"MarkdownRemark.frontmatter.author\"</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">AuthorYaml.name</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>gatsby 產生的gruaphql query便提供了兩個資料來源的 mapping 供查詢：</p>\n<div class=\"gatsby-highlight\" data-language=\"graphql\"><pre class=\"language-graphql\"><code class=\"language-graphql\"><span class=\"token keyword\">query</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$slug</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">String</span><span class=\"token operator\">!</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property-query\">markdownRemark</span><span class=\"token punctuation\">(</span><span class=\"token attr-name\">fields</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token attr-name\">slug</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token attr-name\">eq</span><span class=\"token punctuation\">:</span> <span class=\"token variable\">$slug</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">html</span>\n    <span class=\"token object\">fields</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">slug</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token object\">frontmatter</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">title</span>\n      <span class=\"token object\">author</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\"># This now links to the author object</span>\n        <span class=\"token property\">name</span>\n        <span class=\"token property\">bio</span>\n        <span class=\"token property\">twitter</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>mapping 也可以用來mapping 一個包含外來鍵（ids）的array到其它的 collection of data。</p>\n<p>例如：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// experement.js</span>\n<span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"companyA\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"company\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Company A\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"position\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Unicorn Developer\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"from\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Dec 2016\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"to\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Present\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span>\n        <span class=\"token string-property property\">\"label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Responsibility\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Being an unicorn\"</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span>\n        <span class=\"token string-property property\">\"label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Hands on\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string-property property\">\"tech\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"REACT\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"NODE\"</span><span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// tech.js</span>\n<span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"REACT\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"icon\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"facebook\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"color\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"teal\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"React\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"NODE\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"icon\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"server\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"color\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"green\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"NodeJS\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>在<code class=\"language-text\">gatsby-config.js</code> 設定規則：</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">mapping</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">'ExperienceJson.items.tech'</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">TechJson.name</span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>可以查詢 tech 與它關聯的項目：</p>\n<div class=\"gatsby-highlight\" data-language=\"graphql\"><pre class=\"language-graphql\"><code class=\"language-graphql\"><span class=\"token keyword\">query</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token object\">allExperienceJson</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token object\">edges</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token object\">node</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">company</span>\n        <span class=\"token property\">position</span>\n        <span class=\"token property\">from</span>\n        <span class=\"token property\">to</span>\n        <span class=\"token object\">items</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token property\">label</span>\n          <span class=\"token property\">description</span>\n          <span class=\"token property\">link</span>\n          <span class=\"token object\">tech</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">label</span>\n            <span class=\"token property\">color</span>\n            <span class=\"token property\">icon</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Proxy</h2>\n<p>告訴開發server將request導到指定的server。</p>\n<h2>developMiddleware</h2>\n<p>加速開發的設定。</p>\n<ul>\n<li>jsxRuntime</li>\n</ul>\n<p>將此屬性設定為 <code class=\"language-text\">automatic</code>，可以在開發時直接使用 jsx，而不需手動import react。</p>\n<ul>\n<li>jsxImportSource</li>\n</ul>\n<p>可以指定gatsby使用特定的jsx transformer。例如若使用 <code class=\"language-text\">@emotion/react</code>，可以如下設定：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">jsxImportSource</span><span class=\"token operator\">:</span> <span class=\"token string\">\"@emotion/react\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>如此預設的 jsx runtime 就會變成 @emotion/react了。</p>","frontmatter":{"title":"gatsby config api","date":"November 20, 2021","description":null,"tags":["gatsby"],"template":"post"}}},"pageContext":{"slug":"/2021-11-20-gatsby-js-config/","previous":{"node":{"fields":{"slug":"/2021-11-13-gatsby-js-note/"},"frontmatter":{"date":"13 November, 2021","title":"Hello, gatsby","tags":["gatsby"]}}},"next":{"node":{"fields":{"slug":"/2021-12-03-python-note/"},"frontmatter":{"date":"03 December, 2021","title":"Python Note","tags":["python"]}}}}},"staticQueryHashes":["2841359383","3810545343","916993862"]}