프로덕션에서 바벨 노드를 사용해도 되나요?


87

ES6 구문을 지원하기 위해 babel-node 및 babelify 변환으로 browserify를 사용하여 사이트를 개발했습니다.

노드에서 ES6를 실행하는 데 필요한 다른 옵션이 babel-node server 아닌 프로덕션에서 이것을 실행할 수 있는지 궁금 node server 합니다.

다음은 빌드 및 개발 시작을 위해 실행중인 명령입니다.

// npm run build
browserify -t [babelify] client.js > public/js/bundle.js",

// npm start
babel-node server.js"

내 개발 종속성은 다음과 같습니다.

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"

답변:


115

클라이언트 측 코드의 경우 올바른 일을하고 있습니다. babelify그것을 클라이언트에게 발송하십시오.


서버 측 코드의 경우 babel-cli를 사용하여 일반 빌드를 수행합니다.

에 따르면 http://babeljs.io/docs/setup/#babel_register , babel-register되어 생산에는 적합하지 - 훅은 주로 간단한 경우에 권장됩니다 필요합니다.

Babel 6+ 용

Babel 6부터는 기본적으로 변환이 포함되지 않습니다. 이제 babel-clibabel-preset-es2015.

$ npm install --save-dev babel-cli babel-preset-es2015

.babelrc파일에 변형을 추가하십시오. 이것은 위에서 다운로드 한 perst 모듈입니다. 자신에게 가장 적합한 프리셋 을 확인 하려면 전체 사전 설정 목록을 살펴보십시오 .

{
  "presets": ["es2015"]
}

build스크립트를 추가 합니다 package.json. 아래 src는 입력 파일이며 build변환 된 출력 파일입니다.

"scripts": {
  "build": "babel src -d build"
}

그런 다음 구축하십시오!

$ npm run build

그런 다음 코드를 실행하십시오. 이 시점에서 build디렉토리 의 파일을 실행하고 싶을 것입니다.

$ npm start

Babel <= 5의 경우 require 후크를 사용하십시오.

require("babel/register");

확장자가 .es6 , .es , .jsx.js 인 노드에 필요한 모든 후속 파일 은 Babel에 의해 변환됩니다. polyfill는 자동으로 필요합니다.

소스 파일을 ES6에 보관할 수 있지만 여전히 다음을 사용하여 실행할 수 있습니다. node server.js


귀하의 의견에 따르면 약간의 문제가있는 것 같습니다. 위의 노란색으로 강조 표시된 부분에 특히주의하십시오. 첫 번째 파일은 노드 자체에서 실행되는 ES5 만 될 수 있습니다. 모두이후의 요구 사항 은 Babel에 의해 변형됩니다.

일반적인 설정은 다음과 같습니다.

server.js

// only ES5 is allowed in this file
require("babel/register");

// other babel configuration, if necessary

// load your app
var app = require("./app.js");

app.js

// this file will be loaded through babel
// you can now use ES6 here and in every other include

발사!

$ node server.js

9
실제로 나는 이것을 시도하고, require("babel/register");내 server.js를 넣고 실행 node server.js하면 오류가 발생합니다. Unexpected reserved word: import ... 그래서 작동하지 않는 것 같습니다
svnm

1
@steveniseki 내 업데이트는 작업을 시작하고 실행하는 방법을 보여줍니다.
감사합니다

정말 감사합니다. 실제로 그럴 것이라고 가정하고 ES5에서 server.js를 모두 만들려고 시도했지만 작동하지 않는 것 같았습니다. 어쨌든이 솔루션은 실제로 앱을 app.js로 푸시하는 것이 훨씬 좋습니다. , 완벽하게 작동했습니다. 감사합니다
svnm 2015-06-13

누군가가 예제를보고 싶다면 여기에 server.js 노드를 사용하여 이러한 방식으로 작동하는 예제 프로젝트가 있습니다 . 실제 사이트에서 사용할 리 액트 라우터, 바벨, 알트를 사용한 예제입니다.
svnm 2015 년

4
한편 require ( "babel-register"); .. 어쨌든 "예기치 않은 토큰 가져 오기"가 표시됩니다. ..
smotru

54

이 주제에 대한 블로그 게시물을 작성 했습니다.

Babeljs CLI 설명서 는 다음을 경고합니다.

생산 용이 아닌 바벨 노드

