io.js의 v2.0이 나왔습니다.

io.js logo

참 오래간만의 io.js 항목의 글입니다만, 최근에 io.js의 v2.0이 나왔습니다. 변경사항을 간추려서 설명하겠습니다. 쓰다 보니 길어졌기 때문에, 요약만 읽고 싶은 분은 마지막의 정리만 읽으셔도 됩니다.

io.js는 변화가 워낙 많은 편이라, v1.0에서 v2.0으로 되면서 여러 기능이 추가되고 있는데, 모르는 사람도 많지 않을까? 하고 생각합니다.

이번에는 v2.0의 단순한 변경 사항뿐만 아니라, v1.0부터 지금까지 추가된 기능을 요약해 소개해보려고 합니다.

Stream Simpler Construction (v1.2.0~)

Stream의 작성이 간단해졌습니다. 지금까지 Stream을 만들기 위해서는, 목적의 Stream을 상속해서 TransformStream이라면 _transform과 같은 메서드를 확장해서 구현할 필요가 있었습니다.

이를 더 간단히 하기위해 through2로 대표되는 헬퍼 라이브러리가 있었지만, 단순하게 설명하면 이 through2가 없어도 io.js에서는 Stream 생성을 간단하게 할 수 있게 되었습니다.

Stream의 Transform에 대해서, transform이나 flush를 얻을 수 있고, 이것을 사용하면 일부러 상속하지 않아도 Transform Stream을 만드는 것이 가능합니다. 아래와 같이 변경되었습니다.

before

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
javascript
var Transform = require('stream').Transform;
var util = require('util');

util.inherits(MyTransform, Transform);

function MyTransform(opts){
Transform.call(this, opts);
}

MyTransform.prototype._transform = function(chunk, encoding, callback){
// 여기에서 변환하고
...
// push 합니다.
this.push(chunk);
};

MyTransform.prototype._flush = function(done){
// 마지막에 무언가 하고 싶다면 여기서 flush 합니다.
}

after

1
2
3
4
5
6
7
8
9
10
11
var transform = new stream.Transform({
transform: function(chunk, encoding, next) {
// 여기에서 변환하고
...
// push 합니다.
this.push(chunk);
},
flush: function(done) {
// 마지막에 무언가 하고 싶다면 여기서 flush 합니다.
}
});

여기서는 Transform Stream만 설명했지만, Readable이나 Writable도 간단히 생성할 수 있게 되었습니다.

자세한 내용은 이 링크를 참조하세요. https://iojs.org/api/stream.html#stream_simplified_constructor_api

LTTNG 서포트 (v1.2.0~)

HTTP의 Request 혹은 서버의 Response, GC가 실행될 때 커널레벨에서 어떤 일이 벌어지는지를 추적하기 위한 기능이 추가되었습니다. 지금까지의 Node.js에서는 이것을 실행하기 위해서 Dtrace를 사용해 왔습니다만, Linux의 Dtrace 구현은 미숙해서, 모두 구현되어 있는 것이 아니었습니다. 결과적으로, Joyent가 제공하고 있는 SmartOS 같은 Solaris를 기반으로 한 Unix 환경에서만 Node.js가 Dtrace를 사용할 수 있도록 지원하고 있었습니다.

이제는 Linux 커널에서도 표준으로 트레이스가 가능한 LTTNG도 사용할 수 있게 되었습니다.

자세한 설명은 아래 링크를 보세요.

Node LTTNG

Promise의 unhandleRejection / rejectionHandled 이벤트 (v1.4.1~)

Promise에서 catch를 빠트렸을 때 포착되지 않는 예외를 나타내는 unhandleRejection, rejected로 인해 더이상 catch에 도달하지 않는 예외를 검출하기 위한 rejectionHandled 이벤트가 새롭게 추가되었습니다.

여기 잘 설명된 azu 님의 예제를 발췌하도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
var bluebird = require("bluebird");
// unhandledRejection catch되지 않은 예외
process.on("unhandledRejection", function (reason, promise) {
console.log("unhandledRejection");
});

var resolved = bluebird.resolve();
resolved.then(function () {
throw new Error("Yay!");
});
1
2
3
4
5
6
7
8
9
10
var Promise = require("bluebird");
process.on("rejectionHandled", function (promise) {
console.log("rejectionHandled");
});
var rejected = Promise.reject(new Error("Error Promise"));
setTimeout(function () {
rejected.catch(function () {
// rejected된 promise에 'catch' 실행
});
},100);

Promise Error Handling

Buffer에 indexOf 메서드가 추가되었습니다. (v1.5.0 ~)

Buffer에 대해 indexOf 메서드를 사용할 수 있게 되었습니다. 지금까지는 일단 String으로 변환하는 등의 방법을 통해, 내용의 문자열을 검색할 필요가 있었지만, 그럴 필요가 없게 되었습니다.

before

1
2
3
4
5
6
7
var fs = require('fs');

// ./foo.txt => yosuke furukawa
fs.readFile(__dirname + '/foo.txt', function(err, buf){
var str = buf.toString();
console.log(str.indexOf('furukawa')); // 7
});

after

1
2
3
4
5
6
var fs = require('fs');

// ./foo.txt => yosuke furukawa
fs.readFile(__dirname + '/foo.txt', function(err, buf){
console.log(buf.indexOf('furukawa')); // 7
});

자세한 설명은 여기를 참조하세요.

https://iojs.org/api/buffer.html#buffer_buf_indexof_value_byteoffset

node의 커맨드에 --require 옵션으로 preload 모듈을 넘길 수 있게 되었습니다. (v1.6.0~)

