[컴][웹] javascript closure library 사용법




지금 생각으로는 이녀석으로 구조화된 programming 을 짜고나서, 배포시점에만 compile 해서 배포하면 될 듯 하다.


goog.require() and goog.provide()


goog.require 는 java 의 import,
goog.provide() 는 java 의 package 같은 느낌이다.

이들의 코드도 base.js 에서 찾아볼 수 있다.


closure/goog/base.js 의 goog.inherit() 코드는 나중에 살펴 보기로 하자.

상속하는 법(inherits)


goog.ui.MenuButton = function(content, opt_menu, opt_renderer, opt_domHelper) {
  goog.ui.Button.call(this, content, opt_renderer ||
      goog.ui.MenuButtonRenderer.getInstance(), opt_domHelper);
  ...
};
goog.inherits(goog.ui.MenuButton, goog.ui.Button);


goog.inherits() 는

  • goog.ui.MenuButton extends goog.ui.Button) 

라고 생각하면 된다.

그리고 constructor 에서 call() 을 사용해서 super class 의 constructor 를 호출해 줘야 한다.


Event 다루기

Event handling 과 관련해서는 ref.2 를 참고하라고 한다.

goog.events.listen(...)
를 사용해서 처리한다.



Hello World


ref. 3을 참고해서 hello world 를 한 번 작성해 보자.

먼저 closure library 를 download 받아서 압축을 풀자.

그리고 ref.3 에서 말하는 hello.html 과 hello.js 를 만들어서 놓자. 그러면 아래와 같은 모습이 된다.


closure-library 에 download 받은 library 를 설치하면 된다.



.\closure-library\closure\bin\build\closurebuilder.py --root=closure-library/ --root=mytest/ --namespace="mytest.start"

이런식으로 명령을 내리면, dependency 를 계산 할 수 있다. 결과값으로 아래처럼 보이는데, 아래 보이는 녀석들이 필요하다는 뜻으로 이해하면 될 듯 하다.

c:\Users\namhadmin\Documents\mine\programming\javascript\closure>.\closure-library\closure\bin\build\closurebuilder.py --root=closure-library/ --root=mytest/ --namespace="mytest.start"
C:\Users\namhadmin\Documents\mine\programming\javascript\closure\closure-library
\closure\bin\build\closurebuilder.py: Scanning paths...
C:\Users\namhadmin\Documents\mine\programming\javascript\closure\closure-library
\closure\bin\build\closurebuilder.py: 864 sources scanned.
C:\Users\namhadmin\Documents\mine\programming\javascript\closure\closure-library
\closure\bin\build\closurebuilder.py: Building dependency tree..
closure-library\closure\goog\base.js
closure-library\closure\goog\debug\error.js
closure-library\closure\goog\string\string.js
closure-library\closure\goog\asserts\asserts.js
closure-library\closure\goog\array\array.js
closure-library\closure\goog\dom\classes.js
closure-library\closure\goog\object\object.js
closure-library\closure\goog\dom\tagname.js
closure-library\closure\goog\useragent\useragent.js
closure-library\closure\goog\math\size.js
closure-library\closure\goog\dom\browserfeature.js
closure-library\closure\goog\math\math.js
closure-library\closure\goog\math\coordinate.js
closure-library\closure\goog\dom\dom.js
mytest\start.js



closure-compiler

compiler 는 아래 경로에서 download 받을 수 있다.
https://code.google.com/p/closure-compiler/wiki/BinaryDownloads?tm=2



compiler 를 download 받고, closure 로 만든 code 를 compiled code 로 사용할 수 있다. 아래와 같은 command 를 사용하면 된다.

c:\>.\closure-library\closure\bin\build\closurebuilder.py --root=closure-library/ --root=mytest/ --namespace="mytest.start" --output_mode=compiled --compiler_jar=compiler.jar > mytest/start-compiled.js


여기서 namespace 는 main 이 되는 .js 의 namespace 를 적어주면 된다. 그러면 관련돼서 쓰이는(require 에 걸쳐진 녀석들, 즉 dependency 가 있는 녀석들)은 알아서 같이 compile 된다.

주의 :
require 를 잘 적어놓지 않으면, 필요한 녀석이 compiled .js 파일에 제대로 들어가지 않는다.



Dependency

개인적으로 자신의 namespace 를 만들 수 있다. 이 자신만의 namespace 를 사용하기 위해서는 dependency file 이 필요하다. 참고로, Closure Library 는 deps.js 라는 dependency file 을 가지고 있다.

dependency 파일은 base.js 에 있는 goog.addDependency() 라는 함수를 이용해서 namespace 의 위치를 등록하고, namespace 와 dependency 가 있는 namespace 들을 등록한다. goog.addDependency() 는 아래와 같다.

goog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.structs.Map']);

base.js 가 있는 path 를 기본 path 로 잡고, 그에 대한 상대 적인 path (위에서 "dom/forms.js")를 적으면 된다.
  1. dom/forms.js 는 namespace 의 relative path 이다.
  2. goog.dom.forms 가 namespace 이다.
  3. goog.structs.Map 은 requried namespace 이다.

depswriter.py

이런 dependency file 을 자동으로 만들어 주는 녀석이 depswriter.py 이다.


depswriter.py 는 .js 를 읽어서 각 file 에 대해 goog.addDependency() 를 만들어 준다. 이 만든 addDependency 를 모아서 .js file 을 만들 수 있다.

이렇게 만들어진 .js 는 .html 에서 <script> tag 를 이용해서 사용하게 된다. 이 때 base.js 다음에 넣어야 한다. 이렇게 js 가 포함되면, goo.require() 를 통해 namespace 를 호출할 수 있게 된다.

<script src="/closure/goog/base.js"></script>
<script src="/myproject/myproject-deps.js"></script>
<script>
   goog.require('myproject.foo');
</script>


<body>

  <!-- content -->
  <script>
      myproject.foo.start();
  </script>
</body>



사용 예제

root 에 해당하는 경로는 depswriter.py 를 기준으로 어디에 있는지 알려줘야 한다. 그리고 prefix 의 경우는 아래 그림에서 처럼 addDependency 에 들어가는 prefix 가 된다. 아래와 같은 command 로 만들면 depswriter.py 가 있는 folder 에 myproject-dep*.js 가 만들어 질 것이다.

주의할 점은 prefix 는 base.js 파일이 있는 곳을 기준으로 .js 파일의 경로를 찾아갈 수 있도록 해주는 것이다.


c:\...\closure\closure-library\closure\bin\build>depswriter.py --root="..\..\..\..\mytest" > myproject-deps.js

c:\...\closure\closure-library\closure\bin\build>depswriter.py --root_with_prefix="..\..\..\..\mytest .\mytest" > myproject-deps2.js




Type casting





UI Demos



Reference

  1. https://developers.google.com/closure/library/docs/introduction
  2. https://developers.google.com/closure/library/docs/events_tutorial
  3. https://developers.google.com/closure/library/docs/gettingstarted
  4. https://developers.google.com/closure/library/docs/depswriter

댓글 없음:

댓글 쓰기