'Commonjs'에 해당되는 글 2건
CommonJS 는 JavaScript API를 정의하는 단체(=Group)이다.
자바스크립트는 빠르고 강력한 언어가 되었지만, 현재의 표준 JavaScript 스팩은 브라우져 환경을 벗어날 수 있는 API를 제공해 주지 못하고 있다.
CommonJS 는 JavaScript가 갖지 못한 API,
즉, Java 나 Ruby, Python이 갖고 있는 Standard Library API와 같은 API를 추가로 정의해서,
JavaScript를 범용 언어와 같이 만들고자 하는 것이다.
CommonJS 에서 가장 먼저 완성한 스팩은 Modules/1.0 이다.
(대부분이 말하는 CommonJS 를 따른다. 혹은 CommonJS 이다 라는 표현은, 이 CommonJS 모듈 스팩을 준수하고 있다 라는 뜻이다.)
Kris Kowal 님이 만드신, "CommonJS: JavaScript Everywhere" 라는 슬라이드 자료
CommonJS: JavaScript Everywhere
View more presentations from kriskowal
매우 간단하게 요약하자면,...
- Slide 5, 슬라이드에 초반에 Python 코드가 등장,
- Slide 6, JavaScript 로 Python 코드와 같은 코드를 작성할 수 있지만, 그 모든 방법은 표준이 아니다.
- Slide 7, 특히, 모듈, 파일 시스템, 웹 서버 게이트 웨이(?), 바이너리 데이터 등등이 표준에 없다.
(ECMAScript의 브라우져 관련 API는 표준으로 있는데,...) - Slide 8, CommonJS에서 표준화를 하자!
- Slide 11, CommonJS는 API 이다.
- Slide 16 ~ 49, CommonJS 표준엔 Modules 1.1 부터.. Packages 까지 정의가 되어 있다.
- Slide 52 ~ 53, (CommonJS API를 이용해서) 처음 등장한 Python 코드와 같은 역활을 하는 JavaScript 코드로 작성!!
CommonJS에서 표준화 작업중인 내용들
현재(2011.11.18), 아래와 같은 내용(=CommonJS 위키 페이지에서 확인 가능)들이 토론되어지고 있는 중이다.
- Uniform Baseline / 글로벌 (discussion) - 여러 JS 엔진에서 동일하게 동작하도록 하기위한 토론.
- 모듈 (1.1.1)
binary: 바이너리 데이터 타입 (byte arrays and/or strings) (proposals, discussion, early implementations)encodings: 인코딩과 문자열 (proposals, discussion, early implementations) -io: I/O 스트림 (proposals, discussion)fs,fs-base: 파일 시스템 (proposals, discussion, early implementations)system: 시스템 인터페이스 (stdin, stdout, stderr, &c) (1.0, amendments proposed)assert,test: 단위 테스트 (1.0, amendment proposals pending)sockets: 소켓 I/O TCP/IP 소켓 (early proposals)event-queue: 리액터(=Reactor, 이벤트 발생자)/이벤트 큐 (early proposals)worker: 워커(Worker) (공유하지 않는 동시(=concurrent) 프로세스/쓰레드) (proposal)console: 콘솔(=console) (proposal)
- 패키지 (1.0)
- Package Mappings (proposal)
- Web Server Gateway Interface (JSGI) (proposals, discussion, early implementations)
- Promises (proposal) - 비동기 처리를 위한 스팩
나에게 JavaScript는 그저 브라우저에서 내부적으로 HTML의 디자인을 바꾼다거나, 사용자의 사용성을 높이는 목적으로 사용되는 제한적인 언어라는 느낌이 강했다. 이런 문제점은, JavaScript가 원래 그런 목적으로 태어났기 때문이다. 하지만, 요즘 JavaScript는 엄청난 발전을 하고 있고, 브라우의 벽을 넘기 위해 많은 노력과 시도들이 있다. CommonJs 역시 그 시도 중 하나이다.
CommonJs 는 JavaScript 생태환경(Ecosystem) 생성을 위해 조직된 그룹이다. 그리고 그들의 목표로 하는 JavaScript 의 모습은, 브라우저 위에서의 JavaScript만이 아닌, Server-Side 프로그램, GUI 프로그램, 명령어 기반의 프로그램 등등 보통의 언어들이 할 수 있는 것들을 해낼 수 있는 언어로 만드는 것이다. 따라서 현재 IO, FileSystem,... 등등의 모듈을 중심으로 토론이 진행 중에 있다.
그리고 CommonJs의 제안에 따라 구현된 프로젝트 중에는 (내가 아는 것만 볼 때,) CouchDB, node.js, requirejs 같은 것들이 존재한다, 여기서 CommonJs의 제안을 따랐다는 의미는 CommonJs에서 정의한 모듈의 구조를 가졌다는 의미일 것이다.
우선, CommonJs 제안을 따르는 모듈의 모습을 살펴보자.(아래 코드는 해당 홈페이지에서..)
math.js
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
increment.js
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
};
program.js
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
module.id == "program";
코드만 살펴봐선, 모듈의 정의는 exports라는 변수를 통해서 외부로 노출하고, 각각의 모듈은 require 명령에 의하여 읽어들이는 방식으로 보인다.
CommonJS는 Dojo관련 개발자의 twitter에서 보고 대략 살펴본 것인데, 아직은 가야 할 길이 많이 있어 보인다. 꼭 목적을 달성할 수 있는 멋진 프로젝트가 되었으면 좋겠다.. 하하하.. 유치한 일기식 마무리~
좀더 자세히 쓰고 싶었지만, 쓰는 도중 http://commonjs.org/ 서버가 멈춰버린 듯 하다. 이런. 나머지는 다음에~