1
$ node --require ./a.js b.js

사전에 preload해놓고 싶은 경우 사용할 수 있습니다.

process.nextTick에 여러 개의 매개변수를 넘길 수 있게 되었습니다. (v1.8.0~)

1
2
3
4
5
6
var obj = {};

process.nextTick(function(a, b) {
assert.equal(a, 42);
assert.equal(b, obj);
}, 42, obj);

이 변경으로 인해, process.nextTick의 callback에 임의의 매개변수를 전달할 수 있게 되었습니다. API가 setTimeout과 setInterval과 비슷하게 되었습니다.

REPL에 history 저장기능이 추가 (v2.0~)

REPL의 magic mode라고 불리는 기능이 추가되어 있습니다. 이는 환경변수 NODE_REPL_HISTORY_FILE을 지정하는 것으로 REPL을 종료하더라도 다음 실행 시에 자신이 실행한 REPL의 내용을 기억해주는 기능입니다. 이른바 REPL의 history 저장 기능입니다.

1
2
3
4
5
6
7
8
9
$ NODE_REPL_HISTORY_FILE=~/.node_history iojs
> var fs = require('fs');
> fs.readFile;
# Ctrl-D


$ NODE_REPL_HISTORY_FILE=~/.node_history iojs
> # push up button
> fs.readFile;

이는 NODE_REPL_HISTORY_FILE을 지정하지 않으면 절대 적용되지 않습니다. 저는 .zshrc에 다음과 같이 설정하는 것으로 대응하고 있습니다.

1
2
# iojs
alias iojs-repl="NODE_REPL_HISTORY_SIZE=Infinity NODE_REPL_HISTORY_FILE=~/.node_history iojs"

이렇게 하면 iojs-repl로 실행할 경우에는 히스토리가 적용됩니다.

자세한 설명은 여기를 참조하세요. https://iojs.org/api/repl.html#repl_repl

ES6에서 기본적으로 사용할 수 있는 구문이 추가(v2.0~)

제가 좀 전에 만든 iojs의 새 기능 소개 저장소에도 설명했지만, 일본어로 설명을 추가합니다.

class

class가 기본적으로 사용할 수 있게 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// strict mode needed
'use strict';

class Animal {
constructor(name) {
this.name = name
}

say() {
// unimplemented
}
}

class Cat extends Animal {
say() {
console.log(`${this.name} < meow`);
}
}

var cat = new Cat('Mike');
cat.say(); // Mike < meow

이는 상당히 중요한데, io.js v2.0을 사용하는 데에는 util.inherits와 같은 상속의 헬퍼 메서드가 불필요하게 되고, 빌트인 클래스를 상속할 때도 사용 가능합니다.

enhanced object literals (v2.0~)

Object 리터럴 확장을 추가했습니다. 아래와 같이 key와 value의 변수명이 같을 때에는 간단히 작성할 수 있게 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'use strict';
// class
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
getInfo() {
let name = this.name;
let age = this.age;
let nextAge = this.age + 1;
// enhanced object literal
return {
name,
age,
nextAge
};
}
}

var bob = new Person('bob', 15);

console.log(bob.getInfo()); // { name: 'bob', age: 15, nextAge: 16 }

Rest 매개변수가 --harmony-rest-parameters 옵션을 통해 사용할 수 있게 되었습니다.

harmony option에 Rest 매개변수가 추가되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Rest parameters
function max(...args) {
// rest parameter is not Array-like object, that is just array.
console.log(Array.isArray(args)) // true
console.log(args.length) // 6

var max = args.reduce(function(max, n) {
return n > max ? n : max;
});
return max;
}

var maxNum = max(5, 15, 10, 1, 4, 5);
console.log(maxNum); // 15

실행하기 위해서는 아래와 같이 합니다.

1
$ iojs --harmony-rest-parameters es6/rest_params/rest.js

Computed property names가 --harmony-computed-property-names 옵션을 통해 사용할 수 있게 되었습니다.

harmony 옵션에 Computed property names를 사용할 수 있게 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var i = 0;
var a = {
["foo" + ++i]: i,
["foo" + ++i]: i,
["foo" + ++i]: i
};

console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3

var param = 'size';
var config = {
[param]: 12,
["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4
};

console.log(config);

아래와 같이 실행합니다.

1
$ iojs --harmony-computed-property-names es6/computed_property/computedProps.js

Strong mode를 지원합니다. (v2.0~)

현재, Google의 V8팀은 여러가지 시도를 하고 있는데, 그 중 StrongScript라 불리는 시도가 있습니다. 이것은, JavaScript의 자유도가 높은 구문(var, arguments, ==, delete, for-in 등)을 가능한 deprecated로 처리해서, ES6을 포함한 최신의 구문(let, ...args, ===, Map, for-of)으로 바꾸기 위한 시도입니다.

이 StrongScript는 코드의 선두에, 'use strong' 디렉티브를 추가하는 것으로 Strong Mode가 되어, 실행됩니다. 마치 'use strict'를 통해 Strict Mode로 설정하는 것과 동일합니다.

이번의 io.js v2.0부터 Strong Mode가 --strong_mode 옵션 추가로 사용할 수 있게 되었습니다.

  • 참고로 아직 실험적 시도이기 때문에, 실제 환경에서 사용하는 것은 권장하지 않습니다.

var ==> let/const

1
2
3
'use strong';

var a = 'hoge';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ iojs --strong_mode strong_mode/vars.js

/Users/yosuke/iojs_v2_features/strong_mode/vars.js:3
var a = 'hoge';
^^^
SyntaxError: Please don't use 'var' in strong mode, use 'let' or 'const' instead
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:411:25)
at Object.Module._extensions..js (module.js:446:10)
at Module.load (module.js:353:32)
at Function.Module._load (module.js:308:12)
at Function.Module.runMain (module.js:469:10)
at startup (node.js:124:18)
at node.js:882:3

