blob: e78e5154f9477a607ef8ba72f95edff1b29c2773 [file] [log] [blame]
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Outline JavaScript</title>
<link rel="stylesheet" href="doc.css">
</head>
<body>
<!--#include virtual="_header.html" -->
<div id=content>
<h1>Outline JavaScript</h1>
<h2>Configuration</h2>
<p>
The 'Outline JavaScript' filter is enabled by specifying:
</p>
<dl>
<dt>Apache:<dd><pre class="prettyprint"
>ModPagespeedEnableFilters outline_javascript</pre>
<dt>Nginx:<dd><pre class="prettyprint"
>pagespeed EnableFilters outline_javascript;</pre>
</dl>
<p>
in the configuration file.
</p>
<h2>Description</h2>
<p>
This filter is an <strong>experimental</strong> filter which takes inline
JavaScript and puts it in an external resource.
</p>
<h2>Operation</h2>
<p>
The 'Outline JavaScript' filter outlines all JavaScript that is larger
than a minimum threshold in bytes.
The threshold can be set by adding/changing the line:
</p>
<dl>
<dt>Apache:<dd><pre class="prettyprint"
>ModPagespeedJsOutlineMinBytes 3000</pre>
<dt>Nginx:<dd><pre class="prettyprint"
>pagespeed JsOutlineMinBytes 3000;</pre>
</dl>
<p>
in the configuration file.
</p>
<p>
For example, if the HTML document looks like this:
</p>
<pre class="prettyprint">
&lt;html&gt;
&lt;head&gt;
&lt;script type="text/javascript"&gt;
...
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div&gt;
Hello, world!
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
Then PageSpeed will rewrite it into:
</p>
<pre class="prettyprint">
&lt;html&gt;
&lt;head&gt;
&lt;script type="text/javascript" src="_.pagespeed.jo.tXBSxcB8mn.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="blue yellow big bold"&gt;
Hello, world!
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
And the new JavaScript file (<code>_.pagespeed.jo.tXBSxcB8mn.js</code>) will be:
<pre class="prettyprint">
...
</pre>
<h3>Example</h3>
<p>
You can see the filter in action at <code>www.modpagespeed.com</code> on this
<a href="http://www.modpagespeed.com/outline_javascript.html?ModPagespeed=on&amp;ModPagespeedFilters=outline_javascript">example</a>.
</p>
<h2>Pros and Cons</h2>
<p>
This could be advantageous if:
</p>
<ol>
<li>The JavaScript does not change much but the HTML does,
then we can cache the JavaScript.</li>
<li>when many web pages share the same inlined JavaScript, it will
be outlined to a consistent name and thus will be cached more.</li>
<li>The inline JavaScript is very long, in which case, outlining it
will cause it to be loaded in parallel with the HTML doc.</li>
</ol>
<p>
However, for some websites it will be dis-advantageous because it will:
</p>
<ol>
<li>create an extra HTTP request and</li>
<li>tie up one of the connections to this domain, which could have been
used to fetch the actually cacheable external resources.</li>
</ol>
<h2>Requirements</h2>
<p>
Outline filters can currently only run on single-server environments
because the resource can only be fetched from a server after that server
has rewritten the HTML page. If a different server rewrote the HTML page,
then this sever will not have the information needed to create the resource.
This could be by a network database shared between servers.
</p>
<p>
The 'Outline JavaScript' filter may need to <em>"absolutify"</em> relative
URLs, if it is outlined to a different directory than the original HTML.
</p>
<p>
The 'Outline JavaScript' filter will maintain the order of the script
blocks, as script order can be significant.
</p>
<h2>Risks</h2>
<p>
The 'Outline JavaScript' filter is considered low risk. However, JavaScript
can be written that walks the DOM looking for <code>&lt;script&gt;</code> tags
with certain syntax. Such JavaScript may behave differently on a page
which has changed <code>&lt;script&gt;</code> tags in this way.
</p>
<p>
Additionally, JavaScript can construct requests in arbitrarily complex
ways, so the filter may not be able to <em>absolutify</em> all relative URL
references, which could cause incorrect sub-resource requests.
</p>
</div>
<!--#include virtual="_footer.html" -->
</body>
</html>