nodejs 0.10 에서 ECMAScript 6 임 독 이 맥 오픈
우선, 우 리 는 ECMAScript 6 - > ECMAScript 5 의 컴 파일 러 가 필요 합 니 다. 현재 매우 많 습 니 다.구 글 이 만 든 traceur - copiler 를 추천 합 니 다.
여기에 컴 파일 러 목록 이 있 습 니 다: es6 - tools.
의 원리
이 컴 파일 러 를 사용 하면 현재 ECMAScript 6 문법 으로 작 성 된 javascript 파일 을 ECMAScript 5 문법 으로 생 성 된 정적 파일 을 컴 파일 하 는 데 도움 이 됩 니 다.
만약 당신 이 coffeescript 의 사용자 라면, 이러한 방식 을 잘 알 고 있 습 니 다. coffeescript 문법 은 자바 script 파일 로 컴 파일 되 었 습 니 다.
정적 파일 이기 때문에 실행 할 때 다시 컴 파일 하 는 성능 에 문제 가 없 을 것 입 니 다.
또한 실행 중 컴 파일 을 제공 하여 ECMAScript 6 문법 으로 작 성 된 파일 을 직접 테스트 할 수 있 도록 도 와 줍 니 다.
traceur - copiler 사용 입문
우선 수요 가 기술 의 수 요 를 결정 한다 고 말 하고 싶다.한 항목 의 복잡 도 때문에, 나 는 비동기 판단 을 간소화 하기 위해 yield 와 생 성기 가 급히 필요 하 다.express 와 koa 와 같은 자바 식 순수 대상 에 대한 깊 은 반감 이 오래 되 었 기 때문에 (JAVA C + + 와 순수 대상 에 대한 비판 은 이미 카 네 기 메 론 대학의 '반 모듈 화 되 고 반 병행 적' 가정 식) 저 는 오 랜 축적 과정 에서 짧 은 시간 에 ROCORE 를 작 성 했 고 빠 른 테스트 최적화 로 0.2.17 버 전 으로 교체 되 었 습 니 다.(사실 제 가 현재 사용 하고 있 는 버 전 은 새로운 변화 가 생 겼 습 니 다. ECMAScript 6 문법 베타 의 0. 3.1 버 전 을 완전히 사용 하고 있 습 니 다)
nodejs 0.10 을 신속하게 호 환 할 수 있 도록 6to 5, traceur - copiler 를 찾 았 고 traceur - copiler 를 컴 파일 러 로 선택 했다.
npm install -g traceur
// ec6.js
let a = 1;
function* g() {
yield 100;
console.log(a + 100);
}
var it = g();
it.next();
it.next();
$ traceur ec6.js --out ec5.js --modules=commonjs
열 린 ec5. js 파일 은 다음 과 같은 코드 를 볼 수 있 습 니 다. "use strict";
var $__0 = $traceurRuntime.initGeneratorFunction(g);
var __moduleName = "tt.js";
var a = 1;
function g() {
return $traceurRuntime.createGeneratorInstance(function($ctx) {
while (true)
switch ($ctx.state) {
case 0:
$ctx.state = 2;
return 100;
case 2:
$ctx.maybeThrow();
$ctx.state = 4;
break;
case 4:
console.log(a + 100);
$ctx.state = -2;
break;
default:
return $ctx.end();
}
}, $__0, this);
}
var it = g();
it.next();
it.next();
require('traceur');
을 추가 하고 저장 해 야 합 니 다. 실행 $ node ec5.js
OK, 출력 101. 현재 nodejs 0.10 에서 이 파일 을 잘 실행 할 수 있 습 니 다. 우리 의 프로젝트 파일 은 대량의 파일 이 있 습 니 다. 한 명 씩 컴 파일 할 수 는 없 겠 죠?! OK. 여기에 대량으로 컴 파일 된 스 크 립 트 프로그램 이 있 습 니 다. 복사 한 다음 에 js 파일 에 저장 합 니 다. 컴 파일 할 홈 디 렉 터 리 와 출력 할 대상 디 렉 터 리 를 설정 합 니 다. 그 는 홈 디 렉 터 리 의 모든 js 파일 을 대상 디 렉 터 리 로 컴 파일 하고 내부 파일 로 재 귀 하 는 것 을 지원 합 니 다. 비 js 파일 이 아 닙 니 다.대상 디 렉 터 리 에 그대로 복사 합 니 다.
또한 lib 디 렉 터 리 에 있 는 파일 만 컴 파일 하고 다른 디 렉 터 리 의 파일 은 대상 디 렉 터 리 에 수 동 으로 복사 하 는 것 을 권장 합 니 다.
// compile.js
var traceur = require('traceur');
var fs = require('fs');
var path = require('path');
var PATH_SOURCE = '/home/king/box-fork/dist';
var PATH_TARGET = '/home/king/box-fork-compile';
function readSync(paths, i, f) {
if (i >= 0 && i < paths.length) {
var stats = fs.statSync(paths[i]);
if (stats.isFile()) {
f('file', paths[i]);
return readSync(paths, ++i, f);
} else if (stats.isDirectory()) {
var newPaths = fs.readdirSync(paths[i]).map(function (pathname) {
return path.join(paths[i], pathname);
});
f('directory', paths[i]);
return readSync(paths.slice(0, i).concat(newPaths,
paths.slice(i + 1)),
i, f);
} else {
return readSync(paths.slice(0, i).concat(paths.slice(i + 1)),
i, f);
}
} else {
return paths;
}
}
readSync([PATH_SOURCE], 0, function (type, pathname) {
var newPath = path.join(PATH_TARGET, pathname.replace(new RegExp('^' + source.replace(/\//g,'\/').replace(/\\/g,'\\')), ''));
if (type === 'file') {
if (path.extname(pathname) !== '.js') {
console.log('copy %s %s', pathname, newPath);
fs.writeFileSync(newPath, fs.readFileSync(pathname));
return;
}
console.log('traceur %s %s', pathname, newPath);
var src = fs.readFileSync(pathname, {encoding:'utf8'});
var options = {};
var compiled = traceur.compile(src, options);
fs.writeFileSync(newPath, compiled, {encoding:'utf8'});
}
if (type === 'directory') {
console.log('mkdir %s', newPath);
fs.mkdirSync(newPath);
}
});
실행 시 컴 파일 및 유닛 테스트
프로젝트 개발 과정 에서 우 리 는 파일 하 나 를 다 쓰 고 한 번 만 컴 파일 하고 싶 지 않 습 니 다. 그래서 우 리 는 개발 할 때 실행 할 때 컴 파일 하 는 방법 이 있 습 니 다. 모든 개발 이 끝나 고 테스트 가 끝 난 후에 한 번 에 컴 파일 하고 온라인 합 니 다.
프로젝트 에 test - traceur. js 파일 만 들 기:
//
require('traceur').require.makeDefault(function(filename) {
return filename.indexOf('node_modules') === -1;
});
//
require('./test/my.js');
그리고 테스트 실행:
$ node test-traceur.js
프로그램 은 my. js 와 my. js 가 의존 하 는 파일 을 자동 으로 컴 파일 하고 실 행 됩 니 다.test - traceur. js 파일 에 있 는 쓰기 방법 은 반드시 이렇게 해 야 합 니 다. 테스트 파일 만 도입 할 수 있 습 니 다. 이것 은 trace - copiler 가 설정 한 것 입 니 다. 구체 적 으로 문 서 를 참조 할 수 있 습 니 다.
대량 테스트 스 크 립 트 가 있 습 니 다. 필요 하 다 면:
require('traceur').require.makeDefault(function(filename) {
return filename.indexOf('node_modules') === -1;
});
require(process.argv[3]);
var fs = require('fs');
var path = require('path');
var child_process = require('child_process');
var ROOT = path.join(__dirname, '../test');
var ROOT_TRACE = path.join(__dirname, 'test-traceur.js');
(function test(paths, i) {
if (i >= 0 && i < paths.length) {
var stats = fs.statSync(paths[i]);
if (stats.isFile()) {
if (path.extname(paths[i]) === '.js') {
console.log('
test: %s', paths[i]);
child_process.exec('node ' + ROOT_TRACE + ' -f ' + paths[i], function (err, stdout, stderr) {
if (err) {
throw err;
}
console.log('OK: %s', paths[i]);
test(paths, i + 1);
});
} else {
test(paths, i + 1);
}
} else if (stats.isDirectory()) {
var newPaths = fs.readdirSync(paths[i]).map(function (pathname) {
return path.join(paths[i], pathname);
});
test(paths.slice(0, i).concat(newPaths, paths.slice(i + 1)), i);
} else {
test(paths.slice(0, i).concat(paths.slice(i + 1)), i);
}
} else {
console.log('
complete
');
}
} ([ROOT], 0));
test - all. js 파일 에서 테스트 디 렉 터 리 로 ROOT 를 수정 하고 실행
$ node test-all.js
테스트 디 렉 터 리 에 있 는 파일 은 순서대로 실 행 됩 니 다. (그들 이 의존 하 는 파일 은 ECMAScrip 6 문법 파일 일 수 있 습 니 다.)마지막 으로 ROCORE 를 사용 하여 비동기 개발 을 간소화 하 는 것 을 추천 합 니 다.
express 나 다른 것 을 바 꾸 고 싶 지 않 더 라 도 ROCORE 에서 도움 을 받 을 수 있 습 니 다. 예 를 들 어 안에 있 는 scc 와 mcc 등 두 가지 언제든지 사용 할 수 있 는 비동기 도구 입 니 다.
직렬:
var R = require('rocore');
var fs = require('fs');
R.scc(function* (ynext) {
var [err, data] = yield fs.readFile(__dirname + 'my.conf', {encoding:'utf8'}, ynext);
if (err) throw err;
yield fs.writeFile(__dirname + 'new.conf', data, {encoding:'utf8'}, ynext);
console.log('done');
});
병렬:
var R = require('rocore');
var pool = require('mysql').createPool(/* */);
R.scc(function* (ynext) {
var {employee, order, position} = yield R.mcc(function* (ynext) {
yield pool.query('SELECT * FROM employee', ynext('employee'));
yield pool.query('SELECT * FROM order', ynext('order'));
yield pool.query('SELECT * FROM position', ynext('position'));
}, ynext);
console.log(employee);
console.log(order);
console.log(position);
});
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.