arguments => ...args

1
2
3
4
5
6
7
'use strong';

function some() {
let args = Array.prototype.slice.call(arguments);
}

some();
1
2
3
4
5
6
7
8
9
10
11
12
13
$ iojs --strong_mode strong_mode/arguments.js
/Users/yosuke/iojs_v2_features/strong_mode/arguments.js:4
let args = Array.prototype.slice.call(arguments);
^^^^^^^^^
SyntaxError: Please don't use 'arguments' in strong mode, use '...args' instead
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:411:25)
at Object.Module._extensions..js (module.js:446:10)
at Module.load (module.js:353:32)
at Function.Module._load (module.js:308:12)
at Function.Module.runMain (module.js:469:10)
at startup (node.js:124:18)
at node.js:882:3

eqeq => eqeqeq

1
2
3
4
'use strong';

if ('a' == 'a') {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ iojs --strong_mode strong_mode/eqeq.js

/Users/yosuke/iojs_v2_features/strong_mode/eqeq.js:3
if ('a' == 'a') {
^^
SyntaxError: Please don't use '==' or '!=' in strong mode, use '===' or '!==' instead
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:411:25)
at Object.Module._extensions..js (module.js:446:10)
at Module.load (module.js:353:32)
at Function.Module._load (module.js:308:12)
at Function.Module.runMain (module.js:469:10)
at startup (node.js:124:18)
at node.js:882:3

property를 삭제할 때, delete를 사용하지 않고, Map/Set을 사용

1
2
3
4
'use strong';
let obj = { key: 'value'};
delete obj.key;
console.log(obj);
1
2
3
4
5
6
7
8
9
10
11
12
13
$ iojs --strong_mode strong_mode/delete.js
/Users/yosuke/iojs_v2_features/strong_mode/delete.js:5
delete obj.key;
^^^
SyntaxError: Please don't use 'delete' in strong mode, use maps or sets instead
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:411:25)
at Object.Module._extensions..js (module.js:446:10)
at Module.load (module.js:353:32)
at Function.Module._load (module.js:308:12)
at Function.Module.runMain (module.js:469:10)
at startup (node.js:124:18)
at node.js:882:3

for-in => for-of

1
2
3
4
5
'use strong';

