2016-03-24 20 views
6

私たちはbabel loader +すべてのプリセットを使用しているのでしょうか?とにかく、私たちのコンポーネントにbabel-polyfillを組み込む必要があるのはなぜですか?私はバベルローダーがすべての仕事そのものをやるべきだと思っています。ここでimport 'babel-polyfill'を使用する必要があるのはなぜですか?反応成分中に?

import 'babel-polyfill'; 
import React from 'react'; 
import { render } from 'react-dom'; 
import App from './containers/App'; 

は、パッケージの例である:ここで

{ 
    "name": "redux-shopping-cart-example", 
    "version": "0.0.0", 
    "description": "Redux shopping-cart example", 
    "scripts": { 
    "start": "node server.js", 
    "test": "cross-env NODE_ENV=test mocha --recursive --compilers js:babel-register", 
    "test:watch": "npm test -- --watch" 
    }, 
    "repository": { 
    "type": "git", 
    "url": "https://github.com/reactjs/redux.git" 
    }, 
    "license": "MIT", 
    "bugs": { 
    "url": "https://github.com/reactjs/redux/issues" 
    }, 
    "homepage": "http://redux.js.org", 
    "dependencies": { 
    "babel-polyfill": "^6.3.14", 
    "react": "^0.14.7", 
    "react-dom": "^0.14.7", 
    "react-redux": "^4.2.1", 
    "redux": "^3.2.1", 
    "redux-thunk": "^1.0.3" 
    }, 
    "devDependencies": { 
    "babel-core": "^6.3.15", 
    "babel-loader": "^6.2.0", 
    "babel-preset-es2015": "^6.3.13", 
    "babel-preset-react": "^6.3.13", 
    "babel-preset-react-hmre": "^1.1.1", 
    "cross-env": "^1.0.7", 
    "enzyme": "^2.0.0", 
    "express": "^4.13.3", 
    "json-loader": "^0.5.3", 
    "react-addons-test-utils": "^0.14.7", 
    "redux-logger": "^2.0.1", 
    "mocha": "^2.2.5", 
    "node-libs-browser": "^0.5.2", 
    "webpack": "^1.9.11", 
    "webpack-dev-middleware": "^1.2.0", 
    "webpack-hot-middleware": "^2.9.1" 
    } 
} 

https://github.com/reactjs/redux/tree/master/examples

から取らWebPACKの設定例です

例がある私が求めています何ここhttps://github.com/reactjs/redux/tree/master/examples

に採取しました

var path = require('path') 
var webpack = require('webpack') 

module.exports = { 
    devtool: 'cheap-module-eval-source-map', 
    entry: [ 
    'webpack-hot-middleware/client', 
    './index' 
    ], 
    output: { 
    path: path.join(__dirname, 'dist'), 
    filename: 'bundle.js', 
    publicPath: '/static/' 
    }, 
    plugins: [ 
    new webpack.optimize.OccurenceOrderPlugin(), 
    new webpack.HotModuleReplacementPlugin() 
    ], 
    module: { 
    loaders: [ 
     { 
     test: /\.js$/, 
     loaders: [ 'babel?presets[]=react,presets[]=es2015,presets[]=react-hmre' ], 
     exclude: /node_modules/, 
     include: __dirname 
     }, 
     { 
     test: /\.json$/, 
     loaders: [ 'json' ], 
     exclude: /node_modules/, 
     include: __dirname 
     } 
    ] 
    } 
} 

答えて

15

Babelはあなたのコードをブラウザが理解できるものに変換しますが、生成されるコードはすべての単一ブラウザで機能するかもしれない機能を使用します。たとえば、Object.assignはすべてのブラウザでサポートされていないため、babel-polyfillが穴を埋めます。これは、従来のブラウザーをサポートするために通常含めるポリフィルのコレクションです。

は、このコードを考えてみましょう:

const foo = { 
    name: 'Homer' 
}; 
const bar = Object.assign({}, foo, {age: '?'}); 
console.log(Object.keys(foo), Object.keys(bar)); 

バベルはほぼ同じにこれをtranspileます:

'use strict'; 
var foo = { 
    name: 'Homer' 
}; 
var bar = Object.assign({}, foo, { age: '?' }); 
console.log(Object.keys(foo), Object.keys(bar)); 

これは通常の古い学校JS構文であるためです。しかし、それはすべてのブラウザで使用されているネイティブ関数が実装されているわけではないので、polyfillをインクルードする必要があります。

+0

私はこれを次のように思うでしょう: Ok - >私はvarから手を差し伸べる必要がありますか?うん!次のこと、私はObject.assignと同じ機能を追加する関数を作りたいと思っています。それは期待された行動ではありませんか?したがって、Object.assignがes6にある場合、transpiler(またはプリセット)はこれを処理する必要があります。それがes7に存在するならば、es7プリセットはこれを気にするべきです。私が持っている各ファイルに座っていなければならない追加のモジュールでもない。 let - > var置換のための追加のモジュールも行います。誰もが私に同意することを意味することを願っています。途中で説明をありがとう。 – Rantiev

+3

IE、Chrome、Firefoxなどには同じ機能が実装されていないため、ポリフィルは永遠に残っています。 Babelはarrow関数、imports、constなどのようなものを扱いますが、一般的にjs API関数には触れません。 IE9などをサポートする必要がある場合、これはBabelが気にするものではありません。伝統的なパターンに従ったjavascriptを作成するだけですが、必要な機能を多用するための機能が使用されています。 – dannyjolie

関連する問題