1) API 에 prefix 를 다는 방법
간단하지만 라이브러리가 복잡해지면 골치아픈 방법.
GM_log(), GM_getValue(), ..
2) 하나의 global object 를 정의하고 여기에 함수를 붙여가는 방법
체계적이고 충돌의 여지가 적다는 장점이 있지만, 매번 오브젝트를 뒤지므로 오버헤드가 있고, 타이핑이 길어지는 단점이 있음.
var goog={};
goog.array = {};
goog.array.binarySearch = function( ... );
Closure는 두번째 방식을 이용. closure compiler는 최적화를 하므로 오버헤드의 문제는 해결된다.
goog.provide(namespace) : namespace 정의
com.dopanysoft.Object 라는 오브젝트를 정의한다고 할때. goog.provide() 를 호출하면 여기서 정의된 오브젝트가 필요시 생성됨. 즉 Java에서의 패키지와 같은 개념으로 활용 가능. (자바처럼 디렉토리 구조가 일치해야 할 필요는 없음)
goog.provide("com.dopanysoft");
com.dopanysoft.Object = function() {...};
goog.require(namespace) : namespace 호출
myobject.js 라는 파일에서 goog.provide("com.dopanysoft")를 정의했다고 하면.
나중에 "com.dopanysoft" 를 어떻게 찾아야 할까? javascript 는 java와 달리 패키지 개념도 없고 말이지.
여기서 goog.addDependency()가 등장한다. (http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html 참고)
goog.addDependency() 는 goog.require() 에서 지정된 namespace를 담고 있는 javascript 파일의 경로를 지정해주고, 이렇게 지정된 javascript 파일들은 해당 goog.require() 가 호출된 script 의 뒷부분에서 <script>로 추가된다.
말이 좀 어려운데..
http://code.google.com/closure/library/docs/gettingstarted.html 에서 나온 예제를 예로 들자면, 다음과 같이 정의된 스크립트를
<script src="closure-library/closure/goog/base.js"></script> <script> goog.require('goog.dom'); </script> <script> var newHeader = goog.dom.createDom('h1'); </script>
이렇게 대치한다고 생각하면 될듯.
<script src="closure-library/closure/goog/base.js"></script> <script src="closure-library/closure/goog/dom/dom.js"></script> <script> var newHeader = goog.dom.createDom('h1'); </script>
closure api의 addDependency() 는 closure library에 포함되어 있는데,
"com.dopansoft" 와 같이 사용자가 만든 패키지의 namespace를 분석해서 addDependency()를 호출해주는 deps.js 코드 생성 툴이 바로 DepsWriter.