프로덕션에서 babel-node를 사용해서는 안됩니다. 캐시가 메모리에 저장되어 메모리 사용량이 많아 불필요하게 무겁습니다. 또한 전체 앱을 즉시 컴파일해야하므로 항상 시작 성능 저하를 경험하게됩니다.

이것은 babel-node 대신 node로 앱을 실행하도록 npm 스크립트를 설정하는 방법의 예입니다.

"scripts": {
  "clean": "rm -rf build && mkdir build",
  "build-css": "node-sass scss/app.scss public/css/app.css",
  "build-server": "babel -d ./build ./server -s",
  "build": "npm run clean && npm run build-css && npm run build-server",
  "lint": "eslint source/ --quiet",
  "start": "node ./build/index.js",
  "debug": "node --debug ./build/index.js",
  "test": "for i in $(ls tests/); do babel-node \"./tests/${i}\" | faucet ; done",
  "validate": "npm run lint; npm run test && npm outdated --depth 0"
},

블로그 게시물 에서 자세한 내용을 확인할 수 있습니다.


3
Node 4.0이 ES6를 지원하기 때문에 코드를 컴파일하기 위해 여전히 babel을 사용해야합니까?
lvarayut

8
@LVarayut 예, 기능에 따라 바벨은 여전히 ​​서버 측에 필요합니다. Node v4.0.0은 모든 ES6 기능 (특히 가져 오기 / 내보내기 구문을 통한 모듈)을 지원하지 않습니다. 주제에 대한 자세한 내용 은 nodejs.org/en/docs/es6 을 참조 하거나 node --v8-options | 아직 구현되지 않은 ES6 기능의 목록을 가져 오려면 터미널에서 grep "in progress"를 선택합니다.
jbmusso

당신의 멋진 설명 : 대한 @jbmusso 감사합니다
lvarayut

14
Babel은 ES6뿐만 아니라 ESNext를위한 것입니다. 따라서 TC39 사양에 정착하는 즉시 ES7 및 최신 기능의 기능을 지속적으로 추가합니다.
cuadraman

15

프로덕션에서 바벨 노드를 사용할 때의 장단점을 비교하는 것이 중요합니다.

  • babel-node상용 하드웨어에서 시작 비용에 0.5 초에서 1 초가 추가됩니다. 그러나 앱이 장기 실행 서버 인 경우 시작 비용은 그다지 중요하지 않습니다.
  • 추가 메모리 사용량을 측정하십시오. 예를 들어 내 앱 (시계열 데이터 읽기 및 처리)의 경우 20MB에 불과했습니다. 상황에 따라 중요 할 수도 있고 그렇지 않을 수도 있습니다.

반면에

  • babel-node를 사용하면 개발이 직접 단순화됩니다. "빌드"스크립트가 필요하지 않으며 별도의 src/ libdist디렉토리 가 없습니다.
  • 당신이 경우 import로컬 파일에서, 당신은에서 가져옵니다 src/myutils, 또는에서 lib/myutils? 사용 babel-node하면 해당 문제가 제거됩니다.

모듈 지원에만 Babel을 사용합니다. 이제 V8은 2017 년 1 월 10 일 에 모듈대한 지원을 방금 출시했습니다 . 바라건대 우리는 몇 달 안에 Node에서 플래그 아래에있는 모듈 지원을 보게 될 것이며, Babel moot를 사용하는 이유가 될 것입니다.


8

@cuadraman의 대답은 @naomik보다 더 정확합니다.

질문에 간단하게 대답하려면 : 아니요, babel-node명시 적으로 호출해서는 안됩니다. babel-node에서 사용하는 비공개 라이브러리입니다 babel-cli.

공식 튜토리얼에는 https://github.com/babel/example-node-server 노드에서 시작하고 실행하는 데 필요한 모든 것이 있습니다 . 읽어! 나는 여러 가지 방법을 사용하는 오해의 소지가있는 블로그 튜토리얼을 너무 많이 발견했고이 기사를 따라가는 것이 가장 쉽다는 것을 알았습니다.

보너스 : 많은 사람들이 생각하는 것과는 달리, 모든 트랜스 파일 마법은 로컬에 설치할 수 있습니다 (를 사용하여 npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). 전 세계적으로 Babel 또는 도우미 모듈을 설치할 필요가 없습니다! 꽤 멋지다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.