<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joseph Pinder</title>
    <description>The latest articles on DEV Community by Joseph Pinder (@jsphpndr).</description>
    <link>https://dev.to/jsphpndr</link>
    <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%2F146278%2F50bae782-b5cc-4a61-bcd5-670ac78bd8ef.jpeg</url>
      <title>DEV Community: Joseph Pinder</title>
      <link>https://dev.to/jsphpndr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsphpndr"/>
    <language>en</language>
    <item>
      <title>Facebook Pixel Is Slowing Down Your Website (And How To Fix It, Securely)</title>
      <dc:creator>Joseph Pinder</dc:creator>
      <pubDate>Mon, 20 Jul 2020 13:37:37 +0000</pubDate>
      <link>https://dev.to/jsphpndr/facebook-pixel-is-slowing-down-your-website-and-how-to-fix-it-securely-152</link>
      <guid>https://dev.to/jsphpndr/facebook-pixel-is-slowing-down-your-website-and-how-to-fix-it-securely-152</guid>
      <description>&lt;p&gt;Analytical tools are ubiquitous with the modern web. Even the most basic website has at least one of these analytical tools (most, likely Google Analytics) running in the background. Why not Facebook?&lt;/p&gt;

&lt;p&gt;In this article, we will find out how Facebook Pixel slows down your website and how to resolve this problem securely.&lt;/p&gt;

&lt;p&gt;Facebook Pixel is an analytics tool that helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;track conversions from Facebook ads,&lt;/li&gt;
&lt;li&gt;optimize Facebook Ads,&lt;/li&gt;
&lt;li&gt;build targeted audiences for future ads,&lt;/li&gt;
&lt;li&gt;and remarket to people who have taken some kind of action on your website.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a great tool, but it's a tool that might be slowing your website down, costing you leads and money.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the problem?
&lt;/h2&gt;

&lt;p&gt;If you're following &lt;a href="https://www.facebook.com/business/help/952192354843755?id=1205376682832142"&gt;Facebook's instructions on installing Facebook Pixel&lt;/a&gt; or getting some, umm... expert advice, you'll most likely be advised to place the Facebook Pixel code in your site's &lt;code&gt;head&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't do this!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_LObBGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qh3ww0vgrv9qji9l9s2c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_LObBGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qh3ww0vgrv9qji9l9s2c.jpg" alt="GT Metrix results before Facebook Pixel fix"&gt;&lt;/a&gt;&lt;/p&gt;
Fig 1.1 — GT Metrix results before Facebook Pixel fix.



&lt;p&gt;Unedited, Facebook's little code snippet can add anywhere from 1.3–1.5 seconds to your page's load time. To make matters worse, the script is loaded, four HTTP requests made and 170KB added to your &lt;a href="https://whatdoesmysitecost.com/"&gt;page weight&lt;/a&gt; (or page size) all before your page's First Paint—that's before the first pixel is even visible on the screen.&lt;/p&gt;

&lt;p&gt;The entire point of page speed optimization is to reduce page weight and the number of HTTP requests, allowing the most important aspects of your page to load first. &lt;a href="https://webmasters.googleblog.com/2010/05/you-and-site-performance-sitting-in.html"&gt;According to Google&lt;/a&gt;, &lt;q&gt;2 seconds is the threshold for... site acceptability... at Google... under half a second.&lt;/q&gt; Considering a truly perfomant website loads in a second or less, do you really want to add Facebook's 1.5s to your site's page load time?&lt;/p&gt;

&lt;p&gt;If you're like me and using &lt;a href="https://gtmetrix.com"&gt;GT Metrix&lt;/a&gt; to test your page's performance, you will also be presented with some other warnings like &lt;strong&gt;Leverage browser caching&lt;/strong&gt;, &lt;strong&gt;Specify a cache validator&lt;/strong&gt; and &lt;strong&gt;Add Expires headers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So, how can we resolve these issues?&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Tag Manager
&lt;/h2&gt;

&lt;p&gt;Over at &lt;a href="https://www.8webdesign.com.au"&gt;8WebDesign&lt;/a&gt;, a recommended solution was &lt;a href="https://www.8webdesign.com.au/website-speed/facebook-pixel-making-website-slower/"&gt;to use Google Tag Manager&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This wasn't a bad attempt. It works in part and with some exceptions.&lt;/p&gt;

&lt;p&gt;The first issue is that while Google Tag Manager does indeed reduce page load time, it has no way of dealing with the cache issues listed earlier. You will still see warnings for &lt;strong&gt;Leverage browser caching&lt;/strong&gt;, &lt;strong&gt;Specify a cache validator&lt;/strong&gt; and &lt;strong&gt;Add Expires headers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The second problem and more importantly, unlike Google Analytics which is native to Google Tag Manager, the Facebook Pixel has to be added manually.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://developers.google.com/tag-manager/web/csp"&gt;Google Tag Manager snippet can be enabled with a nonce&lt;/a&gt; along with its native tags, but custom Javascript variables cannot. Adding the Facebook Pixel snippet to Google Tag Manager manually will get you a nasty error and worst of all, the script won't run. This creates a problem.&lt;/p&gt;

