<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0"
  xml:lang="en"
   >
  <title type="text">Code Kills</title>
  <subtitle type="text"></subtitle>

  <updated>2012-01-22T21:05:58Z</updated>
  <generator uri="http://blogofile.com/">Blogofile</generator>

  <link rel="alternate" type="text/html" href="http://blog.codekills.net" />
  <id>http://blog.codekills.net/feed/atom/</id>
  <link rel="self" type="application/atom+xml" href="http://blog.codekills.net/feed/atom/" />
  <entry>
    <author>
      <name></name>
      <uri>http://blog.codekills.net</uri>
    </author>
    <title type="html">Loading Google Closure libraries from Node.js</title>
    <link rel="alternate" type="text/html" href="http://blog.codekills.net/2012/01/10/loading-google-closure-libraries-from-node.js" />
    <id>http://blog.codekills.net/2012/01/10/loading-google-closure-libraries-from-node.js</id>
    <updated>2012-01-10T06:24:42Z</updated>
    <published>2012-01-10T06:24:42Z</published>
    <category scheme="http://blog.codekills.net" term="JavaScript" />
    <summary type="html">Loading Google Closure libraries from Node.js</summary>
    <content type="html" xml:base="http://blog.codekills.net/2012/01/10/loading-google-closure-libraries-from-node.js">&lt;div class=&#34;document&#34;&gt;
&lt;p&gt;While developing &lt;a class=&#34;reference external&#34; href=&#34;http://wolever.github.com/remora/example/&#34;&gt;remora&lt;/a&gt; (which will be released &amp;quot;soon&amp;quot;) I had to load
&lt;a class=&#34;reference external&#34; href=&#34;http://code.google.com/closure/&#34;&gt;Google Closure&lt;/a&gt; libraries from &lt;a class=&#34;reference external&#34; href=&#34;http://nodejs.org/&#34;&gt;Node.js&lt;/a&gt;. As it turns out, I&#39;m the first
one who has had to do this, so a blog post seemed in order.&lt;/p&gt;
&lt;p&gt;I&#39;ve loaded my Closure library in Node by creating a Node module which loads
Closure&#39;s &lt;tt class=&#34;docutils literal&#34;&gt;base.js&lt;/tt&gt;, tells Closure how to load JavaScript files, loads my
Closure library, then exports everything (the &lt;tt class=&#34;docutils literal&#34;&gt;goog&lt;/tt&gt; name space and my
namespace) through &lt;tt class=&#34;docutils literal&#34;&gt;module.exports&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;First, an &lt;tt class=&#34;docutils literal&#34;&gt;execfile&lt;/tt&gt; function is needed, which will load and evaluate a
JavaScript file using a particular namespace:&lt;/p&gt;
&lt;pre class=&#34;literal-block&#34;&gt;
var vm = require(&amp;quot;vm&amp;quot;);
var fs = require(&amp;quot;fs&amp;quot;);

function execfile(path) {
  var data = fs.readFileSync(path);
  vm.runInThisContext(data, path);
}
&lt;/pre&gt;
&lt;p&gt;Note: for various reasons (one of which being &lt;a class=&#34;reference external&#34; href=&#34;http://stackoverflow.com/q/8873969/71522&#34;&gt;that you can&#39;t control the value
of &#39;this&#39; from the &#39;vm&#39; module&lt;/a&gt;) &lt;tt class=&#34;docutils literal&#34;&gt;vm.runInThisContext&lt;/tt&gt; &lt;em&gt;must&lt;/em&gt; be used to load
the scripts into the &lt;em&gt;global&lt;/em&gt; context. Trying to load the into a sandbox
seems to fail for reasons I can&#39;t fully explain yet.&lt;/p&gt;
&lt;p&gt;Next, the Closure &lt;tt class=&#34;docutils literal&#34;&gt;base.js&lt;/tt&gt; and &lt;tt class=&#34;docutils literal&#34;&gt;deps.js&lt;/tt&gt; files are loaded and
&lt;tt class=&#34;docutils literal&#34;&gt;CLOSURE_IMPORT_SCRIPT&lt;/tt&gt; is set to a thin wrapper around &lt;tt class=&#34;docutils literal&#34;&gt;execfile&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class=&#34;literal-block&#34;&gt;
var base_basedir = &amp;quot;../src/browser/&amp;quot;;
execfile(base_basedir + &amp;quot;base.js&amp;quot;);
execfile(base_basedir + &amp;quot;deps.js&amp;quot;);
goog.global.CLOSURE_IMPORT_SCRIPT = function(path) {
  execfile(base_basedir + path);
  return true;
};
&lt;/pre&gt;
&lt;p&gt;Now Closure libraries which use &lt;tt class=&#34;docutils literal&#34;&gt;&lt;span class=&#34;pre&#34;&gt;goog.require(...)&lt;/span&gt;&lt;/tt&gt; and
&lt;tt class=&#34;docutils literal&#34;&gt;&lt;span class=&#34;pre&#34;&gt;goog.provide(...)&lt;/span&gt;&lt;/tt&gt; can be loaded:&lt;/p&gt;
&lt;pre class=&#34;literal-block&#34;&gt;
execfile(&amp;quot;../src/remora.js&amp;quot;);
&lt;/pre&gt;
&lt;p&gt;(note: only the base library needs to be loaded; its dependencies will be taken
care of by &lt;tt class=&#34;docutils literal&#34;&gt;&lt;span class=&#34;pre&#34;&gt;goog.require(...)&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;Normal JavaScript packages can also be loaded:&lt;/p&gt;
&lt;pre class=&#34;literal-block&#34;&gt;
execfile(&amp;quot;../libs/underscore-1.2.3.js&amp;quot;);
&lt;/pre&gt;
&lt;p&gt;Finally, &lt;tt class=&#34;docutils literal&#34;&gt;module.exports&lt;/tt&gt; is set:&lt;/p&gt;
&lt;pre class=&#34;literal-block&#34;&gt;
module.exports = {
    goog: GLOBAL.goog,
    remora: GLOBAL.remora,
};
&lt;/pre&gt;
&lt;p&gt;Note: because Closure scripts expect that require/provide will inject items
into the global namespace, the global names created (ex, &lt;tt class=&#34;docutils literal&#34;&gt;goog&lt;/tt&gt; and
&lt;tt class=&#34;docutils literal&#34;&gt;remora&lt;/tt&gt;) cannot be deleted from the global namespace.&lt;/p&gt;
&lt;p&gt;And that&#39;s all there is to it. This file can now be loaded like any other Node
module (ex, &lt;tt class=&#34;docutils literal&#34;&gt;var my_closure_library = &lt;span class=&#34;pre&#34;&gt;require(&amp;quot;./closure_compat.js&amp;quot;)&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;For a complete example, see &lt;a class=&#34;reference external&#34; href=&#34;https://github.com/wolever/remora/blob/master/src/node/remora.dev.js&#34;&gt;remora/src/node/remora.dev.js&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
  </entry>
</feed>

