外部JavaScriptファイルから別の外部JavaScriptファイルをインクルードする方法

まずファイル構成。

/root
├index.html
├a.js
└b.js

index.htmlでa.jsとb.jsの両ファイルをインクルードする方法は

<script type="text/javascript" language="JavaScript" src="a.js"></script>
<script type="text/javascript" language="JavaScript" src="b.js"></script>

が一般的です。

じゃあa.js内でb.jsをインクルードする方法は?

今のところ、JavaScriptにインクルード命令はありません。
しかしdocument.writeでゴリ押しできる模様。

index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<script type="text/javascript" language="JavaScript" src="a.js"></script>
</head>
<body>
</body>
</html>
a.js
document.write('<script type="text/javascript" language="JavaScript" src="b.js"></script>');
b.js
alert("b");

ファイル構成が変わるとどうなるか

全てのファイルが同じ階層に場合は問題ありません。
しかしa.jsとb.jsがライブラリとしてパッケージされているとして、以下のファイル構成の場合はどうなってしまうか。

/root
├/html
│└index.html
└/plugin
 └/library
  ├/a
  │└a.js
  └/b
   └b.js
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<script type="text/javascript" language="JavaScript" src="../plugin/library/a/a.js"></script>
</head>
<body>
</body>
</html>
a.js
document.write('<script type="text/javascript" language="JavaScript" src="../plugin/library/b/b.js"></script>');
                                                                          //↑ここのパスを修正しないといけない


各ファイルを1〜2つ下の階層に落とすだけでa.jsのソースを変更する必要がでてきました。
a.js内のb.jsをインクルードする箇所のパスは、a.jsからb.jsへの相対パスではなく、index.htmlからb.jsへの相対パスです。
a.jsはライブラリにパッケージされているので、これは非常にまずいです。
b.jsは変更する必要はありません。

ではどうすれば良いか

get_globalPath.jsをlibraryディレクトリ内に作成し、以下の様にします。

/root
├/html
│└index.html
└/plugin
 └/library
  ├get_globalPath.js
  ├/a
  │└a.js
  └/b
   └b.js
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<script type="text/javascript" language="JavaScript" src="../plugin/get_globalPath.js"></script>
<script type="text/javascript" language="JavaScript" src="../plugin/library/a/a.js"></script>
</head>
<body>
</body>
</html>
get_globalPath.js
function get_globalPath()
{
	var hoge = function()
	{
		var f = function(e)
		{
			var name = e.tagName;
			if( !!name && name.toUpperCase() == "SCRIPT" )
			{
				return e;
			}
			var c = e.lastChild;
			return (!!c)?f(c):null;
		};
		var es = f(document);
		if(!es)
		{
			return window.location;
		}
		return es.getAttribute("src") || window.location;
	}
	var path = hoge();

	if( "object" == typeof(path) )
	{
		path = path.href;
	}
	var array = path.split("/");
	array.splice(array.length - 2, 2);

	path = "";
	for(var y = 0, cnt = array.length; y < cnt; y++)
	{
		path+= array[y] + "/";
	}
	return path;
}
a.js
document.write('<script type="text/javascript" language="JavaScript" src="' + get_globalPath() + 'b/b.js"></script>');


これでファイル構成が変わってもindex.htmlファイル意外を修正する必要がなくなり、ライブラリとして独立できます。