&lt;p&gt;This site uses a strong Content Security Policy and internal styles and scripts require either a hash or nonce to be loaded and executed. &lt;/p&gt;

&lt;p&gt;For those who are keeping up with the latest in website security and best practices, this solution won't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter The Fix
&lt;/h2&gt;

&lt;p&gt;To fix our problem, we need to first place the Facebook Pixel snippet at the end of our document, just before the closing &lt;code&gt;body&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;Next, we need to delay the snippet's execution until after the page has loaded by wrapping our script with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="cm"&gt;/* Facebook Pixel Code */&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks, &lt;a href="https://www.shaytoder.com/improving-page-speed-when-using-facebook-pixel/"&gt;Shay Toder&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security — Client Side
&lt;/h3&gt;

&lt;p&gt;We're going to add a nonce to our opening &lt;code&gt;script&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: If you're not generating nonces dynamically, for the purposes of this article, you can head over to &lt;a href="https://www.random.org/strings/"&gt;random.org&lt;/a&gt; and generate a random string.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;nonce=&lt;/span&gt;&lt;span class="s"&gt;"4yZwhMbBbX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Facebook Pixel image uses an inline style. Unfortunately, nonces don't work for inline styles. So, how do we get around this?&lt;/p&gt;

&lt;p&gt;First let's add a class to our &lt;code&gt;img&lt;/code&gt; tag like "pixel".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;noscript&amp;gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pixel"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.facebook.com/tr?id=YOUR_FACEBOOK_APP_ID&amp;amp;ev=PageView&amp;amp;noscript=1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To apply our styles, we can either place the inline CSS in a &lt;code&gt;style&lt;/code&gt; tag or use an external stylesheet. For the purposes of this article, we will use an internal style.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;nonce=&lt;/span&gt;&lt;span class="s"&gt;"4yZwhMbBbX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;.pixel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we put it all together, you should have something that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
    &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- End Footer --&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Facebook Pixel Code --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;nonce=&lt;/span&gt;&lt;span class="s"&gt;"4yZwhMbBbX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fbq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fbq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callMethod&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callMethod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
              &lt;span class="p"&gt;};&lt;/span&gt;
              &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fbq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fbq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
              &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
              &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
              &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://connect.facebook.net/en_US/fbevents.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;fbq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;init&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;XXXXXXXXXX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;fbq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;track&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PageView&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;noscript&amp;gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pixel"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.facebook.com/tr?id=XXXXXXXXXX&amp;amp;ev=PageView&amp;amp;noscript=1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;nonce=&lt;/span&gt;&lt;span class="s"&gt;"4yZwhMbBbX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;.pixel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- End Facebook Pixel Code --&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Closing Body Tag --&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- End Document --&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security — Server Side
&lt;/h3&gt;

&lt;p&gt;Last, but not least, we need to modify our Content Security Policy header to allow external scripts from Facebook's domains. So, we'll make the following changes to our &lt;code&gt;.htaccess&lt;/code&gt;—or whatever your configuration—file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Header add Content-Security-Policy " \
    style-src 'self' 'nonce-4yZwhMbBbX' connect.facebook.net; \
    script-src 'self' 'nonce-4yZwhMbBbX' connect.facebook.net; \
    img-src 'self' data:  www.facebook.com connect.facebook.net; \
    frame-src 'self' www.facebook.com; \
    frame-anscestors 'self' www.facebook.com; \
    form-action 'self' www.facebook.com/tr/ connect.facebook.net; \
    connect-src 'self' www.facebook.com; \
"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: &lt;code&gt;connect-src&lt;/code&gt; is required to allow these scripts to work in the Safari browser.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Oa-imZGI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rsmmmvftmb9335zky6t2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Oa-imZGI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rsmmmvftmb9335zky6t2.jpg" alt="Facebook Pixel GT Metrix After Results"&gt;&lt;/a&gt;&lt;/p&gt;
Fig 1.2 — GT Metrix results after implementing the Facebook Pixel fix.



&lt;ol&gt;
&lt;li&gt;By placing the Facebook Pixel at the end of our document, we allow our script to be loaded without interrupting our page's First Paint.&lt;/li&gt;
&lt;li&gt;Delaying the execution of the script by 3 seconds: 

&lt;ul&gt;
&lt;li&gt;reduces our page weight by 170Kb,&lt;/li&gt;
&lt;li&gt;and delays our HTTP requests so that it's not counted towards our page load time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;By using a Content Security Policy, we ensure that the only scripts running are those we want to run.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can check your results over at &lt;a href="https://gtmetrix.com"&gt;GT Metrix&lt;/a&gt; or with your browser's developer tools.&lt;/p&gt;

&lt;h4&gt;
  
  
  Resources
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.8webdesign.com.au/website-speed/facebook-pixel-making-website-slower/"&gt;8WebDesign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.shaytoder.com/improving-page-speed-when-using-facebook-pixel/"&gt;Shay Toder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.hootsuite.com/facebook-pixel/"&gt;Hootesuite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"&gt;MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>facebookpixel</category>
      <category>contentsecuritypolicy</category>
      <category>pagespeedoptimization</category>
      <category>pagespeedloading</category>
    </item>
  </channel>
</rss>
