nodejs 0.10 에서 ECMAScript 6 임 독 이 맥 오픈

9133 단어
ECMAScript 6 가 너무 늦게 올 까 봐?필요 없어!현재 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
  • ECMAScript 6 문법 파일 을 작성 하여 ECMAScript 6 파일 을 작성 합 니 다. 예 를 들 어 ec6. js 파일:
    // ec6.js
    
    let a = 1;
    
    function* g() {
        yield 100;
        console.log(a + 100);
    }
    
    var it = g();
    it.next();
    it.next();  
    
  • ECMAScript 5 문법 을 생 성 하 는 파일 을 컴 파일 할 때 traceur - copiler 컴 파일 파일 파일 을 사용 하여 ECMAScript 파일 을 생 성 합 니 다. 예 를 들 어 ec5. js 라 고 합 니 다. $ 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();
    
  • 생 성 된 ECMAScript 5 파일 을 실행 하려 면 전체 설 치 를 제외 하고 프로젝트 node modules 에 항목 의존 으로 복사 해 야 합 니 다. 모듈 이름 은 traceur 입 니 다. 이 ec5. js 파일 을 실행 하려 면 traceur 모듈 을 도입 해 야 합 니 다. 파일 상단 에
    require('traceur');
    
    을 추가 하고 저장 해 야 합 니 다. 실행 $ node ec5.jsOK, 출력 101. 현재 nodejs 0.10 에서 이 파일 을 잘 실행 할 수 있 습 니 다.
  • 과정 을 정리 하여 ECMAScript 6 파일 을 작성 합 니 다. - > 컴 파일 하여 ECMAScript 5 파일 을 생 성 합 니 다. - > ECMAScript 5 파일 을 수정 하고 맨 위 에 require (traceur) 를 추가 하여 저장 합 니 다. - > ECMAScript 5 파일 을 실행 합 니 다. 실제 사용 할 때 app. js (또는 server. js) 메 인 파일 에 require ('traceur') 를 추가 하면 됩 니 다.
  • 일괄 컴 파일
    우리 의 프로젝트 파일 은 대량의 파일 이 있 습 니 다. 한 명 씩 컴 파일 할 수 는 없 겠 죠?! 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 가 설정 한 것 입 니 다. 구체 적 으로 문 서 를 참조 할 수 있 습 니 다.
    대량 테스트 스 크 립 트 가 있 습 니 다. 필요 하 다 면:
  • 두 개의 파일 test - traceur. js, test - all. js
  • 를 만 듭 니 다.
  • test-traceur.js:
  • require('traceur').require.makeDefault(function(filename) {
        return filename.indexOf('node_modules') === -1;
    });
    
    require(process.argv[3]);
    
  • test-all.js:
  • 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);
    });
    

    좋은 웹페이지 즐겨찾기