for (let k in [1, 2, 3]) {
console.log(k);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
$ iojs --strong_mode strong_mode/for.js
/Users/yosuke/iojs_v2_features/strong_mode/for.js:3
for (let k in [1, 2, 3]) {
^^
SyntaxError: Please don't use 'for'-'in' loops in strong mode, use 'for'-'of' instead
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:411:25)
at Object.Module._extensions..js (module.js:446:10)
at Module.load (module.js:353:32)
at Function.Module._load (module.js:308:12)
at Function.Module.runMain (module.js:469:10)
at startup (node.js:124:18)
at node.js:882:3

폭넓은 환경의 지원(v1.4.0, v1.6.0, v1.8.0)

이번에, 상당히 빌드 환경에 기합이 들어가 있어, 폭넓은 환경에서 바이너리가 제공되고 있습니다. Node.js였을 때는, darwin(osx), linux, sunos(solaris), windows의 바이너리가 제공되는 것뿐이었는데(그것만으로도 상당히 대단하긴 했지만), io.js부터는 ARM v6, v7을 포함해 상당히 많은 환경에서 바이너리가 제공되고 있습니다.

binary는 제공되지 않지만, Android에서 기동하기 위한 옵션이 있거나, SmartOS, FreeBSD에서 기동하기 위한 옵션이 제공되고 있습니다.

또 여러 OS의 가상 환경을 구축하고 그 위에서 테스트를 실행하고 있습니다. 어딘가의 환경에서 에러가 발생하면 즉시 알 수 있게 되어있습니다.

https://jenkins-iojs.nodesource.com/job/iojs+any-pr+multi/

의존 라이브러리 관련(v2.0.0~)

v8이 4.2가 되었습니다.

v8이 새로워졌기 때문에, JavaScript의 최적화 및 ES6의 기능이 늘어났습니다. 이에 관해서는 좀 전에 소개했습니다. 또 v8이 업그레이드되면서, V8의 API가 갱신되고 Native Module도 변경이 필요하게 됐습니다.

즉, 낡은 Native module의 상태로는 작동하지 않게 되었습니다.

현 시점에서 v2.0에서 동작하지 않는 모듈 목록에 관해서는 아래의 이슈를 읽어 주세요.

github.com

nan갱신하는 것만으로 가능한 모듈도 많기 때문에, 잊고 있는 모듈에 관해서는, 지금 nan을 갱신해서 풀 리퀘스트를 통해 알려주는 것이 좋지 않을까 하고 생각합니다. 다만 이번 v8이 갱신되는 것 만으로, 동작하지 않게 되는 모듈이 많으면 곤란하기 때문에, nan을 core에 넣자는 제안도 있습니다.

OpenSSL v1.0.2a가 되었습니다.

OpenSSL이 v1.0.2a가 되고, crypto의 성능이 개선되었습니다. 이 글이 자세히 설명하고 있습니다. [1]

github.com

http-parser v2.5.0이 되었습니다.

http-parser가 드디어 갱신되었습니다. 일단 http-parser는 v2.4가 된 후, 버그가 발견되고 버전이 돌아갔지만, 그 버그가 수정되어, 고속화된 http-parser가 사용할 수 있게 되었습니다.

libuv가 v1.4.2가 되었습니다.

libuv가 새로워졌습니다. windows/linux에서의 버그 수정 및 ARM에서도 동작하기 위한 수정 등이 포함되어 있습니다.

npm이 v2.9.0이 되었습니다.

npm도 새로워졌습니다. 번역이 있으므로, 한 번 보는 것도 좋겠습니다. medium.com

정리 (v1.0 ~ v2.0의 다른 점)

  • Stream을 간단히 만들 수 있게 되었습니다.
  • LTTNG의 지원
  • promise의 unhandledRejection / rejectionHandled 이벤트
  • Buffer의 indexOf 메서드 추가
  • node --require 옵션 추가
  • repl에 history 옵션 추가
  • v8이 새로워지고, class, object 리터럴의 확장 etc와 Strong Mode의 추가
  • ARM을 시작으로, 바이너리 제공과 폭넓은 환경의 지원
  • 의존 라이브러리의 갱신을 통한 성능 향상, 버그 수정 등

끝맺음

자, 이번에 v1.0부터 지금까지의 변경 사항을 슥삭 정리해 봤습니다. 앞으로의 변경사항은 일본어로 작성되어, blog.iojs.jp에 정리되고 있습니다.[2]

변화가 극심한 io.js를 따라가는 것은 힘든 일이지만, 이 글을 매주 조금씩 읽어둔다면 도움이 될 것입니다.

또, 코어 팀은 지금 v3.0을 향해서 움직이기 시작했습니다. 저도 조금씩 기여하고 있습니다. 이 변화를 즐기면서 공헌할 수 있다면 좋겠다고 생각합니다.


  1. 大津 님이 써주셨습니다. 大津 님++

  2. 언제나 번역해주시는 @watilde 님, @jgs 님, @kosamari 님에게 감사드립니다.

io.js 주간 뉴스 2015년 5월 1일

io.js 2.0 릴리스 후보

io.js 2.0 릴리스 후보, 커뮤니티 업데이트, 행사들.

이번 주에 io.js v2.0(nightly)을 배포했습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

커뮤니티 업데이트

  • johnny-five 사이트를 개설했습니다.
  • iojs.io 도메인은 프로젝트에 기부했고, iojs.org로 리다이렉트 될 것입니다. iojs/io.js#1534
  • david-dm.org는 iojs를 사용 중입니다.
  • io.js v2.0 릴리스 후보는 여기서 확인하세요.
  • io.js ARM 클러스터는 발전하고 있습니다.
  • 여러 커미터들이 추가로 참여하게 되었습니다.iojs/io.js#1552
  • io.js TC 회의가 4월 29일 YouTubeSoundCloud에서 진행되었습니다.
  • io.js/node.js 코드 통합 계획 초안이 나왔습니다.
  • io.js/node.js의 코드 통합을 위한 초기 저장소를 생성했습니다.
  • Node.js 재단의 통합 관리 방침 회의를 YouTube에서 보실 수 있습니다.
  • Microsoft는 Electron(AtomShell) 기반의 새로운 Visual Studio Code를 배포했습니다.
  • io.js는 Modulus를 지원할 것입니다.
  • Yosuke Furukawa가 다가올 io.js v2.0의 변화를 다룬 iojs-new-features 저장소를 만들었습니다.

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 티켓 판매 중. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

io.js 주간 뉴스 2015년 4월 24일

io.js 1.8.1 릴리스, 새 TC 멤버를 위한 제안, 커뮤니티 업데이트, 행사 등…

io.js 1.8.1 릴리스

이번 주, 우리는 io.js v1.8.1을 릴리스했습니다. 전체 changelog는 GitHub에서 확인할 수 있습니다.

주요 변경 사항

  • 알림: 릴리스 툴의 문제로 v1.8.0을 건너뜁니다. #1436
  • build: io.js를 정적 라이브러리로 빌드하기 위한 지원 추가 (Marat Abdullin) #1341
  • deps: openssl을 1.0.2a로 업그레이드 (Shigeki Ohtsu) #1389
  • crypto API의 성능 향상이 있을 것입니다. 자세한 것은 여기를 확인하세요.
  • npm: npm을 2.8.3으로 업그레이드했습니다. 자세한 것은 릴리즈 노트를 확인해 주세요. 향상된 git 지원을 포함합니다.
  • src: process.nextTick에 여러 매개 변수를 사용할 수 있도록 허용 (Trevor Norris) #1077
  • module: NODE_PATHrequire(‘.’)의 상호 작용이 복원되고 폐기되었습니다. 이 기능은 나중에 제거될 것입니다. (Roman Reiss) #1363

알려진 문제

  • beforeExit 중에 참조 해제된 타이머에 대한 문제가 아직 남아 있습니다. #1264.
  • REPL에 입력된 서로게이트 페어가 터미널을 얼릴 수 있습니다. #690
  • process.send()가 문서에 쓰여진 것처럼 동기적이지 않으며, 이 문제는 1.0.2에서 발생했습니다. #760 그리고 #774에 해결.
  • DNS 질의 진행 중에 호출된 dns.setServers()가 실패한 단언문으로 프로세스를 크래시시킬 수 있습니다. #894
  • url.resolve가 다른 두 호스트 사이를 해석하는 중 URL의 인증 정보 부분을 교환할 수 있습니다. #1435
  • readline: 분리된 이스케이프가 제대로 처리되지 않습니다. #1403

커뮤니티 소식

다가오는 이벤트

  • JSConf 우루과이 입장권을 판매하고 있습니다. 4월 24일과 25일 우루과이 몬테비데오에서 열립니다.
  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • NodeConf EU 티켓 판매 중. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

io.js 주간 뉴스 2015년 4월 17일

io.js 1.7 릴리스, 커뮤니티 업데이트와 이벤트 등

io.js 1.7 릴리스

이번 주에 io.js v1.7.0v1.7.1을 릴리스했습니다. 전체 변경사항은 GitHub에서 볼 수 있습니다.

주요 변경 사항

  • 빌드: 1.7.0을 출시할 수 없게 만든 Makefile의 문법 에러를 수정했습니다. (Rod Vagg) #1421.
  • C++ API: Fedor Indutny가 io.js에 포함된 V8에 있던 기능을 V8로 포팅했습니다. SealHandleScope를 사용하면 C++ 애드온 제작자가 HandleScope봉인(seal) 하여 애드온에서 발생하는 일어날 수 있는 의도하지 않은 할당을 방지할 수 있습니다. 현재는 io.js의 디버그 빌드에서만 사용가능합니다. 이 기능을 사용하면 #1075의 메모리 누수를 탐지할 수 있으며 현재는 io.js의 루트 HandleScope에서 활성화되어 있습니다. (Fedor Indutny) #1395.
  • ARM: 이번 릴리스에는 빌드와 테스트에 있어 ARM에 대한 지원이 대폭 개선되었습니다. io.js CI 클러스터의 ARMv6, ARMv7, ARMv8 빌드 서버가 (거의) 모든 빌드와 테스트를 통과했다고 보고하고 있습니다.
  • ARMv8 64비트 (AARCH64)를 이제 제대로 지원합니다. libuv에서 epoll_wait()의 존재 여부를 오판하던 문제에 대한 수정사항도 포함되었습니다. (Ben Noordhuis) #1365. ARMv6: #1376(라스베리 파이 포함)에서 Math.exp()를 사용할 때 문제가 발생한다는 보고가 있습니다. V8의 "fast math" 기능을 사용할 때 ARMv6의 잘못된 코드 생성기가 범인이었습니다.  이 문제를 피하기 위해 ARMv6에서는 —nofast_math를 기본값으로 사용하도록 했습니다. —fast_math를 사용하면 fast math 기능을 사용할 수 있습니다. (Ben Noordhuis) #1398. 테스트: ARMv6, ARMv7과 같은 느린 플랫폼에서 타임아웃 시간을 조정했습니다. (Roman Reiss) #1366.
  • npm: npm을 2.7.6으로 업그레이드 했습니다. 자세한 사항은 릴리스 노트를 참고하세요.

알려진 이슈

  • beforeExit 실행 중에 참조되지 않은 타이머가 실행되는 문제점이 있습니다. #1264 참고.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 버그는 1.0.2에서 나타났었습니다. 문제에 대해서는 #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 프로세스가 중단될 수 있습니다. #894.
  • readline: 분할 이스케이프가 올바르게 처리되지 않습니다. #1403.

커뮤니티 업데이트

  • io.js와 노드 재단의 차이점 iojs/io.js#1416.
  • NPM에 비공개 모듈이 공개되었으며 npm 주식회사는 추가 투자를 받았습니다.
  • Medium에 Node.js 재단에 대한 생각이라는 글이 게시되었습니다.
  • io.js 위키에 io.js v1.8.0의 crypto 성능에 대한 글을 게시했습니다.
  • 오라클 블로그에 io.js가 언급되었습니다.
  • 2015년 4월의 io.js 빌드 현황입니다.

다가오는 이벤트

  • JSConf Uruguay 입장권을 판매하고 있습니다. 4월 24일과 25일, 우르과이 몬테비데오에서 열립니다.

io.js 주간 뉴스 2015년 4월 10일

io.js 1.6.4 릴리스

이번 주에는 v1.6.4 릴리스가 있었습니다. GitHub에서 전체 변경사항을 볼 수 있습니다.

주요 변경 사항

  • npm: npm을 2.7.5로 업그레이드했습니다. 자세한 내용은 npm CHANGELOG.md를 참조하세요. 두 가지 중요한 보안 수정이 있었습니다.
  • openssl: OpenSSL 1.0.2a로 업그레이드 하기 위한 예비 작업이 완료되었습니다. #1325(Shigeki Ohtsu) 자세한 사항은 #589를 참조하세요.
  • timers: 관련 타이머 이슈 #1330와 함께, 타이머가 참조되었을 때의 자잘한 메모리 누수가 수정되었습니다.(Fedor Indutny) 이 이슈는 #1075에 보고되었던 누수도 수정한 것으로 보입니다.
  • android: 이제 안드로이드와 관련 장비에서 io.js를 컴파일할 수 있습니다. #1307(Giovanny Andres Gongora Granada)

알려진 이슈

  • 참조되지 않은 타이머가 beforeExit에서 실행될 때 발생하는 일부 문제는 여전히 처리되어야 합니다. #1264를 참조하세요.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • io.js를 정적 라이브러리로 빌드할 수 없습니다. #686
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 회귀는 1.0.2에서 발생했습니다. #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 크래시가 발생할 수 있습니다. #894

커뮤니티 업데이트

  • Node 재단의 개발 방침 초안을 여기에서 볼 수 있습니다.
  • io.js에서 ARMv8 / ARM64를 지원합니다.
  • node.js/io.js의 새로운 개발 방침을 작성 중입니다.
  • 수요일에 TC 미팅이 있었습니다.

다가오는 이벤트

  • JSConf Uruguay 입장권을 판매하고 있습니다. 4월 24일과 25일, 우르과이 몬테비데오에서 열립니다.
  • NodeConf 입장권을 판매하고 있습니다. 6월 8일과 9일, 캘리포니아 오클랜드에서 열리며, NodeConf Adventure는 6월 11일~14일, 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일~10일, 워싱턴주에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일~9일, 아일랜드 워터퍼드에서 열립니다.
  • nodeSchool tokyo가 4월 12일 일본의 도쿄에서 개최될 예정입니다.

io.js 주간 뉴스 2015년 4월 3일

io.js 1.6.3 릴리스, 내부 모듈, 화해 진행

v1.6.3 릴리스

이번 주에는 io.js v1.6.3 릴리스가 있었습니다. GitHub에서 전체 변경사항을 볼 수 있습니다.

주요 변경 사항

  • fs: 특정 상황에서 fs.writeFileSync(), append 모드의 fs.writeFile()fs.writeFileSync()가 손상을 일으킬 수 있습니다. 이 이슈는 #1058에서 보고돼서 #1063에서 수정했습니다. (Olov Lassus)
  • iojs: 핵심 코드를 공개 API로 노출하지 않고 내부적으로만 JavaScript 모듈에 공유할 수 있도록 내부 모듈(internal modules) API를 도입했습니다. 이 기능은 핵심 코드에서만 사용합니다. #848 (Vladimir Kurchatkin)
  • timers: timers와 관련된 사소한 두 가지 문제를 수정했습니다.
    • Timer.close()는 이제 적절하게 멱등입니다. #1288 (Petka Antonov).
    • setTimeout()는 콜백에서 unref() 이후 딱 한 번만 콜백을 실행할 것입니다. #1231 (Roman Reiss).
    • NOTE: #1152처럼 timers 코드와 관련된 해결되지 않은 이슈들도 있습니다.
  • Windows: 윈도우에서 컴파일된 애드온을 위해 "지연 로딩 훅(delay-load hook)"을 추가해서 윈도우 사용자가 io.js의 애드온에서 경험할 수 있는 일부 문제를 줄일 것입니다. #1251 (Bert Belder)
  • V8: V8을 4.1.0.27로 업데이트해서 사소한 버그들이 수정되었습니다.
  • npm: npm을 2.7.4로 업그레이드했습니다. 자세한 내용은 npm CHANGELOG.md 를 참조하세요.

알려진 이슈

  • timers와 unref()에서 발생하는 일부 문제는 여전히 처리되어야 합니다. #1152를 참조하세요.
  • 원인을 아직 알 수 없는 미미한 메모리 누수가 있을 수 있습니다. 자세한 사항은 #1075를 참조하세요.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • io.js를 정적 라이브러리로 빌드할 수 없습니다. #686
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 회귀는 1.0.2에서 발생했습니다. #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 크래시가 발생할 수 있습니다. #894

커뮤니티 업데이트

다가오는 이벤트

  • NodeConf 입장권을 판매하고 있습니다. 6월 8일과 9일, 캘리포니아 오클랜드에서 열리며, NodeConf Adventure는 6월 11일~14일, 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일~10일, 워싱턴주에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일~9일, 아일랜드 워터퍼드에서 열립니다.
  • nodeSchool tokyo가 4월 12일 일본의 도쿄에서 개최될 예정입니다.

node.js와 io.js가 손잡을 수 있도록 도와주세요.

node.js와 io.js가 손잡을 수 있도록 도와주세요.

우리는 서로 어느 때보다도 더 가까워졌지만, 당신의 도움이 필요합니다.

지난 몇 주간 리눅스 재단 사람들과 Node.js 그리고 io.js는 프로젝트들과 작업그룹들이 서로 조화로울 수 있는 개방된 관리 체계 구조의 초안을 작성해 왔습니다. 현재는 그 내용을 검토하는 중요한 단계에 와 있습니다.

저는 그와 관련된 문서를 만들고 이곳에 링크할 것입니다. 적절한 이슈에 의견을 적어주시고 그 문서에 새로운 풀 리퀘스트도 제안해 주시기를 부탁합니다.

프로젝트 생명주기

재단에서는 핵심만을 위한 규정보다는 프로젝트들에 관한 규정을 더 포함해야 합니다. 오늘날 io.js는 홀로 약 300여 명의 회원이 있는 50여 개의 작업그룹을 가지고 있습니다. 이 문서에 그 작업그룹들이 운영될 구조를 정의할 것입니다.

io.js에서 우리는 아무런 자원(돈, 법률 등)을 갖지 않습니다. 비용이 들지 않기 때문에 우리는 새로운 작업그룹과 프로젝트들을 활성화하는 데에 매우 자유로울 수 있습니다. 보통 한 재단에서는 프로젝트별로 충당하는 자원이 있고 이사회는 이러한 자원을 보호하기 위해서 더 많은 제약을 요구하게 됩니다. 그러나 io.js의 성공은 많은 부분 아무 제약 없이 자유롭게 작업그룹 내에서 일을 쉴 수 있었다는 것에 기인합니다. 따라서 이 균형을 찾기 위한 작업이 좀 필요할 것입니다.

의견수집을 위해 풀 리퀘스트를 열었지만, 커뮤니티로부터 여전히 많은 작업과 추가적인 의견이 필요합니다.

기술 결정 위원회(TSC) 협약

기술 결정 위원회(Technical Steering Committe, TSC)는 단일화된 io.js와 node.js 플랫폼의 관리의 주요한 주체가 될 것입니다. io.js에 익숙한 사람들에게는 새로운 기술위원회가 될 것이며 아마도 node.js의 핵심 커미터들뿐만 아니라 기존의 io.js TC 회원들도 받아들이게 될 것입니다.

기술 결정 위원회 협약은 결국 이사회의 승인을 받게 될 것입니다. 그것은 특정한 권리(재단 이사회로부터 기술적인 의사결정의 자율성과 같은)가 그 안에 있어야 한다는 것을 의미합니다. 이 문서의 수정을 위해서는 이사회의 승인이 필요한데 이는 한번 공식화되면 변경이 어렵다는 것을 의미합니다.

하나의 문서에 견고한 관리체계와 함께 현재의 TC 프로세스가 혼재되어있는 io.js와는 달리, 이 협약은 자유와 개방된 관리를 보장하는 동시에 가능한 최소한의 내용을 포함해야 합니다. 우리는 io.js가 지난 4개월간 해왔던 것처럼 TC 프로세스를 계속 반복하길 원합니다. 그리고 우리가 이 문서에 프로세스와 관련된 세세한 규정을 지나치게 많이 담는다면, 그것은 꽤 곤란하게 될 것입니다. 우리는 이 선을 지키기 위해 지역의 식별과 언어를 개선하는 데 도움이 필요합니다.

기술 결정 위원회 정책 초안

이 문서에서 재단 이사회가 기술 결정 위원회가 할 방향과 가치 그리고 범위를 비준할 것입니다.

거기서 만들어진 재단의 모델에는 이사회와 선임된 경영진에 의해서 관리되는 "재단"과 기술 결정 위원회에 의해 관리되는 "프로젝트" 사이에 벽이 있습니다. 이 문서는 이사회가 기술 결정 위원회에게 인정해주는 부분, 그리고 기술 결정 위원회 방향성과 요구사항(개방성 같은)들을 서술합니다.

일부 문제(법적인 문제 등)는 기술 결정 위원회에게 남아있지 않고 재단에 의해 다루어지므로 이 문서에 포함되지 않습니다.

io.js 주간 뉴스 2015년 3월 27일

io.js 1.6.2 릴리스

이번 주에는 v1.6.2 릴리스가 있었습니다. GitHub에서 전체 변경사항을 볼 수 있습니다.

주요 변경 사항

1.6.2

  • Windows: Windows 지원 상태의 개선작업으로 전체 테스트를 다시 통과하게 되었습니다. v1.4.2의 릴리스 노트에서 언급했듯이, CI 시스템과 설정이 Windows 테스트의 바른 문제 보고를 방해하던 문제와 CI와 코드베이스의 문제는 완전히 해결된 것으로 보입니다.
  • FreeBSD: io.js/Node.js에 영향을 주는 커널 버그발견되어 io.js에서 이 문제가 일어나지 않도록 수정했습니다.(Fedor Indutny) #1218.
  • module: 이제 require('./') 대신 require('.')를 사용할 수 있습니다. 이 변경은 버그 수정으로 간주합니다.(Michaël Zasso) #1185.
  • v8: 4.1.0.25로 업데이트 했습니다. 여기에는 --max_old_space_size4096을 넘는 값을 사용한 경우 발생하는 문제의 수정사항과 Solaris 지원이 들어있습니다. 언급된 수정은 이미 io.js에 포함되어 있습니다.

알려진 이슈

  • 원인을 아직 알 수 없는 미미한 메모리 누수가 있을 수 있습니다. 자세한 사항은 #1075를 참조하세요.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • io.js를 정적 라이브러리로 빌드할 수 없습니다. #686
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 회귀는 1.0.2에서 발생했습니다. #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 크래시가 발생할 수 있습니다. #894

커뮤니티 업데이트

  • Node.js Technical Governance 초안이 제안되었습니다. 여기에서 초안을 확인하실 수 있습니다.
  • Microsoft Visual Studio 팀이 Visual Studio를 위한 Node.js Tools 1.0을 릴리스 했습니다. 이 릴리스에는 리치 에디터, 코드 자동완성, 대화형 윈도우, 고급 디버깅과 프로파일링이 포함됩니다. 공지를 읽어보세요.
  • node.js, io.js SPM 모니터 지원, 모니터에 성능 모니터링, 경고 및 이상 탐지를 추가합니다.

다가오는 이벤트

  • NodeConf 입장권을 판매하고 있습니다. 6월 8일과 9일, 캘리포니아 오클랜드에서 열리며, NodeConf Adventure는 6월 11일~14일, 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일~10일, 워싱턴주에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일~9일, 아일랜드 워터퍼드에서 열립니다.
  • nodeSchool tokyo가 4월 12일 일본의 도쿄에서 개최될 예정입니다.

io.js 주간 뉴스 2015년 3월 20일

io.js 1.6 릴리스

이번 주에는 v1.6.1v1.6.0 두 번의 릴리스가 있었습니다. GitHub에서 전체 변경사항을 볼 수 있습니다.

주요 변경 사항

  • path: path.resolve() #1153의 새로운 타입 검사는 실무에서 발생하는 일부 경계조건(특히 path.dirname(undefined))은 다루지 않습니다. path.dirname(), path.basename(), path.extname()의 타입 검사가 느슨해졌습니다. (Colin Ihrig) #1216.
  • querystring: querystring.parse()querystring.stringify()의 내부 최적화(#847)에서 querystring.escape()Number 리터럴을 적절하게 변환하지 못하는 문제가 있었습니다.(#1208) 이는 테스트에서 발견하지 못한 것이지만 지금은 버그와 테스트를 수정했습니다. (Jeremiah Senkpiel) #1213.

1.6.0

  • node: 시작할 때 모듈을 미리 로드하기 위해 새로운 커맨드라인 옵션 -r이나 --require를 사용할 수 있습니다. (Ali Ijaz Sheikh) #881
  • querystring: parse()stringify()가 더 빨라졌습니다. (Brian White) #847
  • http: joyent/node#9048에 따라 Node.js v0.12에서 변경된 내용과 맞추려고 http.ClientRequest#flush() 메서드를 폐기하고 http.ClientRequest#flushHeaders()로 대체했습니다. (Yosuke Furukawa) #1156
  • net: joyent/node#9268에서 net.connect()가 받는 옵션과 같게 하려고 server.listen()portString 옵션으로 받을 수 있게 되었습니다. (예시: { port: "1234" }) (Ben Noordhuis) #1116
  • tls: 아직 사용 사례를 논쟁 중인 사소한 누수이지만 보고된 메모리 누수에 대한 작업을 하고 있습니다. 진행사항은 #1075에서 볼 수 있습니다.
  • v8: --max_old_space_size4096을 넘는 값을 사용한 경우 발생하는 정수 오버플로에 대한 수정사항을 백포트했습니다. (Ben Noordhuis) #1166
  • platforms: io.js CI 시스템이 이제 FreeBSDSmartOS(Solaris)에서도 통과합니다.
  • npm: npm을 2.7.1로 업그레이드했습니다. 자세한 내용은 npm CHANGELOG.md를 참조하세요.

알려진 이슈

  • TLS와 관련된 메모리 누수가 있을 수 있습니다. 자세한 사항은 #1075를 참조하세요.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • io.js를 정적 라이브러리로 빌드할 수 없습니다. #686
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 회귀는 1.0.2에서 발생했습니다. #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 크래시가 발생할 수 있습니다. #894

커뮤니티 업데이트

  • browserify가 io.js를 지원합니다. 여기서 공지사항을 볼 수 있습니다.
  • express.js가 io.js 지원을 추가했습니다.
  • 지난 두 주 사이에 Joyent의 하드웨어에 접근 권한을 얻고 V8에 패치를 올려서 io.js를 빌드할 수 있게 되었습니다. SmartOSFreeBSD에서 테스트를 통과하도록 작업한 결과 이틀 전부터 테스트를 통과하게 되었습니다. 이는 빌드 팀과 Johan Bergström의 놀라운 작업 덕분입니다.
  • Petka Antonov가 실험적으로 io.js에서 워커 구현체를 제안하고 있습니다. 여기서 이에 대한 논의에 참여할 수 있습니다.
  • io.js는 openssl을 1.0.1m으로 업그레이드했습니다.

다가오는 이벤트

  • NodeConf 입장권을 판매하고 있습니다. 6월 8일과 9일, 캘리포니아 오클랜드에서 열리며, NodeConf Adventure는 6월 11일~14일, 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일~10일, 워싱턴주에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일~9일, 아일랜드 워터퍼드에서 열립니다.

io.js 주간 뉴스 2015년 3월 13일

io.js 1.5.1, 커뮤니티 이벤트 등

io.js 1.5.1 릴리스

3월 9일 월요일, @rvagg가 io.js v1.5.1을 릴리스 했습니다. 모든 변경 내역은 GitHub에서 보실 수 있습니다.

주요 변경 사항

  • tls: 제보된 TLS 메모리 누수 현상이 이번 릴리스의 여러 커밋에 걸쳐 해결되었습니다. 현재 테스트 결과에 따르면 아직 누수 문제가 있을 수 있습니다. 전체 진행 과정은 #1075에서 보실 수 있습니다.
  • http: joyent/node#9348npm/npm#7349에서 보고 된 에러를 고쳤습니다. socket.destroy()에서 'error' 이벤트가 단언문 실패를 일으키는 경우 전송되길 기다리던 데이터를 끝까지 읽지 못하고 있었습니다. (Fedor Indutny) #1103

알려진 이슈

  • TLS와 관련된 메모리 누수가 있을 수 있습니다. 자세한 사항은 #1075를 참조하세요.
  • 아직 윈도우에서 통과하지 못하는 사소한 테스트들이 있습니다. 저희는 이들을 우선적으로 처리하는 중입니다. #1005를 확인해 보세요.
  • 대화형 셸에서 서러게이트 페어(Surrogate pair)가 터미널을 정지시킬 수 있습니다. #690
  • io.js를 정적 라이브러리로 빌드할 수 없습니다. #686
  • process.send()는 문서에서 설명된 바와는 다르게 동기적이지 않습니다. 이 회귀는 1.0.2에서 발생했습니다. #760에서 확인 가능하며 #774에서 수정하고 있습니다.
  • DNS 쿼리 중에 dns.setServers()를 호출하면 실패한 단언문 때문에 크래시가 발생할 수 있습니다. #894

커뮤니티 업데이트

다가오는 이벤트

  • NodeConf 입장권을 판매하고 있습니다. 6월 8일과 9일, 캘리포니아 오클랜드에서 열리며, NodeConf Adventure는 6월 11일~14일, 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일~10일, 워싱턴주에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일~9일, 아일랜드 워터퍼드에서 열립니다.