{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: FidelVe","description":"The latest articles on DEV Community by FidelVe (@fidelve).","link":"https:\/\/dev.to\/fidelve","image":{"url":"https:\/\/media2.dev.to\/dynamic\/image\/width=90,height=90,fit=cover,gravity=auto,format=auto\/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F239867%2Fcb6fb00c-0731-4700-89bf-29d57a9ef127.jpeg","title":"DEV Community: FidelVe","link":"https:\/\/dev.to\/fidelve"},"language":"en","item":[{"title":"Interacting with ICON Bridge contracts (proxy contracts) on EVM chains.","pubDate":"Sat, 22 Oct 2022 17:59:10 +0000","link":"https:\/\/dev.to\/espanicon\/interacting-with-icon-bridge-contracts-proxy-contracts-on-evm-chains-19fd","guid":"https:\/\/dev.to\/espanicon\/interacting-with-icon-bridge-contracts-proxy-contracts-on-evm-chains-19fd","description":"<p>The ICON Network is a decentralized blockchain project from South Korea with the goal of becoming a hub for interconnecting many other blockchains with its <a href=\"https:\/\/medium.com\/helloiconworld\/blockchain-transmission-protocol-btp-explained-c4d9927ad398\">BTP technology<\/a>, it currently hosts many Dapps (Decentralized Apps) ranging from NFT games and platforms ( like <a href=\"https:\/\/gangstabet.io\/\">gangstabet<\/a>, <a href=\"https:\/\/craft.network\/\">Craft Network<\/a>, <a href=\"https:\/\/projectnebula.app\/\">Project Nebula<\/a>, etc) to DeFi platforms (like <a href=\"https:\/\/balanced.network\/\">Balanced Network<\/a>, <a href=\"https:\/\/omm.finance\/\">OMM Finance<\/a> and <a href=\"https:\/\/optimus.finance\/\">Optimus Finance<\/a>) and even a fully decentralized casino running entirely on smart contracts (<a href=\"https:\/\/iconbet.io\/\">ICONBet<\/a>).<\/p>\n\n<p>In this tutorial we will learn to interact with <a href=\"https:\/\/medium.com\/helloiconworld\/introducing-icon-bridge-f8d3f2d93bf8\">ICON Bridge<\/a> a chain-agnostic bridge that is able to interconnect any blockchain that supports smart contracts.<\/p>\n\n<h2>\n  \n  \n  ICON Bridge on EVM Chains\n<\/h2>\n\n<p>Proxy contracts on EVM chains <strong>stores the address of the logic contract and delegates all function calls to the logic contract<\/strong> (which holds the business logic) using the <em>delegatecall<\/em> function. After the call is forwarded to the logic contract, the returned data from the logic contract is retrieved and returned to the user.<\/p>\n\n<p>As a practical example lets interact with the <a href=\"https:\/\/github.com\/icon-project\/icon-bridge\/blob\/main\/docs\/testnet_deployment.json\">BTS contract on the BSC testnet<\/a> using javascript (web3.js).<\/p>\n\n<ul>\n<li>BTS proxy contract: 0x1a2aDf985D6c2700fdAf72A9c1e2b39e3B647F7e<\/li>\n<li>BTS logic contract: 0xE020d4aD483C7eC90a24d9db502e66564eF9c236<\/li>\n<\/ul>\n\n<p>To interact with the BTS contract is necessary to <strong>call the proxy contract directly and the proxy contract will pass the call to the logic contract<\/strong>.<\/p>\n\n<p>Using web3.js we can do this with the following method call:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Web3<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">web3<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">bscTestnetWeb3<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Web3<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/data-seed-prebsc-1-s1.binance.org:8545<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">BTSLogicContractAddress<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">0xE020d4aD483C7eC90a24d9db502e66564eF9c236<\/span><span class=\"dl\">\"<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">BTSLogicContractABI<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span> <span class=\"c1\">\/\/ at this point this data is unkown<\/span>\n\n<span class=\"c1\">\/\/ This next line will return in an error because we dont have the ABI<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">contractObject<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">bscTestnetWeb3<\/span><span class=\"p\">.<\/span><span class=\"nx\">eth<\/span><span class=\"p\">.<\/span><span class=\"nx\">Contract<\/span><span class=\"p\">(<\/span><span class=\"nx\">BTSLogicContractABI<\/span><span class=\"p\">,<\/span> <span class=\"nx\">BTSLogicContractAddress<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see in the previous code example we still need one variable, the <code>BTSLogicContractABI<\/code> in order to create the contract object that we are going to use to interact with the ICON Bridge using web3.js.<\/p>\n\n<p>On EVM chains the ABI data is not available on chain, there are 2 ways to obtain that data:<\/p>\n\n<ul>\n<li>Compile the contract yourself and obtain the ABI.<\/li>\n<li>Fetch the ABI directly from somewhere else. This is generally done using trackers in the specific chain you are trying to interact.<\/li>\n<\/ul>\n\n<p>For this example you can fetch the ABI data directly from the bscscan tracker either using the <code>https<\/code> module on <code>nodejs<\/code> or a <code>fetch<\/code> call with js in the browser. The following is an example of getting the ABI with <code>curl<\/code> from a shell:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>curl <span class=\"s2\">\"https:\/\/api-testnet.bscscan.com\/api?module=contract&amp;action=getabi&amp;address=0xE020d4aD483C7eC90a24d9db502e66564eF9c236&amp;format=raw\"<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Is important to notice that we are getting the ABI of the <code>BTSLogicContract<\/code> and not the ABI of the <code>BTSProxyContract<\/code>, as explained previously, <strong>the correct ABI with the methods to interact with the ICON Bridge (or any evm proxy contract pattern) are on the logic contract not on the proxy contract<\/strong>, but you have to make the query to the proxy contract because this is the one that will forward this call to the logic contract and handle the proper reply back.<\/p>\n\n<p>Once we have the proper ABI data we can continue creating the contract object and making the method calls that we wish to make to the BTS proxy contract.<\/p>\n\n<p>The following is a working example using <code>nodejs<\/code> (is necessary to previously install the <code>web3<\/code> library)<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">https<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>                                                    \n<span class=\"kd\">const<\/span> <span class=\"nx\">Web3<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">web3<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>                                                      \n\n<span class=\"c1\">\/\/ wrapping everything in an async function to handle the data request             <\/span>\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">asyncRun<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>                                                        \n  <span class=\"kd\">const<\/span> <span class=\"nx\">bscTestnetWeb3<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Web3<\/span><span class=\"p\">(<\/span>                                                 \n    <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/data-seed-prebsc-1-s1.binance.org:8545<\/span><span class=\"dl\">\"<\/span>                               \n  <span class=\"p\">);<\/span>                                                                               \n  <span class=\"c1\">\/\/ ABI and address of both proxy and logic contract                              <\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">BTSProxyContractAddress<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">0x1a2aDf985D6c2700fdAf72A9c1e2b39e3B647F7e<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>    \n  <span class=\"kd\">const<\/span> <span class=\"nx\">BTSLogicContractAddress<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">0xE020d4aD483C7eC90a24d9db502e66564eF9c236<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>    \n  <span class=\"kd\">const<\/span> <span class=\"nx\">BTSProxyContractABI<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">asyncABIRequest<\/span><span class=\"p\">(<\/span><span class=\"nx\">BTSProxyContractAddress<\/span><span class=\"p\">);<\/span>      \n  <span class=\"kd\">const<\/span> <span class=\"nx\">BTSLogicContractABI<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">asyncABIRequest<\/span><span class=\"p\">(<\/span><span class=\"nx\">BTSLogicContractAddress<\/span><span class=\"p\">);<\/span>      \n\n  <span class=\"c1\">\/\/ Web3 Contract Object of the BTS logic contract                                <\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">contractObject<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">bscTestnetWeb3<\/span><span class=\"p\">.<\/span><span class=\"nx\">eth<\/span><span class=\"p\">.<\/span><span class=\"nx\">Contract<\/span><span class=\"p\">(<\/span>                          \n    <span class=\"nx\">BTSLogicContractABI<\/span><span class=\"p\">,<\/span>                                                           \n    <span class=\"nx\">BTSLogicContractAddress<\/span>                                                        \n  <span class=\"p\">);<\/span>                                                                               \n\n  <span class=\"c1\">\/\/ encoding a call to a readonly method named 'getNativeCoinName'                <\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">getNativeCoinName<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">contractObject<\/span><span class=\"p\">.<\/span><span class=\"nx\">methods<\/span><span class=\"p\">.<\/span><span class=\"nx\">getNativeCoinName<\/span><span class=\"p\">();<\/span>            \n  <span class=\"kd\">const<\/span> <span class=\"nx\">encodedData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">getNativeCoinName<\/span><span class=\"p\">.<\/span><span class=\"nx\">encodeABI<\/span><span class=\"p\">();<\/span>                               \n\n  <span class=\"c1\">\/\/ making a readonly call   <\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">nativeCoinNameCallResponse<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">bscTestnetWeb3<\/span><span class=\"p\">.<\/span><span class=\"nx\">eth<\/span><span class=\"p\">.<\/span><span class=\"nx\">call<\/span><span class=\"p\">({<\/span>        <span class=\"p\">[<\/span><span class=\"mi\">26<\/span><span class=\"o\">\/<\/span><span class=\"mi\">53<\/span><span class=\"p\">]<\/span>\n    <span class=\"na\">to<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BTSProxyContractAddress<\/span><span class=\"p\">,<\/span>                                                   \n    <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">encodedData<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"c1\">\/\/ parsing the hex response into utf8<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">parsedResponse<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">bscTestnetWeb3<\/span><span class=\"p\">.<\/span><span class=\"nx\">utils<\/span><span class=\"p\">.<\/span><span class=\"nx\">toUtf8<\/span><span class=\"p\">(<\/span>\n    <span class=\"nx\">nativeCoinNameCallResponse<\/span>\n  <span class=\"p\">);<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">parsedResponse<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Running the async example<\/span>\n<span class=\"nx\">asyncRun<\/span><span class=\"p\">();<\/span>\n\n\n\n<span class=\"c1\">\/\/ the following is a function to handle the request asynchronously created only<\/span>\n<span class=\"c1\">\/\/ to illustrate the example, it works \"as is\" but doesnt handle many things<\/span>\n<span class=\"c1\">\/\/ that you should handle when writing production code in an app (timeout, proper<\/span>\n<span class=\"c1\">\/\/ data on error, etc)<\/span>\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">asyncABIRequest<\/span><span class=\"p\">(<\/span><span class=\"nx\">contractAddress<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">asyncQuery<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">ABIRequest<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nx\">request<\/span><span class=\"p\">(<\/span>\n      <span class=\"p\">{<\/span>\n        <span class=\"na\">hostname<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">api-testnet.bscscan.com<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`\/api?module=contract&amp;action=getabi&amp;address=<\/span><span class=\"p\">${<\/span><span class=\"nx\">contractAddress<\/span><span class=\"p\">}<\/span><span class=\"s2\">&amp;format\n=raw`<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"nx\">res<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ process chunked data<\/span>\n        <span class=\"kd\">let<\/span> <span class=\"nx\">rawData<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">chunk<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">rawData<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">});<\/span>\n\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">const<\/span> <span class=\"nx\">parsedData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">rawData<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">parsedData<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`error making async query: <\/span><span class=\"p\">${<\/span><span class=\"nx\">err<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">reject<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">);<\/span>\n\n    <span class=\"nx\">ABIRequest<\/span><span class=\"p\">.<\/span><span class=\"nx\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">error<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Error on request: <\/span><span class=\"p\">${<\/span><span class=\"nx\">error<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"nx\">ABIRequest<\/span><span class=\"p\">.<\/span><span class=\"nx\">end<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">asyncQuery<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n","category":["crypto","javascript","tutorial","web3"]},{"title":"ICON Network and JavaScript: How to interact with the ICON Blockchain with JS (node.js)","pubDate":"Thu, 03 Feb 2022 11:31:40 +0000","link":"https:\/\/dev.to\/espanicon\/icon-network-and-javascript-how-to-interact-with-the-icon-blockchain-with-js-nodejs-547c","guid":"https:\/\/dev.to\/espanicon\/icon-network-and-javascript-how-to-interact-with-the-icon-blockchain-with-js-nodejs-547c","description":"<p>The ICON Network is a decentralized blockchain project from South Korea with the goal of becoming a hub for interconnecting many other blockchains with its <a href=\"https:\/\/medium.com\/helloiconworld\/blockchain-transmission-protocol-btp-explained-c4d9927ad398\">BTP technology<\/a>, it currently hosts many Dapps (Decentralized Apps) ranging from NFT games and platforms ( like <a href=\"https:\/\/gangstabet.io\/\">gangstabet<\/a>, <a href=\"https:\/\/craft.network\/\">Craft Network<\/a>, <a href=\"https:\/\/projectnebula.app\/\">Project Nebula<\/a>, etc) to DeFi platforms (like <a href=\"https:\/\/balanced.network\/\">Balanced Network<\/a>, <a href=\"https:\/\/omm.finance\/\">OMM Finance<\/a> and <a href=\"https:\/\/optimus.finance\/\">Optimus Finance<\/a>) and even a fully decentralized casino running entirely on smart contracts (<a href=\"https:\/\/iconbet.io\/\">ICONBet<\/a>).<\/p>\n\n<p>This is the first article in a series dedicated to show how to interact with the ICON Network using <a href=\"https:\/\/nodejs.org\/en\/\">nodejs<\/a>. While the article is directed to people that have no prior knowledge of how to interact with smarts contracts on ICON or any other blockchain project, it is necessary to have a prior knowledge of coding with JavaScript (specially asynchronous programming with JavaScript) and nodejs (knowing how to use modules is necessary).<\/p>\n\n<h2>\n  \n  \n  Understanding the JSON RPC API\n<\/h2>\n\n<p>All your interactions with the ICON Network and the different smart contracts in the chain are going to be done via a <em>JSON RPC API<\/em>.<\/p>\n\n<p>The JSON RPC API is a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Remote_procedure_call\">remote procedure call<\/a> encoded in <a href=\"https:\/\/en.wikipedia.org\/wiki\/JSON\">JSON<\/a>, to put it in simple terms, you are going to be sending data in a predefined schema or format to a smart contract in the ICON Network and if all goes well you'll be receiving a reply with the data you asked (if things don't go well you'll still receive an error reply too).<\/p>\n\n<p>This is the description of the <a href=\"https:\/\/www.icondev.io\/references\/reference-manuals\/icon-json-rpc-api-v3-specification\">ICON JSON RPC API V3<\/a> and this is how a common call and response would look like.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/ Request\n{\n    \"jsonrpc\": \"2.0\",\n    \"method\": \"$STRING1\",\n    \"id\": $INT,\n    \"params\": {\n        \"$KEY1\": \"$VALUE1\",\n        \"$KEY2\": {\n            \"method\": \"$STRING2\",\n            \"params\": {\n                \"$KEY3\": \"$VALUE3\"\n            }\n        }\n    }\n}\n\n\/\/ Response - success\n{\n    \"jsonrpc\": \"2.0\",\n    \"id\": $INT,\n    \"result\": \"$STRING\"\n    \/\/ or\n    \"result\": {\n      \"$KEY1\": \"$VALUE1\",\n      \"$KEY2\": \"$VALUE2\"\n    }\n}\n\n\/\/ Response - error\n{\n    \"jsonrpc\": \"2.0\",\n    \"id\": $INT1,\n    \"error\": {\n        \"code\": $INT2,\n        \"message\": \"$STRING\"\n    }\n}\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>The communication to the ICON Network is done from your code (any script or Dapp you build) to a citizen node (which is basically a full node with no governance participation in the network, a silent listener of the chain) an then to an active governance node (called Public Representatives or P-Reps) that is in charge to act up or process the interactions and\/or transactions you are going to be making and then it propagates those changes to the entire network. The following diagram shows these interaction.<\/p>\n\n<p><a href=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--hgk4t5PD--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/dev-to-uploads.s3.amazonaws.com\/uploads\/articles\/khla470mg1923r1xoq8r.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--hgk4t5PD--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/dev-to-uploads.s3.amazonaws.com\/uploads\/articles\/khla470mg1923r1xoq8r.png\" alt=\"Talking with the ICON Network via the JSON RPC API\" width=\"774\" height=\"545\"><\/a> <sup><a href=\"https:\/\/medium.com\/helloiconworld\/icon-deconstructed-5eb7f99eeeb1\">Image taken from the \"ICON Deconstructed Part III\" article on Medium<\/a><\/sup><\/p>\n\n<h2>\n  \n  \n  Things to know before talking to the chain, the https module and JS promises\n<\/h2>\n\n<p>As shown in the previous image there are several SDK in different languages that you can use but for the purpose of this article and because we are going to start with simple things we will be doing the communication directly via HTTPS requests.<\/p>\n\n<p>Now that we know what is the language that we will be using to communicate to the ICON Network (JSON RPC API), there is one important piece of code that we need to write which will become our main module to talk to the ICON Network and that is an HTTPS request wrapped in a promise to allow for asynchronous interactions with the network.<\/p>\n\n<p>Assuming that you already have <a href=\"https:\/\/nodejs.org\/en\/download\/\">nodejs<\/a> installed in your computer, go and create a folder and then run <code>npm init<\/code> to create a new project. The folder structure in the project is going to look like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>dev.to-article\/\n\u251c\u2500\u2500 httpsRequest.js\n\u251c\u2500\u2500 index.js\n\u2514\u2500\u2500 package.json\n\n0 directories, 3 files\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>We are going to start working on the <code>httpsRequest.js<\/code> file. The content is pretty straightforward we import the <code>https<\/code> module, create an <code>async function<\/code> wrap the <code>https request<\/code> inside this function and execute it using <code>await<\/code> to get the response from the network and then at the end we export the <code>httpsRequest<\/code> async function as a module.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\/\/ httpsRequest.js\n\/\/ This module is a https request wrapped <span class=\"k\">in <\/span>a promise design to be used\n\/\/ to interact with the ICON Blockchain\n\/\/\n\/\/ Imports\nconst https <span class=\"o\">=<\/span> require<span class=\"o\">(<\/span><span class=\"s2\">\"https\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n\n\/<span class=\"k\">**<\/span>\n <span class=\"k\">*<\/span> async https request wrapped <span class=\"k\">in <\/span>a promise\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>Object<span class=\"o\">}<\/span> param - params <span class=\"k\">for <\/span>the http request\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>string<span class=\"o\">}<\/span> param.hostname\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>string<span class=\"o\">}<\/span> param.ip\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>number<span class=\"o\">}<\/span> param.port\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>number<span class=\"o\">}<\/span> param.timeout\n <span class=\"k\">*<\/span> @param <span class=\"o\">{<\/span>string<span class=\"o\">}<\/span> param.path\n <span class=\"k\">*<\/span>\/\nasync <span class=\"k\">function <\/span>httpsRequest<span class=\"o\">(<\/span>params, data <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n  const promisifiedQuery <span class=\"o\">=<\/span> new Promise<span class=\"o\">((<\/span>resolve, reject<span class=\"o\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n    const query <span class=\"o\">=<\/span> https.request<span class=\"o\">(<\/span>params, res <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n      \/\/ Print status code on console\n      console.log<span class=\"o\">(<\/span><span class=\"s2\">\"Status Code: \"<\/span> + res.statusCode<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n\n      \/\/ Process chunked data\n      <span class=\"nb\">let <\/span>rawData <span class=\"o\">=<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">;<\/span>\n      res.on<span class=\"o\">(<\/span><span class=\"s2\">\"data\"<\/span>, chunk <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n        rawData +<span class=\"o\">=<\/span> chunk<span class=\"p\">;<\/span>\n      <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n\n      \/\/ when request completed, pass the data to the <span class=\"s1\">'resolve'<\/span> callback\n      res.on<span class=\"o\">(<\/span><span class=\"s2\">\"end\"<\/span>, <span class=\"o\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nb\">let <\/span>data <span class=\"o\">=<\/span> JSON.parse<span class=\"o\">(<\/span>rawData<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n        resolve<span class=\"o\">(<\/span>data<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n      <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n\n      \/\/ <span class=\"k\">if <\/span>error, print on console\n      res.on<span class=\"o\">(<\/span><span class=\"s2\">\"error\"<\/span>, err <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n        console.log<span class=\"o\">(<\/span><span class=\"s2\">\"Got error: \"<\/span>, +err.message<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n      <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n    <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n    \/\/ If request <span class=\"nb\">timeout <\/span>destroy request\n    query.on<span class=\"o\">(<\/span><span class=\"s2\">\"timeout\"<\/span>, <span class=\"o\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n      console.log<span class=\"o\">(<\/span><span class=\"s2\">\"timeout. destroying query\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n      query.destroy<span class=\"o\">()<\/span><span class=\"p\">;<\/span>\n    <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n    \/\/ Handle query error\n    query.on<span class=\"o\">(<\/span><span class=\"s2\">\"error\"<\/span>, err <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n      console.log<span class=\"o\">(<\/span><span class=\"s2\">\"error running query, passing error to callback reject\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n      reject<span class=\"o\">(<\/span>err<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n    <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span>data <span class=\"o\">!=<\/span> <span class=\"nb\">false<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n      \/\/ If data param is passed into <span class=\"k\">function <\/span>we write the data\n      query.write<span class=\"o\">(<\/span>data<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n    <span class=\"o\">}<\/span>\n    \/\/ end request\n    query.end<span class=\"o\">()<\/span><span class=\"p\">;<\/span>\n  <span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n  \/\/ <span class=\"nb\">wait <\/span><span class=\"k\">for <\/span>the response and <span class=\"k\">return <\/span>it\n  try <span class=\"o\">{<\/span>\n    <span class=\"k\">return <\/span>await promisifiedQuery<span class=\"p\">;<\/span>\n  <span class=\"o\">}<\/span> catch <span class=\"o\">(<\/span>err<span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    console.log<span class=\"o\">(<\/span><span class=\"s2\">\"error while running promisifiedQuery\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n    console.log<span class=\"o\">(<\/span>err<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\nmodule.exports <span class=\"o\">=<\/span> httpsRequest<span class=\"p\">;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Talking to the governance smart contract on the ICON Network\n<\/h2>\n\n<p>On the <code>index.js<\/code> file we are going to start by importing the <code>httpsRequest.js<\/code> module and then start creating the JSON RPC formatted request we will be sending to the ICON network.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\/\/ index.js\nconst httpsRequest <span class=\"o\">=<\/span> require<span class=\"o\">(<\/span><span class=\"s1\">'.\/httpsRequest.js'<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n\n\/\/ These are the params of the https request\nconst PARAMS <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n  <span class=\"nb\">hostname<\/span>: <span class=\"s1\">'api.icon.geometry.io'<\/span>, \/\/ This is a citizen node <span class=\"k\">in <\/span>the network\n  path: <span class=\"s1\">'\/api\/v3'<\/span>,\n  method: <span class=\"s1\">'POST'<\/span> \/\/ all https request to the network are POST requests\n<span class=\"o\">}<\/span><span class=\"p\">;<\/span>\n\n\/\/ This is the JSON RPC formatted call we are sending to the network\nconst DATA <span class=\"o\">=<\/span> JSON.stringify<span class=\"o\">({<\/span>\n  jsonrpc: <span class=\"s1\">'2.0'<\/span>,\n  method: <span class=\"s1\">'icx_call'<\/span>,\n  <span class=\"nb\">id<\/span>: 1,\n  params: <span class=\"o\">{<\/span>\n    to: <span class=\"s1\">'cx0000000000000000000000000000000000000000'<\/span>,\n    dataType: <span class=\"s1\">'call'<\/span>,\n    data: <span class=\"o\">{<\/span>\n      method: <span class=\"s1\">'getPReps'<\/span>,\n      params: <span class=\"o\">{<\/span>\n        startRanking: <span class=\"s1\">'0x1'<\/span>,\n        endRanking: <span class=\"s1\">'0x16'<\/span>\n      <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>In this specific example we are interacting with the governance smart contract in the ICON Network (<code>cx000...<\/code>) and calling the method <code>getPReps<\/code>, this will allow us to get a list of the P-Reps (node validators) in the network, also since there are more than 100 P-Reps in the network we are passing a <code>startRanking<\/code> and <code>endRanking<\/code> values to get only the top 22 P-Reps by delegation in the network.<\/p>\n\n<p>The final code in the <code>index.js<\/code> file should look like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\/\/ index.js\nconst httpsRequest <span class=\"o\">=<\/span> require<span class=\"o\">(<\/span><span class=\"s2\">\".\/httpsRequest.js\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n\n\/\/ These are the params of the https request\nconst PARAMS <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n  <span class=\"nb\">hostname<\/span>: <span class=\"s2\">\"api.icon.geometry.io\"<\/span>, \/\/ This is a citizen node <span class=\"k\">in <\/span>the network\n  path: <span class=\"s2\">\"\/api\/v3\"<\/span>,\n  method: <span class=\"s2\">\"POST\"<\/span> \/\/ all https request to the network are POST requests\n<span class=\"o\">}<\/span><span class=\"p\">;<\/span>\n\n\/\/ This is the JSON RPC formatted call we are sending to the network\nconst DATA <span class=\"o\">=<\/span> JSON.stringify<span class=\"o\">({<\/span>\n  jsonrpc: <span class=\"s2\">\"2.0\"<\/span>,\n  method: <span class=\"s2\">\"icx_call\"<\/span>,\n  <span class=\"nb\">id<\/span>: 1,\n  params: <span class=\"o\">{<\/span>\n    to: <span class=\"s2\">\"cx0000000000000000000000000000000000000000\"<\/span>,\n    dataType: <span class=\"s2\">\"call\"<\/span>,\n    data: <span class=\"o\">{<\/span>\n      method: <span class=\"s2\">\"getPReps\"<\/span>,\n      params: <span class=\"o\">{<\/span>\n        startRanking: <span class=\"s2\">\"0x1\"<\/span>,\n        endRanking: <span class=\"s2\">\"0x16\"<\/span>\n      <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">})<\/span><span class=\"p\">;<\/span>\n\n\/\/ Run async httpsRequest and print response on console\n<span class=\"o\">(<\/span>async <span class=\"o\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\n  try <span class=\"o\">{<\/span>\n    <span class=\"nb\">let <\/span>response <span class=\"o\">=<\/span> await httpsRequest<span class=\"o\">(<\/span>PARAMS, DATA<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n    console.log<span class=\"o\">(<\/span>response<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n  <span class=\"o\">}<\/span> catch <span class=\"o\">(<\/span>err<span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    console.log<span class=\"o\">(<\/span><span class=\"s2\">\"Error running httpsRequest\"<\/span><span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n    console.log<span class=\"o\">(<\/span>err<span class=\"o\">)<\/span><span class=\"p\">;<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">})()<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>After running <code>node index.js<\/code> we are going to get a reply like this from the smart contract:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>dev.to-article<span class=\"nv\">$ <\/span>node index.js \nStatus Code: 200\n<span class=\"o\">{<\/span>\n  jsonrpc: <span class=\"s1\">'2.0'<\/span>,\n  result: <span class=\"o\">{<\/span>\n    blockHeight: <span class=\"s1\">'0x2b924c6'<\/span>,\n    preps: <span class=\"o\">[<\/span>\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object], <span class=\"o\">[<\/span>Object],\n      <span class=\"o\">[<\/span>Object]\n    <span class=\"o\">]<\/span>,\n    startRanking: <span class=\"s1\">'0x1'<\/span>,\n    totalDelegated: <span class=\"s1\">'0x1205ef103fffce01d3dd1ff'<\/span>,\n    totalStake: <span class=\"s1\">'0x13f0b214efa073bac2d0d53'<\/span>\n  <span class=\"o\">}<\/span>,\n  <span class=\"nb\">id<\/span>: 1\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Congratulations! now you know how to interact with smart contracts on the ICON Network!, I invite you to join the community by visiting the <a href=\"https:\/\/forum.icon.community\/\">forum<\/a> and <a href=\"https:\/\/t.me\/icondevs\">telegram channel for developers<\/a> and keep learning so that you can also build amazing projects in the ICON Ecosystem, we have a <a href=\"https:\/\/medium.com\/@helloiconworld\/introducing-the-contribution-proposal-system-b7ad5d877dc5\">decentralized funding program called CPS (Contribution Proposal System)<\/a> that anyone can use to finance and build projects on the ICON Network so if you have a great idea please come and build with us!.<\/p>\n\n<p>If you like this article please leave a comment and share it on social media, more articles will be coming explaining things about interacting with smart contracts on the ICON Network.<\/p>\n\n<p>Thanks for reading!.<\/p>\n\n","category":["crypto","javascript","tutorial","beginners"]},{"title":"Non-native English speakers of dev.to how do you keep your English skills sharp!","pubDate":"Sat, 16 Nov 2019 22:00:43 +0000","link":"https:\/\/dev.to\/fidelve\/non-native-english-speakers-of-dev-to-how-do-you-keep-your-english-skills-sharp-2mk5","guid":"https:\/\/dev.to\/fidelve\/non-native-english-speakers-of-dev-to-how-do-you-keep-your-english-skills-sharp-2mk5","description":"<p><a href=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--TsRVymxy--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/thepracticaldev.s3.amazonaws.com\/i\/uw8pxlje4s855vy3len0.jpg\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--TsRVymxy--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/thepracticaldev.s3.amazonaws.com\/i\/uw8pxlje4s855vy3len0.jpg\" alt=\"cover\"><\/a><br>\nImage by <a href=\"https:\/\/pixabay.com\/users\/Tessakay-5116088\">Tessa Kavanagh<\/a> from <a href=\"https:\/\/pixabay.com\/photos\/dictionary-languages-learning-2317654\/\">Pixabay<\/a><\/p>\n\n<p>I have seen that dev.to has a pretty big global community, so I would like to ask all the non-native English speakers in here, how do you maintain your English skills and what do you do to improve it?.<\/p>\n\n<p>In my case, I'm using blogging in dev.to as a tool to improve mainly my writing skills, one of the things I use and highly recommend to anyone is Grammarly!, they have a really nice chrome extension to check your grammar.<\/p>\n\n","category":"watercooler"},{"title":"Understanding JavaScript objects","pubDate":"Sat, 09 Nov 2019 20:03:24 +0000","link":"https:\/\/dev.to\/fidelve\/understanding-javascript-objects-55na","guid":"https:\/\/dev.to\/fidelve\/understanding-javascript-objects-55na","description":"<p>Have you ever read the sentence, \"<em>In JavaScript (nearly) everything is an object<\/em>\"?. I'm willing to bet that you have, and probably when you were learning JavaScript, at least in my case I did.<\/p>\n\n<p>But this is not just for the case of JavaScript, actually, if you google <a href=\"https:\/\/www.google.com\/search?q=everything%20is%20an%20object\">\"everything is an object\"<\/a>, you will see the same sentence referring to a plethora of programming languages (especially Python).<\/p>\n\n<p>For someone that is just starting to learn how to code, reading something like that can do more harm than good, you don't even yet understand what an object is and someone is telling you that <em>everything<\/em> is an object? what are you suppose to do with that information?.<\/p>\n\n<p>So, let's try again to understand, what is an object in Javascript.<\/p>\n\n<h2>\n  \n  \n  Javascript data types\n<\/h2>\n\n<p>To understand what objects are, we need to understand what is a data type.<\/p>\n\n<blockquote>\n<p>In computer science and computer programming, a data type or simply type is an attribute of data which tells the compiler or interpreter how the programmer intends to use the data.<\/p>\n<\/blockquote>\n\n<p>Basically, a type is an attribute of all the variables (or constants) you are creating when you are coding, in the case of JavaScript, there are 8 data types:<\/p>\n\n<ul>\n<li>Undefined<\/li>\n<li>Null<\/li>\n<li>Boolean<\/li>\n<li>String<\/li>\n<li>Symbol<\/li>\n<li>Number (Number type and BigInt type)<\/li>\n<li>and Objects<\/li>\n<\/ul>\n\n<p>Out of these data types, 7 are considered primitives (<code>Undefined<\/code>, <code>Null<\/code>, <code>Boolean<\/code>, <code>String<\/code>, <code>Symbol<\/code>, <code>Number<\/code> and <code>BigInt<\/code>) and <code>Objects<\/code> are what we call <em>references<\/em>.<\/p>\n\n<p>What does it mean for <code>Objects<\/code> to be references? lets see an example. Let's declare a couple variables like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> 42<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>bar <span class=\"o\">=<\/span> foo<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n42\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>If we modify the variable <code>foo<\/code>, the variable <code>bar<\/code> will maintain its initial value of 42 (like expected).<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> 42<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>bar <span class=\"o\">=<\/span> foo<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> foo <span class=\"o\">=<\/span> 43<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n42\n<span class=\"o\">&gt;<\/span> foo\n43\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>In the case of <code>Objects<\/code> we see a different behaviour:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> key: 42 <span class=\"o\">}<\/span><span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>bar <span class=\"o\">=<\/span> foo<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n<span class=\"o\">{<\/span> key: 42 <span class=\"o\">}<\/span>\n<span class=\"o\">&gt;<\/span> foo.key <span class=\"o\">=<\/span> 43<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n<span class=\"o\">{<\/span> key: 43 <span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see, changing the value of a key in <code>foo<\/code> will affect <code>bar<\/code>. If you need to make a copy of and <code>Object<\/code> and modify the original <code>Object<\/code> without this affecting your copy, there's several ways of doing this, I tend to prefer the relatively new <code>spread<\/code> operator:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> key: 42 <span class=\"o\">}<\/span><span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>bar <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> ...foo <span class=\"o\">}<\/span><span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n<span class=\"o\">{<\/span> key: 42 <span class=\"o\">}<\/span>\n<span class=\"o\">&gt;<\/span> foo.key <span class=\"o\">=<\/span> 43<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> bar\n<span class=\"o\">{<\/span> key: 42 <span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  An in-depth look at Objects\n<\/h2>\n\n<p>Now that we know what <code>Objects<\/code> are, let's talk about what can they contain. Basically, <code>Objects<\/code> in JavaScript are a type of data that stores collections of other data in <em>key:value<\/em> pairs, as simple as that.<\/p>\n\n<p>In their most simple form they look like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> bar: 1, baz: <span class=\"s2\">\"two\"<\/span> <span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>There are some rules about what the keys can be (they can either be a <code>string<\/code> or a <code>symbol<\/code>), but the values can be basically anything:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">let <\/span>foo <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\n one: 1,\n two: <span class=\"s1\">'string'<\/span>,\n three: <span class=\"o\">{<\/span> another: <span class=\"s1\">'object'<\/span> <span class=\"o\">}<\/span>,\n four: <span class=\"o\">[<\/span> <span class=\"s1\">'an'<\/span>, <span class=\"s1\">'array'<\/span> <span class=\"o\">]<\/span>,\n five<span class=\"o\">()<\/span> <span class=\"o\">{<\/span> <span class=\"k\">return<\/span> <span class=\"s2\">\"how about a function? (actually a method)\"<\/span><span class=\"o\">}<\/span>,\n <span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>This gives us a lot of flexibility when it comes to coding, but can be a little confusing when you are starting to learn about <code>Objects<\/code>.<\/p>\n\n<p>Functions that are inside <code>Objects<\/code> are called methods, and with them you can access the data inside the <code>Object<\/code>, let's define an <code>Object<\/code> the following way:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">let<\/span> <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n <span class=\"na\">length<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\n <span class=\"na\">width<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span>\n <span class=\"nx\">area<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">*<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">width<\/span>\n <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Now we can do things like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> rectangle.area<span class=\"o\">()<\/span>\n8\n<span class=\"o\">&gt;<\/span> rectangle.width <span class=\"o\">=<\/span> 4\n<span class=\"o\">&gt;<\/span> rectangle.area<span class=\"o\">()<\/span>\n16\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see <code>Objects<\/code> can be more complex than you might initially imagine and is that flexibility that allows us to do more interesting things with our code.<\/p>\n\n<h2>\n  \n  \n  Why is (almost) everything in JavaScript an Object?\n<\/h2>\n\n<p>As we have already seen, <code>Objects<\/code> can have very complex shapes, you can have any data type as values inside an <code>Object<\/code> (called properties), and you can define functions inside your <code>Objects<\/code> (which are called methods) to access those properties.<\/p>\n\n<p>Now that you know about this shape that <code>Objects<\/code> can have, other things are going to start looking very familiar.<\/p>\n\n<h3>\n  \n  \n  Object wrappers for Primitives\n<\/h3>\n\n<p>Let's take a look at the primitives we already discussed at the beginning.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>num <span class=\"o\">=<\/span> 42<span class=\"p\">;<\/span>\n<span class=\"o\">&gt;<\/span> num.toString<span class=\"o\">()<\/span>\n<span class=\"s1\">'42'<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Does the expression <code>num.toString()<\/code> looks familiar to you?, if it does is because it's a method call, just like we did earlier with the <code>rectangle.area()<\/code> example.<\/p>\n\n<p>But why numbers have methods if they are not objects? (you may ask), well, almost all primitive values (except for <code>null<\/code> and <code>undefined<\/code>) have an object equivalent or wrapper that wraps around the primitive value to allow us to make things like <code>num.toString()<\/code> and make our life easier when coding.<\/p>\n\n<p>Lets get one thing clear, this does not mean that numbers or other primitives are <code>Objects<\/code>, when for example you try to access a property of a string, JavaScript coerces said string to an <code>Object<\/code> (the <code>String<\/code> wrapper), this all happens under the hood, you do not have to worry about what is going on behind the curtains, but its good that you understand it.<\/p>\n\n<p>Lets see what methods and properties does the <code>Number<\/code> object wrapper has:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>Number<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'length'<\/span>,\n <span class=\"s1\">'name'<\/span>,\n <span class=\"s1\">'prototype'<\/span>,\n <span class=\"s1\">'isFinite'<\/span>,\n <span class=\"s1\">'isInteger'<\/span>,\n <span class=\"s1\">'isNaN'<\/span>,\n <span class=\"s1\">'isSafeInteger'<\/span>,\n <span class=\"s1\">'parseFloat'<\/span>,\n <span class=\"s1\">'parseInt'<\/span>,\n <span class=\"s1\">'MAX_VALUE'<\/span>,\n <span class=\"s1\">'MIN_VALUE'<\/span>,\n <span class=\"s1\">'NaN'<\/span>,\n <span class=\"s1\">'NEGATIVE_INFINITY'<\/span>,\n <span class=\"s1\">'POSITIVE_INFINITY'<\/span>,\n <span class=\"s1\">'MAX_SAFE_INTEGER'<\/span>,\n <span class=\"s1\">'MIN_SAFE_INTEGER'<\/span>,\n <span class=\"s1\">'EPSILON'<\/span> <span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>Number.prototype<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'constructor'<\/span>,\n <span class=\"s1\">'toExponential'<\/span>,\n <span class=\"s1\">'toFixed'<\/span>,\n <span class=\"s1\">'toPrecision'<\/span>,\n <span class=\"s1\">'toString'<\/span>,\n <span class=\"s1\">'valueOf'<\/span>,\n <span class=\"s1\">'toLocaleString'<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see there's several very handy properties and methods for the object wrapper <code>Number<\/code> and you can access them as you would on any other <code>Object<\/code>.<\/p>\n\n<h3>\n  \n  \n  Arrays and Functions\n<\/h3>\n\n<p>Other things in the list of <em>things that are objects<\/em>, are the <code>Arrays<\/code> and <code>Functions<\/code>. So far you might have learned that <code>Arrays<\/code> are ordered list, and this is truth but, under the hood, <code>Arrays<\/code> are <code>Objects<\/code> too.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"nb\">let <\/span>someArray <span class=\"o\">=<\/span> <span class=\"o\">[<\/span><span class=\"s1\">'foo'<\/span>, <span class=\"s1\">'bar'<\/span>, <span class=\"s1\">'baz'<\/span><span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span> someArray\n<span class=\"o\">[<\/span> <span class=\"s1\">'foo'<\/span>, <span class=\"s1\">'bar'<\/span>, <span class=\"s1\">'baz'<\/span> <span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>someArray<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'0'<\/span>, <span class=\"s1\">'1'<\/span>, <span class=\"s1\">'2'<\/span>, <span class=\"s1\">'length'<\/span> <span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>Array.prototype<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'length'<\/span>,\n <span class=\"s1\">'constructor'<\/span>,\n <span class=\"s1\">'concat'<\/span>,\n <span class=\"s1\">'find'<\/span>,\n <span class=\"s1\">'findIndex'<\/span>,\n <span class=\"s1\">'pop'<\/span>,\n <span class=\"s1\">'push'<\/span>,\n <span class=\"s1\">'shift'<\/span>,\n <span class=\"s1\">'unshift'<\/span>,\n <span class=\"s1\">'slice'<\/span>,\n <span class=\"s1\">'splice'<\/span>,\n <span class=\"s1\">'includes'<\/span>,\n <span class=\"s1\">'indexOf'<\/span>,\n <span class=\"s1\">'keys'<\/span>,\n <span class=\"s1\">'entries'<\/span>,\n <span class=\"s1\">'forEach'<\/span>,\n <span class=\"s1\">'filter'<\/span>,\n <span class=\"s1\">'map'<\/span>,\n <span class=\"s1\">'every'<\/span>,\n <span class=\"s1\">'some'<\/span>,\n <span class=\"s1\">'reduce'<\/span>,\n <span class=\"s1\">'reduceRight'<\/span>,\n <span class=\"s1\">'toString'<\/span>,\n <span class=\"s1\">'toLocaleString'<\/span>,\n <span class=\"s1\">'join'<\/span>,\n <span class=\"s1\">'reverse'<\/span>,\n <span class=\"s1\">'sort'<\/span>,\n <span class=\"s1\">'lastIndexOf'<\/span>,\n <span class=\"s1\">'copyWithin'<\/span>,\n <span class=\"s1\">'fill'<\/span>,\n <span class=\"s1\">'values'<\/span> <span class=\"o\">]<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>For the case of <code>Functions<\/code> we have the following:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> <span class=\"k\">function <\/span>foo<span class=\"o\">(<\/span>param1, param2<span class=\"o\">)<\/span> <span class=\"o\">{<\/span><span class=\"k\">return<\/span> <span class=\"o\">[<\/span>param1, param2]<span class=\"o\">}<\/span>\n<span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>foo<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'length'<\/span>, <span class=\"s1\">'name'<\/span>, <span class=\"s1\">'arguments'<\/span>, <span class=\"s1\">'caller'<\/span>, <span class=\"s1\">'prototype'<\/span> <span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span> foo.length\n2\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see we have for example a property called <code>length<\/code>, this value indicates how many parameters the function expect.<\/p>\n\n<p>And if we call <code>Object.getOwnPropertyNames()<\/code> on the <code>Function.prototype<\/code> we have other interesting stuffs:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">&gt;<\/span> Object.getOwnPropertyNames<span class=\"o\">(<\/span>Function.prototype<span class=\"o\">)<\/span>\n<span class=\"o\">[<\/span> <span class=\"s1\">'length'<\/span>,\n <span class=\"s1\">'name'<\/span>,\n <span class=\"s1\">'arguments'<\/span>,\n <span class=\"s1\">'caller'<\/span>,\n <span class=\"s1\">'constructor'<\/span>,\n <span class=\"s1\">'apply'<\/span>,\n <span class=\"s1\">'bind'<\/span>,\n <span class=\"s1\">'call'<\/span>,\n <span class=\"s1\">'toString'<\/span> <span class=\"o\">]<\/span>\n<span class=\"o\">&gt;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Let's wrap things up\n<\/h2>\n\n<p>There's a lot of details in terms of what are <code>prototypes<\/code>, <code>constructors<\/code> and what is an <code>instance<\/code> that I'm purposely not talking about or getting into too much detail, I wanted for this article to be just an overview of <code>Objects<\/code> in JavaScript for people that are still learning the basics.<\/p>\n\n<p>The important thing to know is that <code>Objects<\/code> are everywhere in JavaScript, and is important to understand them in order to improve your JavaScript skills.<\/p>\n\n<p>If you are new to programming and have any questions about objects in JavaScript, put it in the comments!<\/p>\n\n<p>Thanks for reading!.<\/p>\n\n","category":["beginners","codenewbie","javascript","objects"]},{"title":"Using Vim as your main editor for web development","pubDate":"Sun, 03 Nov 2019 04:56:31 +0000","link":"https:\/\/dev.to\/fidelve\/using-vim-as-your-main-editor-for-web-development-5a73","guid":"https:\/\/dev.to\/fidelve\/using-vim-as-your-main-editor-for-web-development-5a73","description":"<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfgvve343kh2evtuw8lf.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfgvve343kh2evtuw8lf.png\" alt=\"real programmers\"><\/a> <em>Real Programmers by XKCD<\/em><\/p>\n\n<p>Finding the code editor or IDE (from now on I'll be referring to both) that is the best match for you is one of those unexpected rites of passage that every developer goes to in the journey of learning how to code. In my case, I started learning programming with python some 9 years ago, I remember jumping from one editor to another in a weekly basis, the first one was IDLE, and from the top of my mind, I remember trying Boa Constructor, Komodo, and Notepad++ to name a few.<\/p>\n\n<p>In this process of finding your go-to editor, you learn about the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Editor_war\" rel=\"noopener noreferrer\">editor war<\/a> and start understanding the several inside jokes about Vim and Emacs.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fy37vhiul92wt8zarjrtc.jpg\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fy37vhiul92wt8zarjrtc.jpg\" alt=\"learning curves\"><\/a><\/p>\n\n<p>It is at this point where you decide to learn either Vim or Emacs, and your journey down the rabbit hole begins.<\/p>\n\n<p>By the title of this post, you have already guessed that my preferred editor is Vim, but I'm not going to try and sell you into it or convince you to spend countless hours modifying your current development environment to adapt it to use Vim.<\/p>\n\n<p>My goal for this post is to share the customizations I have implemented in order to efficiently use Vim as my main editor for web development projects.<\/p>\n\n<h2>\n  \n  \n  Vim plugins for Web Development\n<\/h2>\n\n<p>As a web developer most of your time you are basically going to be working on HTML, CSS and JavaScript files, and depending on your preferences, or the requirements of the projects you are working on, you will probably going to be using some framework (React, Vue or Angular) and an assortment of tools like babel, webpack, grunt, etc.<\/p>\n\n<p>Personally, I try to use as few plugins as possible, I only install them when the benefit they bring to the table are tangibles and it really improves my workflow.<\/p>\n\n<p>At the moment the plugins I have installed are the following:<\/p>\n\n<ul>\n<li>Emmet.vim<\/li>\n<li>indentline &amp; vim-jsx-pretty<\/li>\n<li>vim-commentary<\/li>\n<li>ALE (eslint &amp; prettier)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  Emmet.vim\n<\/h3>\n\n<p>Emmet is an amazing tool for high-speed coding and editing, it allows you to create complex HTML structures with one line of code.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FBMRldVT.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FBMRldVT.gif\" alt=\"emmet-gif\"><\/a><\/p>\n\n<h3>\n  \n  \n  indentline &amp; vim-jsx-pretty\n<\/h3>\n\n<p>These are two plugins for improving the visual style of Vim. <code>indentline<\/code> adds vertical lines to easily show indent levels, and <code>vim-jsx-pretty<\/code> highlights JSX code for when you are for example working with ReactJS.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FTVOnKHk.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FTVOnKHk.png\" alt=\"react\"><\/a><\/p>\n\n<h3>\n  \n  \n  vim-commentary\n<\/h3>\n\n<p>This plugin allows you to comment\/uncomment code easily, you just select the code you want and press &lt;g-c&gt;.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2F3VjfnBe.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2F3VjfnBe.gif\" alt=\"comment code\"><\/a><\/p>\n\n<h3>\n  \n  \n  ALE (eslint &amp; prettier)\n<\/h3>\n\n<p>ALE (Asynchronous Lint Engine), allows you to use linters and fixers making your life a lot easier, is one of those things that you don't think you need until you try. In my case, I'm mainly using ALE to enable <a href=\"https:\/\/prettier.io\/\" rel=\"noopener noreferrer\">prettier<\/a> while using Vim.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FuF1X5Lu.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FuF1X5Lu.gif\" alt=\"prettier\"><\/a><\/p>\n\n<h2>\n  \n  \n  Implementing live preview (hot reloading)\n<\/h2>\n\n<p>Watching live the effects of the modifications you are making is something that greatly impacts your workflow in a positive way, most of the time this is something that's build into your development environment when you're for example working on a React or Gatsby project, but for the cases that you are just creating a simple webpage (HTML, CSS, and JavaScript) editors like Atom, Brackets or VSCode have the option to show you live on a side panel, the page you are working on.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FMlz4Sif.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fi.imgur.com%2FMlz4Sif.png\" alt=\"VSCODE window\"><\/a><\/p>\n\n<p>Stubborn as I am, I wanted this functionality while working with Vim, and while there are several plugins that can implement this, I decided to go on another route.<\/p>\n\n<p>In this case I decided to implement an editor agnostic solution, basically what we need in this case is to run a local server, watch the files for any modification and update the page on the server every time a file updates.<\/p>\n\n<p>It sounds more complicated than it really is, we just need to install and run <a href=\"https:\/\/www.npmjs.com\/package\/browser-sync\" rel=\"noopener noreferrer\">browser-sync<\/a> inside our project folder.<\/p>\n\n<p>I'm assuming you already have <code>nodejs<\/code> installed in your system, so let's go ahead and install <code>browser-sync<\/code> globally.<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\n\nnpm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> browser-sync\n\n\n<\/code><\/pre>\n\n<\/div>\n\n<p>After installing <code>browser-sync<\/code> we can run it inside any folder in our system and it will create a local server (automatically displaying the default index.html file you have in the folder).<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\n\nbrowser-sync start <span class=\"nt\">--server<\/span> <span class=\"nt\">--files<\/span> <span class=\"nb\">.<\/span>\n\n\n<\/code><\/pre>\n\n<\/div>\n\n<p>If you're working inside Linux (and you should), you can create an alias to simplify the process of running the server. Open up your <code>.bashrc<\/code> file inside your home folder and add the following.<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\n\n<span class=\"c\"># Command line alias to start the browser-sync server<\/span>\n<span class=\"nb\">alias <\/span><span class=\"nv\">serve<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"browser-sync start --server --files .\"<\/span>\n\n\n<\/code><\/pre>\n\n<\/div>\n\n<p>In my case, I went one step further in order to access the server inside my private network and test the webpage on several devices.<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>\n\n<span class=\"c\"># browser-sync config<\/span>\n<span class=\"c\"># Get the current local IP address<\/span>\n<span class=\"nb\">export <\/span><span class=\"nv\">SERVER_IP<\/span><span class=\"o\">=<\/span><span class=\"sb\">`<\/span><span class=\"nb\">hostname<\/span> <span class=\"nt\">-I<\/span><span class=\"sb\">`<\/span>\n\n<span class=\"c\"># The command alias to start the browser-sync server<\/span>\n<span class=\"nb\">alias <\/span><span class=\"nv\">serve<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"browser-sync start --server --files . --no-notify --host <\/span><span class=\"nv\">$SERVER_IP<\/span><span class=\"s2\"> --port 9000\"<\/span>\n\n\n<\/code><\/pre>\n\n<\/div>\n\n<p>Thanks for reading!.<\/p>\n\n","category":["vim","javascript","webdev"]},{"title":"Optimizing your code: Do you really need nested loops?","pubDate":"Sat, 26 Oct 2019 17:59:41 +0000","link":"https:\/\/dev.to\/fidelve\/optimizing-your-code-do-you-really-need-nested-loops-2j96","guid":"https:\/\/dev.to\/fidelve\/optimizing-your-code-do-you-really-need-nested-loops-2j96","description":"<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fimgs.xkcd.com%2Fcomics%2Fgood_code.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fimgs.xkcd.com%2Fcomics%2Fgood_code.png\" alt=\"Good Code\"><\/a> <a href=\"https:\/\/xkcd.com\/844\/\" rel=\"noopener noreferrer\"><em>Good Code by XKCD<\/em><\/a><\/p>\n\n<p>First comes the disclaimer, nested loops sometimes are necessary or even the best approach for your problems, but is important to understand that their implementation sometimes comes with a cost.<\/p>\n\n<p>Nobody wants an app that freezes every time the user makes and input and you need to do some calculations, and, as in almost everything in life the \"best\" solution is always dependant on several factors, but the point of this is not to tackle all possible scenarios, the point of this is just to explain a simple case where, although nested loops gets the job done, another solution is actually more appropriate.<\/p>\n\n<h2>\n  \n  \n  A random example using nested loops\n<\/h2>\n\n<p>Let's say we are creating the code that runs an ATM. Inside the ATM we have stacks of bills of several denominations,  and when a person comes to take some cash, we need to figure out how much bills of each denomination we need to give to the person. The best approach might be some predictive behavior that drains each stack of bills relative to each other in a way that we don't run out of a particular denomination, it will be unpleasant if you want to cash out $120 but the ATM can only give you either $100 or \\$150.<\/p>\n\n<p>To make this simpler, we are programming the ATM to output as much of the bigger denomination as it can, and continue going one denomination down until the amount of cash asked for by the client is met, to put it in simple terms, if a person asks for $320, the ATM will give back 3 $100 bills, and 1 \\$20.<\/p>\n\n<p>We also have to take into account, that the ATM has a finite amount of each bill, in the last example, we might not be able to give back 3 $100 and 1 $20, we might have to give 2 $100 bills, 2 $50 and 1 \\$20.<\/p>\n\n<p>For this example I'm going to be using javascript, so let's define the ATM inside state as an object like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">ATM_STATE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">totalAmount<\/span><span class=\"p\">:<\/span> <span class=\"mi\">628<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">hundred<\/span><span class=\"p\">:<\/span> <span class=\"mi\">300<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">fifty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">150<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">twenty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">80<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">ten<\/span><span class=\"p\">:<\/span> <span class=\"mi\">40<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">five<\/span><span class=\"p\">:<\/span> <span class=\"mi\">25<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">one<\/span><span class=\"p\">:<\/span> <span class=\"mi\">33<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Each value is the amount of dollars in that particular denomination (not the amount of bills in that denomination) and the <code>totalAmount<\/code> is the sum of all of the values for each denomination.<\/p>\n\n<p>To calculate the amount of cash the ATM is going to return, we are going to create a function that takes the ATM state and the requested amount of cash as input, and we are going to output an object with the amounts in each denomination.<\/p>\n\n<p>Knowing that the condition for this function is that the ATM will return as much of the higher denomination first, we might think that the simplest way to implement this is by using nested loops.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ If you have node.js installed you can copy<\/span>\n<span class=\"c1\">\/\/ this code and run it in the console<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ATM_STATE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">totalAmount<\/span><span class=\"p\">:<\/span> <span class=\"mi\">628<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">hundred<\/span><span class=\"p\">:<\/span> <span class=\"mi\">300<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">fifty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">150<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">twenty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">80<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">ten<\/span><span class=\"p\">:<\/span> <span class=\"mi\">40<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">five<\/span><span class=\"p\">:<\/span> <span class=\"mi\">25<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">one<\/span><span class=\"p\">:<\/span> <span class=\"mi\">33<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">withdraw<\/span><span class=\"p\">(<\/span><span class=\"nx\">amount<\/span><span class=\"p\">,<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ Making a copy of the ATM state that we are going to mutate, to make<\/span>\n  <span class=\"c1\">\/\/ this a pure function<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">copyOfState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">atmState<\/span><span class=\"p\">};<\/span>\n\n  <span class=\"c1\">\/\/ A variable to count the steps<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">steps<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"c1\">\/\/ Initializing the object we are going to return<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">returnedCash<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">totalAmount<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">hundred<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">fifty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">twenty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">ten<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">five<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">one<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">};<\/span>\n\n  <span class=\"c1\">\/\/ An ordered array of bill denomination from higher to lowest<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">bills<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">hundred<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">100<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">fifty<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">50<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">twenty<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">20<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ten<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">five<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">one<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span>\n  <span class=\"p\">];<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">amount<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">copyOfState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Making sure we have enough money for the transaction<\/span>\n\n    <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">let<\/span> <span class=\"nx\">eachBill<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">bills<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ Going from highest denomination to lower<\/span>\n\n      <span class=\"k\">while <\/span><span class=\"p\">(<\/span><span class=\"nx\">amount<\/span> <span class=\"o\">&gt;<\/span> <span class=\"nx\">returnedCash<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ While we haven't yet reached the amount of cash requested<\/span>\n\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"nx\">amount<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">returnedCash<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"c1\">\/\/ If the amount left to reach our goal is less than<\/span>\n          <span class=\"c1\">\/\/ The value of this bill we break out of the loop<\/span>\n\n          <span class=\"c1\">\/\/ Substracting the amount from the ATM state (the copy we made)<\/span>\n          <span class=\"nx\">copyOfState<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]]<\/span> <span class=\"o\">-=<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n          <span class=\"nx\">copyOfState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span> <span class=\"o\">-=<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n\n          <span class=\"c1\">\/\/ Adding the amount to object to return<\/span>\n          <span class=\"nx\">returnedCash<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]]<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n          <span class=\"nx\">returnedCash<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n          <span class=\"nx\">steps<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">amount<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">The requested amount cannot be processed<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">steps<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">returnedCash<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span>\n<span class=\"c1\">\/\/TESTING<\/span>\n<span class=\"c1\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span>\n<span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">require<\/span> <span class=\"o\">!=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">undefined<\/span><span class=\"dl\">'<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">require<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">module<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nf\">withdraw<\/span><span class=\"p\">(<\/span><span class=\"mi\">627<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ATM_STATE<\/span><span class=\"p\">));<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Before you burn me at the stake, let me just say, yes you are right, this function is the worst implementation for this task, I was truly trying my hardest to come up with a solution that is just awful, but gets the job done nonetheless.<\/p>\n\n<p>Anyone with a little experience can easily see why this is just bad code, but the thing is, that I remember writing this type of code (to be fair it wasn't that long ago either), this is the type of code that you write when you don't have a clear image of the problem that you need to solve, and you're just coding away, creating problems that doesn't need to be created and you're working your way around them.<\/p>\n\n<p>But coming back to the main point, this is a case where using nested loops makes the code more complicated and inefficient.<\/p>\n\n<p>It might be the case that you find the code easier to understand if you use nested loops, in this case, we are going from the highest denomination to the lowest (first loop) and subtracting one whole value of that denomination at a time (second loop).<\/p>\n\n<p>We can refactor this function and remove the second loop by making one operation for each denomination.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ If you have node.js installed you can copy<\/span>\n<span class=\"c1\">\/\/ this code and run it in the console<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ATM_STATE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">totalAmount<\/span><span class=\"p\">:<\/span> <span class=\"mi\">628<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">hundred<\/span><span class=\"p\">:<\/span> <span class=\"mi\">300<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">fifty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">150<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">twenty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">80<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">ten<\/span><span class=\"p\">:<\/span> <span class=\"mi\">40<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">five<\/span><span class=\"p\">:<\/span> <span class=\"mi\">25<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">one<\/span><span class=\"p\">:<\/span> <span class=\"mi\">33<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">withdraw<\/span><span class=\"p\">(<\/span><span class=\"nx\">amount<\/span><span class=\"p\">,<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ Making a copy of the inputs that we are going to mutate, to make<\/span>\n  <span class=\"c1\">\/\/ sure this is a pure function<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">copyOfState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">atmState<\/span><span class=\"p\">};<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">copyOfAmount<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">amount<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/ A variable to count the steps<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">steps<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/ Initializing the object we are going to return<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">returnedCash<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">totalAmount<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">hundred<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">fifty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">twenty<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">ten<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">five<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">one<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">};<\/span>\n\n  <span class=\"c1\">\/\/ An ordered array of bill denomination from higher to lowest<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">bills<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">hundred<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">100<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">fifty<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">50<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">twenty<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">20<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ten<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">five<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">one<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">],<\/span>\n  <span class=\"p\">];<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">copyOfAmount<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">copyOfState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Making sure we have enough money for the transaction<\/span>\n\n    <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">let<\/span> <span class=\"nx\">eachBill<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">bills<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ Going from highest denomination to lower<\/span>\n\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"nx\">copyOfAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ If the current bill value is smaller than the cash amount to return<\/span>\n\n        <span class=\"kd\">let<\/span> <span class=\"nx\">multiplier<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">floor<\/span><span class=\"p\">(<\/span><span class=\"nx\">copyOfAmount<\/span> <span class=\"o\">\/<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]);<\/span>\n        <span class=\"kd\">let<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span> <span class=\"o\">=<\/span>\n          <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">multiplier<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">copyOfState<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]]<\/span>\n            <span class=\"p\">?<\/span> <span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">multiplier<\/span>\n            <span class=\"p\">:<\/span> <span class=\"nx\">copyOfState<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]];<\/span>\n\n        <span class=\"c1\">\/\/ Substracting the amount from the ATM state (the copy we made)<\/span>\n        <span class=\"nx\">copyOfState<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]]<\/span> <span class=\"o\">-=<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">copyOfState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span> <span class=\"o\">-=<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/ Adding the amount to object to return<\/span>\n        <span class=\"nx\">returnedCash<\/span><span class=\"p\">[<\/span><span class=\"nx\">eachBill<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]]<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">returnedCash<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/ Updating the amount<\/span>\n        <span class=\"nx\">copyOfAmount<\/span> <span class=\"o\">-=<\/span> <span class=\"nx\">amountToAddAndSubstract<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"nx\">steps<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">copyOfAmount<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">.<\/span><span class=\"nx\">totalAmount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">atmState<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">The requested amount cannot be procesed<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">steps<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">returnedCash<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span>\n<span class=\"c1\">\/\/TESTING<\/span>\n<span class=\"c1\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span>\n<span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">require<\/span> <span class=\"o\">!=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">undefined<\/span><span class=\"dl\">'<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">require<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">module<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nf\">withdraw<\/span><span class=\"p\">(<\/span><span class=\"mi\">322<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ATM_STATE<\/span><span class=\"p\">));<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see by the <code>steps<\/code> counter I'm printing to the console, we went from doing 6 loops, one for subtracting one bill at a time, to 3 loops making one subtraction for an entire denomination at a time.<\/p>\n\n<p>This might sound inconsequential, but the optimized function will always make at most 6 steps, one for each denomination, no matter the amount, while the first function with nested loops will make as many steps as necessary while subtracting one bill at a time.<\/p>\n\n<p>The important thing to take into consideration is that for other cases that you might encounter, with bigger datasets, having nested loops can considerably slow down your app, so always take into account, do you really need those nested loops?.<\/p>\n\n<p>Thanks for reading!.<\/p>\n\n","category":["javascript","beginners","codequality"]},{"title":"The definitive guide for using PrismJs in Gatsby","pubDate":"Sun, 13 Oct 2019 23:08:40 +0000","link":"https:\/\/dev.to\/fidelve\/the-definitive-guide-for-using-prismjs-in-gatsby-4708","guid":"https:\/\/dev.to\/fidelve\/the-definitive-guide-for-using-prismjs-in-gatsby-4708","description":"<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fimgs.xkcd.com%2Fcomics%2Fwisdom_of_the_ancients.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fimgs.xkcd.com%2Fcomics%2Fwisdom_of_the_ancients.png\" alt=\"wisdom of the ancients\"><\/a><\/p>\n\n<blockquote>\n<p><a href=\"https:\/\/xkcd.com\/979\/\" rel=\"noopener noreferrer\">wisdom of the ancients by xkcd<\/a><\/p>\n<\/blockquote>\n\n<p>Learning to use a new technology has been in my experience, a process of spending days searching for information to piece together a puzzle of which you don't have the entire picture yet.<\/p>\n\n<p>A process that is at the same time rewarding and frustrating, it has become a new experience that I just have to get used to while walking the path of a self-taught developer.<\/p>\n\n<p>The most recent time I walked this path, was when I decided to remake my personal website using <strong>Gatsby<\/strong> and upon watching a lot of blogs and sites with really cool and styled block codes with syntax highlighting, I thought that it would be good to use it on my site.<\/p>\n\n<p>There are many libraries for syntax highlighting, but the one that seems to be the most used and preferred is <a href=\"https:\/\/prismjs.com\/\" rel=\"noopener noreferrer\">Prism<\/a>, so I decided to not spend too much time searching the pros and cons of all of them and give <strong>Prism<\/strong> a try, I would be happy to see your opinions on other libraries in the comments.<\/p>\n\n<h2>\n  \n  \n  The main thing that you need to take into account\n<\/h2>\n\n<p>If you are in the process of porting (or creating from scratch) your website or blog to <strong>Gatsby<\/strong>, and wanted to use <strong>Prism<\/strong> for code highlighting, the first thing that you need to decide is whether you're going to be using markdown files or not, because the process is different depending on this decision.<\/p>\n\n<p>The need for using markdown files will depend on the type of website you are creating, but basically, if you are creating a <em>blog<\/em> or <em>blog-like<\/em> type of website, in the end using <strong>Markdown<\/strong> to source the content to your site is the most efficient way to go. If this is your case, the process will involve installing and configuring a couple of gatsby plugins (<code>gatsby-transformer-remark<\/code> and <code>gatsby-remark-prismjs<\/code>), installing the <strong>Prism<\/strong> npm package and querying for the <strong>Markdown<\/strong> files (or snippets) with <strong>GraphQL<\/strong>.<\/p>\n\n<p>On the other hand, if you are creating any other type of website, with a more complex design, <strong>Markdown<\/strong> won't give you enough flexibility to apply things like collapsible containers, carousels, etc. In this case, you just need to get <strong>Prism<\/strong> working in <strong>React<\/strong> while using a custom <em>.babelrc<\/em> configuration file.<\/p>\n\n<p>I created a blank <strong>Gatsby<\/strong> project to use for both examples, you can download it <a href=\"https:\/\/github.com\/FidelVe\/gatsby-blank-starter\" rel=\"noopener noreferrer\">here<\/a>, or create it from the console using the following format.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>gatsby new &lt;project-name&gt; https:\/\/github.com\/FidelVe\/gatsby-blank-starter\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>In case you haven't install <strong>Gatsby<\/strong> yet, run the following command first:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm i <span class=\"nt\">-g<\/span> gatsby-cli\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Gatsby, React and PrismJs without remark\n<\/h2>\n\n<p>The first scenario that I will be explained is using <strong>Prism<\/strong> without markdown files. This scenario is basically using <strong>Prism<\/strong> inside <strong>React<\/strong> in a way that <strong>Gatsby<\/strong> can process without any problems.<\/p>\n\n<p>Lets first create a new gatsby project.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>gatsby new gatsby-prism https:\/\/github.com\/FidelVe\/gatsby-blank-starter\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Try running the <code>gatsby develop<\/code> server and you will see the following page with the default <code>&lt;code&gt;<\/code> style.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzs5q50j0y903t29oglcu.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzs5q50j0y903t29oglcu.png\" alt=\"before prism\"><\/a><\/p>\n\n<p>The first thing to do is install the npm <strong>Prism<\/strong> package:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install<\/span>  <span class=\"nt\">--save<\/span> prismjs\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Now we are going to install <code>babel-plugin-prismjs<\/code>, this <a href=\"https:\/\/github.com\/mAAdhaTTah\/babel-plugin-prismjs\" rel=\"noopener noreferrer\">plugin<\/a> allows us to configure and customize <strong>Prism<\/strong> by using <strong>Babel<\/strong>.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">--save<\/span> babel-plugin-prismjs\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>To use this plugin we need to create a <em>.babelrc<\/em> file and put our configurations in it. <strong>Gatsby<\/strong> ships with a default <em>.babelrc<\/em> file, in order to create our own file and modify it we need to install the <code>babel-preset-gatsby<\/code> preset and add it to our new <em>.babelrc<\/em> file.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">--save<\/span> babel-preset-gatsby\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>At this point, we have already installed everything we need so let's start with the configurations.<\/p>\n\n<p>First, create a new file at the root of the project and call it <em>.babelrc<\/em>. Inside this file, we can customize <strong>Prism<\/strong>, in my case this is the content of the <em>.babelrc<\/em> file.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"presets\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"babel-preset-gatsby\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"plugins\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"prismjs\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"languages\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"javascript\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"css\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"markup\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"plugins\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"show-language\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"theme\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"okaidia\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"css\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}]<\/span><span class=\"w\">\n  <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n\n<\/div>\n\n\n\n<p>With the installations and configurations out of the way, now we just need to import <code>prismjs<\/code> and use the <code>Prism.highlightAll()<\/code> function call to style our code blocks.<\/p>\n\n<p>If you're using the repo I linked at the beginning, open the <em>src\/pages\/index.js<\/em> file and add the following:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useEffect<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Layout<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/components\/layout<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"c1\">\/\/import the Prism package<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Prism<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">prismjs<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"c1\">\/\/ The code we will be displaying<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">code<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`const foo = 'foo';\nconst bar = 'bar';\nconsole.log(foo + bar);\n`<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">IndexPage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ call the highlightAll() function to style our code blocks<\/span>\n    <span class=\"nx\">Prism<\/span><span class=\"p\">.<\/span><span class=\"nf\">highlightAll<\/span><span class=\"p\">()<\/span>\n  <span class=\"p\">})<\/span>\n\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Layout<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span>\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span>\n          <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">alignItems<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">center<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">flexFlow<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">column nowrap<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">6px 10px<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">maxWidth<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">800px<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">}}<\/span>\n      <span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">h2<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"nx\">Using<\/span> <span class=\"nx\">Prism<\/span> <span class=\"nx\">to<\/span> <span class=\"nx\">style<\/span> <span class=\"o\">&lt;<\/span><span class=\"nx\">code<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">code<\/span> <span class=\"nx\">blocks<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/code&gt; in Gatsb<\/span><span class=\"err\">y\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/h2<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">code-container<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">pre<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">code<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">language-javascript<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"nx\">code<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/code<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/pre<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Layout<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">IndexPage<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Run the <code>gatsby develop<\/code> server and you will see the following page with the code block styled with the prism theme.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzlc89g18mxi70at2jzyk.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzlc89g18mxi70at2jzyk.png\" alt=\"page using prism\"><\/a><\/p>\n\n<p>Congratulations, now you know how to add code styles with <strong>Prism<\/strong> inside <strong>Gatsby<\/strong>, here is a list of links to expand more on this topic.<\/p>\n\n<ul>\n<li><p><a href=\"https:\/\/betterstack.dev\/blog\/code-highlighting-in-react-using-prismjs\" rel=\"noopener noreferrer\">betterstack.dev | Code highlighting in react using prismjs<\/a><\/p><\/li>\n<li><p><a href=\"https:\/\/www.gatsbyjs.org\/docs\/babel\/\" rel=\"noopener noreferrer\">gatsbyjs.org | Babel<\/a><\/p><\/li>\n<li><p><a href=\"https:\/\/www.npmjs.com\/package\/babel-plugin-prismjs\" rel=\"noopener noreferrer\">npmjs.com | babel-plugin-prismjs<\/a><\/p><\/li>\n<\/ul>\n\n<h2>\n  \n  \n  Gatsby, React and PrismJs with remark\n<\/h2>\n\n<p>Parsing markdown files on gatsby is done with a transformer plugin called <a href=\"https:\/\/www.gatsbyjs.org\/packages\/gatsby-transformer-remark\/\" rel=\"noopener noreferrer\">gatsby-transformer-remark<\/a>. This plugin takes markdown formatted content and transform it into valid html, so in this case, we are going to write our code snippets in triple backtick () inside markdown files (<em>.md<\/em>), use <strong>GraphQl<\/strong> to query the data inside the file and put it inside our code.<\/p>\n\n<p>Let's start by creating a new blank gatsby project.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>gatsby new gatsby-markdown-prism https:\/\/github.com\/FidelVe\/gatsby-blank-starter\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Now, lets install <code>prismjs<\/code>, <code>gatsby-transformer-remark<\/code> and <code>gatsby-remark-prismjs<\/code>.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">--save<\/span> prismjs gatsby-transformer-remark gatsby-remark-prismjs\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>There are several <a href=\"https:\/\/prismjs.com\/\" rel=\"noopener noreferrer\">themes to choose from in <strong>Prism<\/strong><\/a>, for this project I'm using the <em>okaidia<\/em> theme. In order to define a theme, create a file called <em>gatsby-browser.js<\/em> in the root folder and add the following.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">prismjs\/themes\/prism-okaidia.css<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Since we are going to be using <em>.md<\/em> files to write our code snippets in them, create a folder (<em>src\/content\/<\/em>). to put all the markdown files, and inside that folder create a new markdown file called <em>code.md<\/em> and add the following content.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2xlfo7k3lf6244hdz7c2.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2xlfo7k3lf6244hdz7c2.png\" alt=\"markdown content\"><\/a><\/p>\n\n<p>The next step is to configure the plugins we have installed. open the <em>gatsby-config.js<\/em> file at the root of the project and add the following:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">resolve<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`gatsby-source-filesystem`<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">options<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`code`<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">}<\/span><span class=\"s2\">\/src\/content`<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">resolve<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`gatsby-transformer-remark`<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">options<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n          <span class=\"p\">{<\/span>\n            <span class=\"na\">resolve<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`gatsby-remark-prismjs`<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">options<\/span><span class=\"p\">:<\/span> <span class=\"p\">{},<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">],<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>The <code>gatsby-source-filesystem<\/code> plugin creates <code>File<\/code> nodes from the files in our system. In this case, we are creating nodes from each file inside our <em>src\/content\/<\/em> folder.<\/p>\n\n<p>Every <em>.md<\/em> file we create inside our <em>src\/content\/<\/em> folder gets parsed and transformed into valid html by <code>gastby-transformer-remark<\/code>, and because we are using the <code>gatsby-remark-prismjs<\/code> plugin, content inside triple backticks is automatically formatted by <strong>Prism<\/strong>.<\/p>\n\n<p>Having installed and configured all the necessary plugins, the only thing that's left is inserting the parsed content into our page and for that we will use <strong>GraphQl<\/strong>.<\/p>\n\n<p>Open the <em>src\/page\/index.js<\/em> file and add the following content to it.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useStaticQuery<\/span><span class=\"p\">,<\/span> <span class=\"nx\">graphql<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">gatsby<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Layout<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/components\/layout<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">IndexPage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useStaticQuery<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphql<\/span><span class=\"s2\">`\n    {\n      allMarkdownRemark(filter: { fileAbsolutePath: { regex: \"\/code.md\/\" } }) {\n        nodes {\n          html\n        }\n      }\n    }\n  `<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Layout<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span>\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span>\n          <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">alignItems<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">center<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">flexFlow<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">column nowrap<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">6px 10px<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">maxWidth<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">800px<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">}}<\/span>\n      <span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">h2<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"nx\">Using<\/span> <span class=\"nx\">Prism<\/span> <span class=\"nx\">to<\/span> <span class=\"nx\">style<\/span> <span class=\"o\">&lt;<\/span><span class=\"nx\">code<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">code<\/span> <span class=\"nx\">blocks<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/code&gt; in Gatsb<\/span><span class=\"err\">y\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/h2<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span>\n          <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">code-container<\/span><span class=\"dl\">\"<\/span>\n          <span class=\"nx\">dangerouslySetInnerHTML<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span>\n            <span class=\"na\">__html<\/span><span class=\"p\">:<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">allMarkdownRemark<\/span><span class=\"p\">.<\/span><span class=\"nx\">nodes<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"nx\">html<\/span><span class=\"p\">,<\/span>\n          <span class=\"p\">}}<\/span>\n        <span class=\"o\">&gt;&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Layout<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">IndexPage<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Start the <code>gatsby develop<\/code> server and you should see the code styled as shown in the image.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fua4avgizwgo9endkteix.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fua4avgizwgo9endkteix.png\" alt=\"page with prism and markdown\"><\/a><\/p>\n\n<p>Thanks for reading, hope this helped you implement <strong>Prism<\/strong> to your <strong>Gatsby<\/strong> pages.<\/p>\n\n<p>Again, here is a list of links to expand more on this topic.<\/p>\n\n<ul>\n<li><p><a href=\"https:\/\/markoskon.com\/gatsby-plugins-markdown\/#gatsby-transformer-remark\" rel=\"noopener noreferrer\">markoskon.com | gatsby plugin markdown<\/a><\/p><\/li>\n<li><p><a href=\"https:\/\/www.gatsbyjs.org\/packages\/gatsby-remark-prismjs\/\" rel=\"noopener noreferrer\">gatsbyjs.org | gatsby-remark-prismjs<\/a><\/p><\/li>\n<li><p><a href=\"https:\/\/www.gatsbyjs.org\/packages\/gatsby-transformer-remark\/\" rel=\"noopener noreferrer\">gatsbyjs.org | gatsby-transformer-remark<\/a><\/p><\/li>\n<li><p><a href=\"https:\/\/dev.to\/niklasmtj\/implement-prismjs-in-gatsbyjs-fff\">dev.to\/niklasmtj | Implement PrismJS in Gatsby<\/a><\/p><\/li>\n<\/ul>\n\n","category":["gatsby","prism","javascript","react"]},{"title":"Creating responsive navbars with background images in GatsbyJS using gatsby-image","pubDate":"Thu, 03 Oct 2019 23:11:21 +0000","link":"https:\/\/dev.to\/fidelve\/creating-responsive-navbars-with-background-images-in-gatsbyjs-using-gatsby-image-2i2","guid":"https:\/\/dev.to\/fidelve\/creating-responsive-navbars-with-background-images-in-gatsbyjs-using-gatsby-image-2i2","description":"<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frdckude3n23s9gnbb2mg.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frdckude3n23s9gnbb2mg.png\" alt=\"gatsby logo\"><\/a><\/p>\n\n<p>Recently I decided to redo <a href=\"http:\/\/fidel.engineer\" rel=\"noopener noreferrer\">my personal static page<\/a> with React, while searching the web for a way to generate statics React sites I found out about <a href=\"https:\/\/www.gatsbyjs.org\/\" rel=\"noopener noreferrer\">Gatsbyjs<\/a>, and after a couple of hours of reading about it, my two days journey of learning the hard way started.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmucghi0l0bafj4e17ssy.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmucghi0l0bafj4e17ssy.png\" alt=\"homepage horizontal\"><\/a><\/p>\n\n<p>The main challenge I didn't know I was going to face, was porting the responsive navbar that I created for my site with simple CSS (flexbox, media queries, and background images).<\/p>\n\n<p>The position of the navbar in my site changes from vertical to horizontal depending on the screen size of the browser, and, depending on this position, the background image changes.<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fix40tmtj3ta5ker1sf69.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fix40tmtj3ta5ker1sf69.png\" alt=\"homepage vertical\"><\/a><\/p>\n\n<p>While reading the Gatsby official docs and tutorial, I found out about <a href=\"https:\/\/www.gatsbyjs.org\/packages\/gatsby-image\" rel=\"noopener noreferrer\">gatsby-image<\/a> and decided to use it.<\/p>\n\n<blockquote>\n<p>gatsby-image is a React component specially designed to work seamlessly with Gatsby\u2019s GraphQL queries. It combines Gatsby\u2019s native image processing capabilities with advanced image loading techniques to easily and completely optimize image loading for your sites.<\/p>\n<\/blockquote>\n\n<p>By using gatsby-image you can optimize image loading, it automatically creates different images to use depending on display size and also applies progressive image loading (blur up), the problem for me was, that it doesn\u2019t work with background images.<\/p>\n\n<p>There is another package called gatsby-background-image, but, since I already had an idea on how to make it work, I decided not to use it.<\/p>\n\n<p>The way I decided to implement it was simple, first create an absolute positioned container to display the image and then a second absolute positioned container for the links stacked on top.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"nt\">&lt;nav&gt;<\/span>\n  <span class=\"nt\">&lt;div&gt;<\/span>\n  <span class=\"c\">&lt;!-- gatsby-image here --&gt;<\/span>\n  <span class=\"nt\">&lt;\/div&gt;<\/span>\n  <span class=\"nt\">&lt;div&gt;<\/span>\n  <span class=\"c\">&lt;!-- navbar links here --&gt;<\/span>\n  <span class=\"nt\">&lt;\/div&gt;<\/span>\n<span class=\"nt\">&lt;\/nav&gt;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Creating the Project Structure\n<\/h2>\n\n<p>I am going to assume that you already have <a href=\"https:\/\/www.gatsbyjs.org\/docs\/quick-start\/\" rel=\"noopener noreferrer\">Gatsby installed<\/a> and that you already created a project using the command <code>gatsby new &lt;project-name&gt;<\/code>.<\/p>\n\n<p>In my case, the folder structure of my project looks like this (not displaying the <em>node_modules<\/em> and <em>public<\/em> folders).<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0se41gwarm8o3fgo5uz8.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0se41gwarm8o3fgo5uz8.png\" alt=\"project structure\"><\/a><\/p>\n\n<p>Inside the <em>src\/components<\/em> folder you can see 3 files:<\/p>\n\n<ul>\n<li>\n<strong>layout.css<\/strong> a vary basic CSS reset with the following content:\n<\/li>\n<\/ul>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight css\"><code><span class=\"nt\">html<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">font-family<\/span><span class=\"p\">:<\/span> <span class=\"nb\">sans-serif<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">-ms-text-size-adjust<\/span><span class=\"p\">:<\/span> <span class=\"m\">100%<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">-webkit-text-size-adjust<\/span><span class=\"p\">:<\/span> <span class=\"m\">100%<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nt\">body<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">margin<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">-webkit-font-smoothing<\/span><span class=\"p\">:<\/span> <span class=\"n\">antialiased<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">-moz-osx-font-smoothing<\/span><span class=\"p\">:<\/span> <span class=\"n\">grayscale<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<ul>\n<li><p><strong>layout.module.css<\/strong>. A <a href=\"https:\/\/www.gatsbyjs.org\/docs\/css-modules\/\" rel=\"noopener noreferrer\">CSS Module<\/a> to <a href=\"https:\/\/philipwalton.com\/articles\/side-effects-in-css\/\" rel=\"noopener noreferrer\">avoid name collision<\/a>. Here we are going to write all of our CSS code for our <strong>Layout Component<\/strong>.<\/p><\/li>\n<li><p><strong>layout.js<\/strong> our <strong>Layout Component<\/strong>.<\/p><\/li>\n<\/ul>\n\n<p>Inside the <em>src\/images<\/em> we have our two background images for when the navbar is either horizontal or vertically positioned, and inside the <em>src\/pages<\/em> we have the 3 <a href=\"https:\/\/www.gatsbyjs.org\/docs\/building-with-components\/\" rel=\"noopener noreferrer\">Page Components<\/a> that are going to be linked at in the navbar. This is the code inside the <strong>Page Components<\/strong>.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nx\">Layout<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/components\/layout<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">IndexPage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n  <span class=\"o\">&lt;<\/span><span class=\"nx\">Layout<\/span> <span class=\"nx\">headerText<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Index Page Header text.<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod\n      tempor incididunt ut labore et dolore magna aliqua.\n    &lt;\/p&gt;\n  &lt;\/Layout&gt;\n)\n\nexport default IndexPage\n\n<\/span><\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Creating our layout Component\n<\/h2>\n\n<p>Because all the pages in my site are structured the same way, I decided to create a <a href=\"https:\/\/www.gatsbyjs.org\/docs\/layout-components\/\" rel=\"noopener noreferrer\">Layout Component<\/a>, and use it across all the pages.<\/p>\n\n<p>This <strong>Layout Component<\/strong> will have the responsive navbar, and the <code>graphql<\/code> queries.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Link<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">gatsby<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">styles<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/layout.module.css<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/layout.css<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">Layout<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">super<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">render<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">layout<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">nav<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbar<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBackground<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"p\">{<\/span><span class=\"cm\">\/* Background Image goes here *\/<\/span><span class=\"p\">}<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarLinkContainer<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">HOME<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/about\/<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">ABOUT<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/contact\/<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">CONTACT<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/nav<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">main<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">header<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">h1<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">headerText<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h1<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/header<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">children<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/main<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Using CSS media queries\n<\/h2>\n\n<p>In order to change the position of the navbar we need to use <a href=\"https:\/\/www.w3schools.com\/css\/css3_mediaqueries.asp\" rel=\"noopener noreferrer\">CSS media queries<\/a>. For my page, I decided to use a screen width of 580 pixels as the breakpoint in the query.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight css\"><code><span class=\"nf\">#layout<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">min-height<\/span><span class=\"p\">:<\/span> <span class=\"m\">100%<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">min-width<\/span><span class=\"p\">:<\/span> <span class=\"m\">320px<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">#navbar<\/span><span class=\"o\">,<\/span>\n<span class=\"nf\">#navbar-background<\/span><span class=\"o\">,<\/span>\n<span class=\"nf\">#navbar-link-container<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">height<\/span><span class=\"p\">:<\/span> <span class=\"m\">60px<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">#navbar<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">position<\/span><span class=\"p\">:<\/span> <span class=\"nb\">fixed<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">z-index<\/span><span class=\"p\">:<\/span> <span class=\"m\">999<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">top<\/span><span class=\"p\">:<\/span> <span class=\"m\">0px<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">width<\/span><span class=\"p\">:<\/span> <span class=\"m\">100%<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">background-color<\/span><span class=\"p\">:<\/span> <span class=\"m\">#eee<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">#navbar-background<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">position<\/span><span class=\"p\">:<\/span> <span class=\"nb\">absolute<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">top<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">left<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">width<\/span><span class=\"p\">:<\/span> <span class=\"m\">100%<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">overflow<\/span><span class=\"p\">:<\/span> <span class=\"nb\">hidden<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">#navbar-link-container<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">position<\/span><span class=\"p\">:<\/span> <span class=\"nb\">absolute<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">top<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">left<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">display<\/span><span class=\"p\">:<\/span> <span class=\"n\">flex<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">flex-flow<\/span><span class=\"p\">:<\/span> <span class=\"n\">row<\/span> <span class=\"nb\">nowrap<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">text-align<\/span><span class=\"p\">:<\/span> <span class=\"nb\">center<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nc\">.nav-link<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">font-size<\/span><span class=\"p\">:<\/span> <span class=\"m\">20px<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">display<\/span><span class=\"p\">:<\/span> <span class=\"nb\">block<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">background-color<\/span><span class=\"p\">:<\/span> <span class=\"n\">rgba<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0.1<\/span><span class=\"p\">);<\/span>\n  <span class=\"nl\">text-decoration<\/span><span class=\"p\">:<\/span> <span class=\"nb\">none<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">color<\/span><span class=\"p\">:<\/span> <span class=\"m\">#333<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">font-weight<\/span><span class=\"p\">:<\/span> <span class=\"nb\">bold<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">padding<\/span><span class=\"p\">:<\/span> <span class=\"m\">20px<\/span> <span class=\"m\">4px<\/span> <span class=\"m\">0px<\/span> <span class=\"m\">2px<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nc\">.nav-link<\/span><span class=\"nd\">:hover<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">background-color<\/span><span class=\"p\">:<\/span> <span class=\"n\">rgba<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0.4<\/span><span class=\"p\">);<\/span>\n  <span class=\"nl\">color<\/span><span class=\"p\">:<\/span> <span class=\"m\">#fff<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">#main<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">margin-top<\/span><span class=\"p\">:<\/span> <span class=\"m\">75px<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">@media<\/span> <span class=\"n\">screen<\/span> <span class=\"n\">and<\/span> <span class=\"p\">(<\/span><span class=\"n\">min-width<\/span><span class=\"p\">:<\/span> <span class=\"m\">580px<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c\">\/* if width more than 580px *\/<\/span>\n  <span class=\"nf\">#layout<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">display<\/span><span class=\"p\">:<\/span> <span class=\"n\">flex<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">flex-flow<\/span><span class=\"p\">:<\/span> <span class=\"n\">row<\/span> <span class=\"nb\">nowrap<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">height<\/span><span class=\"p\">:<\/span> <span class=\"m\">100vh<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">#navbar<\/span><span class=\"o\">,<\/span>\n  <span class=\"nf\">#navbar-background<\/span><span class=\"o\">,<\/span>\n  <span class=\"nf\">#navbar-link-container<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">width<\/span><span class=\"p\">:<\/span> <span class=\"m\">170px<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">height<\/span><span class=\"p\">:<\/span> <span class=\"m\">100vh<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">#navbar<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">flex-grow<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">flex-shrink<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">position<\/span><span class=\"p\">:<\/span> <span class=\"nb\">static<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">background-color<\/span><span class=\"p\">:<\/span> <span class=\"n\">rgba<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0.1<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">#navbar-link-container<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">flex-flow<\/span><span class=\"p\">:<\/span> <span class=\"n\">column<\/span> <span class=\"nb\">nowrap<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">#main<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">margin-top<\/span><span class=\"p\">:<\/span> <span class=\"m\">0px<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">flex-grow<\/span><span class=\"p\">:<\/span> <span class=\"m\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">flex-shrink<\/span><span class=\"p\">:<\/span> <span class=\"m\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">flex-basis<\/span><span class=\"p\">:<\/span> <span class=\"m\">100px<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Detecting the navbar position inside React\n<\/h2>\n\n<p>Because we are using <strong>CSS queries<\/strong> to change the position of our navbar, and the image we are going to be displaying as a background changes depending on this position, we need to find a way to detect the navbar position from inside <strong>React<\/strong> and display the correct image.<\/p>\n\n<p>This is the main reason why I implemented the <strong>Layout Component<\/strong> as a class component and not a function component. We need to have the <em>sidebar position<\/em> as a state inside the <strong>Layout Component<\/strong> and re-render it when it changes.<\/p>\n\n<p>The way we are going to do this is by first, detect the position of the navbar on the first rendering, listening for resize events and detect when our navbar changes position based on our breakpoint (width &lt; 580px).<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/.....\/\/<\/span>\n<span class=\"kd\">class<\/span> <span class=\"nc\">Layout<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">super<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">navbarPosition<\/span><span class=\"p\">:<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getPosition<\/span><span class=\"p\">(),<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">getPosition<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ This conditional is to avoid errors during build, check<\/span>\n    <span class=\"c1\">\/\/ https:\/\/www.gatsbyjs.org\/docs\/debugging-html-builds\/<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span> <span class=\"nb\">window<\/span> <span class=\"o\">!==<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">undefined<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">innerWidth<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">580<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">horizontal<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">vertical<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">componentDidMount<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nf\">addEventListener<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">resize<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">updateSize<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">componentWillUnmount<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeEventListener<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">resize<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">updateSize<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nx\">updateSize<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">position<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getPosition<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span> <span class=\"o\">!==<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarPosition<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ Changing the state will cause React to re-render, in<\/span>\n      <span class=\"c1\">\/\/ this case we are only changing the state when the<\/span>\n      <span class=\"c1\">\/\/ navbar changes position<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">setState<\/span><span class=\"p\">({<\/span> <span class=\"na\">navbarPosition<\/span><span class=\"p\">:<\/span> <span class=\"nx\">position<\/span> <span class=\"p\">})<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">render<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/.....\/\/<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Now that we have the basic structure, we need to use <code>gatsby-image<\/code> with <code>graphql<\/code> to display the images in our <code>#navbar-background<\/code> container.<\/p>\n\n<h2>\n  \n  \n  Using graphql with gatsby-image\n<\/h2>\n\n<p>In order to use <code>gatsby-image<\/code> we need to query for the image files with <code>graphql<\/code>, if you don't know how <code>graphql<\/code> queries work on gatsby, I highly recommend to first read about it in <a href=\"https:\/\/www.gatsbyjs.org\/docs\/graphql-concepts\/\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n\n<p>In my case the <code>graphql<\/code> query looks like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"p\">{<\/span>\n  <span class=\"nl\">navbarBgVer<\/span><span class=\"p\">:<\/span> <span class=\"nf\">file<\/span><span class=\"p\">(<\/span><span class=\"nx\">relativePath<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nl\">eq<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">navbar-ver.jpeg<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span>\n  <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"nx\">childImageSharp<\/span> <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"nf\">fluid<\/span><span class=\"p\">(<\/span><span class=\"na\">maxHeight<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1200<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"p\">...<\/span><span class=\"nx\">GatsbyImageSharpFluid<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"p\">}<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nl\">navbarBgHor<\/span><span class=\"p\">:<\/span> <span class=\"nf\">file<\/span><span class=\"p\">(<\/span><span class=\"nx\">relativePath<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nl\">eq<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">navbar-hor.jpeg<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span>\n  <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"nx\">childImageSharp<\/span> <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"nf\">fluid<\/span><span class=\"p\">(<\/span><span class=\"na\">maxWidth<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2000<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"p\">...<\/span><span class=\"nx\">GatsbyImageSharpFluid<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"err\">\u00a6<\/span> <span class=\"p\">}<\/span>\n  <span class=\"err\">\u00a6<\/span> <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>There are 3 ways of using <code>graphql<\/code> with <strong>Gatsby<\/strong>, and which one to use, depends on several factors:<\/p>\n\n<ul>\n<li>\n<a href=\"https:\/\/www.gatsbyjs.org\/docs\/page-query\/\" rel=\"noopener noreferrer\">Page queries<\/a>, that are only to be used in gatsby page components.<\/li>\n<li><a href=\"https:\/\/www.gatsbyjs.org\/docs\/use-static-query\/\" rel=\"noopener noreferrer\">useStaticQuery Hook<\/a><\/li>\n<li>and <a href=\"https:\/\/www.gatsbyjs.org\/docs\/page-query\/\" rel=\"noopener noreferrer\">StaticQuery<\/a>, which can be used in any component.<\/li>\n<\/ul>\n\n<p>Because we are going to be making the <code>graphql<\/code> query outside a <strong>Page Component<\/strong>, we have to either use <strong>StaticQuery<\/strong> or <strong>useStaticQuery<\/strong>. For this case I decided to go with <strong>StaticQuery<\/strong> because is what am most comfortable with right now, <strong>useStaticQuery<\/strong> is a <strong>React Hook<\/strong> and even though we should be using them (they seem to be the way <a href=\"https:\/\/www.robinwieruch.de\/react-hooks-migration\" rel=\"noopener noreferrer\">most developers<\/a> will be using <strong>React<\/strong> from now on), I haven't yet learned them, so, rewriting my site to use <strong>React Hooks<\/strong> might be a good project for the future.<\/p>\n\n<p>Adding the <code>&lt;StaticQuery \/&gt;<\/code> with the <code>graphql<\/code> query to our <strong>layout.js<\/strong> component, our new <code>render()<\/code> function will look like this.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nf\">render<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">navbarPosition<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarPosition<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">StaticQuery<\/span>\n      <span class=\"nx\">query<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">graphql<\/span><span class=\"s2\">`\n        {\n          navbarBgVer: file(relativePath: { eq: \"navbar-ver.jpeg\" }) {\n            childImageSharp {\n              fluid(maxHeight: 1200) {\n                ...GatsbyImageSharpFluid\n              }\n            }\n          }\n          navbarBgHor: file(relativePath: { eq: \"navbar-hor.jpeg\" }) {\n            childImageSharp {\n              fluid(maxWidth: 2000) {\n                ...GatsbyImageSharpFluid\n              }\n            }\n          }\n        }\n      `<\/span><span class=\"p\">}<\/span>\n      <span class=\"nx\">render<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">layout<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">nav<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbar<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBackground<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"p\">{<\/span><span class=\"cm\">\/* gatsby-image components*\/<\/span><span class=\"p\">}<\/span>\n              <span class=\"p\">{<\/span><span class=\"nx\">navbarPosition<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">vertical<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n                  <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">height<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">100%<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n                  <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgVer<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n                <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n                  <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">minHeight<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">60px<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n                  <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgHor<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n                <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"p\">)}<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarLinkContainer<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"nx\">HOME<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/about\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"nx\">ABOUT<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/contact\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"nx\">CONTACT<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/nav<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"nx\">main<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">header<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">mainHeader<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">h1<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">headerText<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h1<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/header<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">children<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/main<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"p\">)}<\/span>\n    <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>As you can see we are rendering our entire <strong>Layout Component<\/strong> inside the <code>&lt;StaticQuery \/&gt;<\/code> element acting as a wrapper. This <code>&lt;StaticQuery \/&gt;<\/code> element takes two attributes<\/p>\n\n<ul>\n<li><p>The first one is <code>query<\/code>. Inside of this attribute we are doing our <code>graphql<\/code> query.<\/p><\/li>\n<li><p>The second one is <code>render<\/code>. This one takes a function and passes onto it the <code>graphql<\/code> data as an argument, so we can use it on our <strong>Layout Component<\/strong>.<\/p><\/li>\n<\/ul>\n\n<p>As you can see, inside our <code>#navbar-background<\/code> container we are conditionally rendering our background image depending on the navbar position.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBackground<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n  <span class=\"p\">{<\/span><span class=\"cm\">\/* navbar background image goes here *\/<\/span><span class=\"p\">}<\/span>\n  <span class=\"p\">{<\/span><span class=\"nx\">navbarPosition<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">vertical<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n      <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">height<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">100%<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n      <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgVer<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n    <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n      <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">minHeight<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">60px<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n      <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgHor<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n    <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)}<\/span>\n<span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span><\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Now, our final <strong>layout.js<\/strong> component will looks like this.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"cm\">\/**\n * Layout component for all the pages of the site\n *\/<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Link<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">gatsby<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">StaticQuery<\/span><span class=\"p\">,<\/span> <span class=\"nx\">graphql<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">gatsby<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">styles<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/layout.module.css<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/layout.css<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Img<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">gatsby-image<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">Layout<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">super<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">navbarPosition<\/span><span class=\"p\">:<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getPosition<\/span><span class=\"p\">(),<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">getPosition<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ This conditional is to avoid errors during build, check<\/span>\n    <span class=\"c1\">\/\/ https:\/\/www.gatsbyjs.org\/docs\/debugging-html-builds\/<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span> <span class=\"nb\">window<\/span> <span class=\"o\">!==<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">undefined<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">innerWidth<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">580<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">horizontal<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">vertical<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nf\">componentDidMount<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nf\">addEventListener<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">resize<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">updateSize<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">componentWillUnmount<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeEventListener<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">resize<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">updateSize<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nx\">updateSize<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">position<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getPosition<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">position<\/span> <span class=\"o\">!==<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarPosition<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ Changing the state will cause a re-render of the page, do in this case<\/span>\n      <span class=\"c1\">\/\/ we are only changing the state when the navbar changes position<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">setState<\/span><span class=\"p\">({<\/span> <span class=\"na\">navbarPosition<\/span><span class=\"p\">:<\/span> <span class=\"nx\">position<\/span> <span class=\"p\">})<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">render<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">navbarPosition<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarPosition<\/span>\n    <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">StaticQuery<\/span>\n        <span class=\"nx\">query<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">graphql<\/span><span class=\"s2\">`\n          {\n            navbarBgVer: file(relativePath: { eq: \"navbar-ver.jpeg\" }) {\n              childImageSharp {\n                fluid(maxHeight: 1200) {\n                  ...GatsbyImageSharpFluid\n                }\n              }\n            }\n            navbarBgHor: file(relativePath: { eq: \"navbar-hor.jpeg\" }) {\n              childImageSharp {\n                fluid(maxWidth: 2000) {\n                  ...GatsbyImageSharpFluid\n                }\n              }\n            }\n          }\n        `<\/span><span class=\"p\">}<\/span>\n        <span class=\"nx\">render<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">layout<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">nav<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbar<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBackground<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"p\">{<\/span><span class=\"cm\">\/* navbar background image goes here *\/<\/span><span class=\"p\">}<\/span>\n                <span class=\"p\">{<\/span><span class=\"nx\">navbarPosition<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">vertical<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\n                  <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n                    <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">height<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">100%<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n                    <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgVer<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n                  <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>                <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\n                  <span class=\"o\">&lt;<\/span><span class=\"nx\">Img<\/span>\n                    <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{{<\/span> <span class=\"na\">minHeight<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">60px<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">width<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">110%<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}}<\/span>\n                    <span class=\"nx\">fluid<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarBgHor<\/span><span class=\"p\">.<\/span><span class=\"nx\">childImageSharp<\/span><span class=\"p\">.<\/span><span class=\"nx\">fluid<\/span><span class=\"p\">}<\/span>\n                  <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>                <span class=\"p\">)}<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navbarLinkContainer<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                  <span class=\"nx\">HOME<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>                <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/about\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                  <span class=\"nx\">ABOUT<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>                <span class=\"o\">&lt;<\/span><span class=\"nx\">Link<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">navLink<\/span><span class=\"p\">}<\/span> <span class=\"nx\">to<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/contact\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                  <span class=\"nx\">CONTACT<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Link<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/nav<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">main<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">header<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">mainHeader<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">h1<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">headerText<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h1<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/header<\/span><span class=\"err\">&gt;\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">id<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">children<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/main<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"p\">)}<\/span>\n      <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Layout<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  My impressions about gatsby.\n<\/h2>\n\n<p>I ended this small personal project very satisfied with <strong>Gatsby<\/strong>, I was looking for a way to port my static personal page to <strong>React<\/strong>, and <strong>Gatsby<\/strong> not only allowed me to do this, but I also learned about <code>gatsby-image<\/code>, which I thinks is a great tool for optimizing image rendering. I think that <strong>Gatsby<\/strong> will become one of my go-to frameworks for future projects.<\/p>\n\n<p>I hope this article helps you in your journey, thanks for reading!.<\/p>\n\n","category":["gatsby","react","graphql","javascript"]}]}}