<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>require.js &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/require-js/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jul 2013 01:49:29 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>head.jsのローダーを少し便利に使う拡張「head-require.js」</title>
		<link>https://blog.mach3.jp/2013/07/16/head-require.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 16 Jul 2013 01:49:29 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Extension]]></category>
		<category><![CDATA[head.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Loader]]></category>
		<category><![CDATA[require.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3170</guid>

					<description><![CDATA[自分用に書いて使っていたのですが、わりと便利だったのでここに記しておきます。 おさらい : head.jsってなに だいぶむかしに記事を書いたことがありましたが、 「head要素に入れるべき唯一のスクリプト」 と称してい [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>自分用に書いて使っていたのですが、わりと便利だったのでここに記しておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-3Xj7mHWDjX8/UeLVOBMVM6I/AAAAAAAACHU/MdxjxwS7S5s/s400/20130715-00.png" alt="head.jsのリソースローダーを少し便利に使う拡張「head-require.js」"/></figure>



<p></p>



<span id="more-3170"></span>



<h2 class="wp-block-heading">おさらい : head.jsってなに</h2>



<p>だいぶむかしに記事を書いたことがありましたが、 <em>「head要素に入れるべき唯一のスクリプト」</em> と称している便利なスクリプトです。</p>



<p>cf) <a href="/2011/03/headjs.html">head要素に読み込むべき唯一のスクリプト「headjs」 | Mach3.laBlog</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-3chTZXvUfB0/UeLVOKBzDqI/AAAAAAAACHU/jA2cONh5YxI/s500/20130715-01.png" alt="HeadJS, the only script in your head"/></figure>



<p><a href="http://headjs.com/">  </a></p>



<p>なにをしてくれるのかというと、</p>



<ul class="wp-block-list">
<li>Require.jsのようにリソースローダーとして機能する</li>



<li>Modenizrのようにモダン環境向けの機能判別をしてくれる</li>



<li>html5shivのように、レガシー環境でもHTML5のエレメントを使えるようにしてくれる</li>



<li>レスポンシブデザイン向けに、動的にHTML要素のクラス（.lt-1024等）を設定してくれる</li>
</ul>



<p>などなど、なかなか広い守備範囲です。 専門のスクリプトに敵わない部分もあると思いますが、「器用貧乏は美徳」をモットーとするわたくしとしてはとても他人とは思えず、大変気に入っています。</p>



<h2 class="wp-block-heading">リソースローダー機能拡張の経緯</h2>



<p>自分の中でhead.jsが最も大きな役割を果たしているのがリソースローダーの機能で、</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">head.js(
    <span class="hljs-string">"scripts/jquery.js"</span>,
    <span class="hljs-string">"scripts/underscore.js"</span>,
    <span class="hljs-string">"scripts/backbone.js"</span>,
    ...
);
</code></span></pre>


<p>などとすると、渡したパスのスクリプトをまとめて読みこんでくれます。 ですが、Require.jsとの2つの大きな違いをかねてよりもどかしく思っておりました。</p>



<ul class="wp-block-list">
<li>スクリプトをまとめてくれるコンパイラの存在</li>



<li>data-main属性でインポートしてくれるローダー</li>
</ul>



<p>他にも、強力な依存関係解決機能などがありますが、そこまで求めるならRequire.jsを素直に使うべきでしょう。 ジェネラリストはスペシャリストをその分野において超えない物。</p>



<h2 class="wp-block-heading">&#8220;head-require.js&#8221;</h2>



<p>そこで本題ですが、そのリソースローダー周りを解決する拡張機能を書いてみました。</p>



<h3 class="wp-block-heading"><a href="https://github.com/mach3/head-require">head-require</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-h9u3VGNKvo4/UeLVOMDefjI/AAAAAAAACHU/uuqMBHEmapw/s500/20130715-02.png" alt="head-require by mach3"/></figure>



<p><a href="https://github.com/mach3/head-require">  </a></p>



<p>色々ごちゃごちゃと入っておりますが、ブラウザで使用する際の本体は <em>dist/head-require.js</em> あるいは <em>dist/head-require.min.js</em> です。</p>



<h2 class="wp-block-heading">基本的な使い方</h2>



<p>まずはHTMLで <em>head.js</em> と <em>head-require.js</em> を読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"scripts/head.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"scripts/head-require.js"</span> <span class="hljs-attr">data-main</span>=<span class="hljs-string">"scripts/main.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>ここでhead-require.jsの要素に記述した <em>data-main</em> 属性のスクリプトを自動的に読み込みます。 main.js の中身は、例えば次のような感じに。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">head.<span class="hljs-keyword">require</span>(
    <span class="hljs-string">"vendors/jquery.js"</span>,
    <span class="hljs-string">"vendors/underscore.js"</span>,
    <span class="hljs-string">"vendors/backbone.js"</span>,
    <span class="hljs-string">"app/myapp.js"</span>
);
</code></span></pre>


<p><em>head.require()</em> は、引数に渡したスクリプトをまとめて読み込んで順次実行していきます。 myapp.js の中身が実行される頃には、jQueryもBackboneも初期化されて使えるようになっています。 また、内部で使用している head.js() の特性上、スクリプトが実行される頃にはDOMも準備万端なのでDOM readyを待つ必要はありません。</p>



<h3 class="wp-block-heading">注意事項</h3>



<ul class="wp-block-list">
<li>スクリプトへのパスは、HTMLドキュメントではなく <em>main.jsからの相対パス</em> です。</li>



<li>最後の引数は、 <em>head.js()</em> のようにコールバックは受け取れません。</li>
</ul>



<h2 class="wp-block-heading">コンパイラ（Gruntタスク）</h2>



<p>コンパイラは <a href="http://gruntjs.com/">Grunt</a> を使用します。 CLIも用意はしましたが、Gruntの方が色々と捗るのではないでしょうか。</p>



<p>まずnpmでインストールします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ npm install head-<span class="hljs-built_in">require</span>
</code></span></pre>


<p>Gruntタスクの設定はこんな具合です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">grunt</span>)</span>{
    grunt.npmLoadTasks(<span class="hljs-string">"head-require"</span>);
    grunt.initConfig({
        <span class="hljs-attr">headRequire</span>: {
            <span class="hljs-attr">dist</span>: {
                <span class="hljs-attr">options</span>: {
                },
                <span class="hljs-attr">files</span>: {
                    <span class="hljs-string">"scripts/dest.js"</span>: <span class="hljs-string">"scripts/main.js"</span>
                }
            }
        }
    });
};
</code></span></pre>


<p>中身は至って単純で、　<em>scripts/main.js</em> の中の <em>head.require()</em> に引数として渡されたファイル達を ひとつにかためたものを <em>scripts/dest.js</em> に突っ込んでいるだけです。</p>



<p><em>options</em> には以下の物が渡せます。</p>



<ul class="wp-block-list">
<li>uglify:Boolean (false) &#8211; uglify.jsでミニファイするかどうか</li>



<li>banner:String (&#8220;&#8221;) &#8211; ファイルの先頭にライセンス情報などを記したコメントをつけられます</li>



<li>head:String (&#8220;head&#8221;) &#8211; headオブジェクトの名前をhead_confで変更した時に</li>
</ul>



<h2 class="wp-block-heading">おまけ機能</h2>



<h3 class="wp-block-heading">appオブジェクト</h3>



<p><em>head-require.js</em> を読み込むと、<em>app</em> というオブジェクトがグローバルに生えます。 名前空間のように使うもよし、必要なければそっておいてあげてください。</p>



<p>appオブジェクトは簡単なゲッターセッターも備えているので、 アプリケーション間で共有したい値などあれば、どうぞ。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">app.set(<span class="hljs-string">"name"</span>, <span class="hljs-string">"MACH3"</span>);
app.get(<span class="hljs-string">"name"</span>); <span class="hljs-comment">// "MACH3";</span>

app.set({
    <span class="hljs-string">"name"</span>: <span class="hljs-string">"MACH3"</span>,
    <span class="hljs-string">"age"</span>: <span class="hljs-number">17</span>
});
app.get(); <span class="hljs-comment">// {"name": "MACH3", "age":17}</span>
</code></span></pre>


<p>衝突などを避けるためにappという名前を変更したい場合は、 <em>data-appname</em> 属性を使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">...</span> <span class="hljs-attr">data-main</span>=<span class="hljs-string">"scripts/main.js"</span> <span class="hljs-attr">data-appname</span>=<span class="hljs-string">"myapp"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>小中規模のサイトではわりと便利に使えています。 なにぶん目下開発中なもので、他にも実験中の隠し機能とかあったりしますが、 見つけたら優しくしてあげてください。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
