2016-03-24 25 views
6

Mi chiedo se l'utente babel loader + tutti i preset, perché abbiamo bisogno di includere babel-polyfill comunque nei nostri componenti? Penso solo che babel-loader dovrebbe fare tutto il lavoro stesso.Perché dobbiamo usare import "babel-polyfill"; nel reagire componenti?

esempi sono stati presi qui https://github.com/reactjs/redux/tree/master/examples

Quello che sto chiedendo è:

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

Ecco esempio pacchetto:

{ 
    "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" 
    } 
} 

Ecco webpack esempio config tratto da 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 
     } 
    ] 
    } 
} 

risposta

15

Babel traspone il tuo codice in qualcosa che i browser possono capire, ma il codice risultante utilizza funzionalità che possono funzionare o meno in ogni singolo browser. Ad esempio, Object.assign non è supportato in tutti i browser, quindi Babel-polyfill riempie i buchi. È solo una raccolta di polifivoli che normalmente includi comunque per supportare i browser legacy.

Considerate questo codice:

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

Babel sarà transpile questo al quasi identico:

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

perché questo è normale vecchia scuola sintassi JS. Tuttavia, ciò non significa che le funzioni native utilizzate siano implementate in tutti i browser, quindi è necessario includere il polyfill.

+0

Se mai uno sviluppatore di transpiler penserei in questo modo: Ok -> ho bisogno di farmi da var, sì? Sì! La prossima cosa, ok voglio fare una funzione che aggiunge la stessa funzionalità di Object.assign. Non è previsto un comportamento? Quindi se Object.assign è in es6, transpiler (o preset) dovrebbe occuparsi di questo. Se esiste in es7, il preset di es7 dovrebbe occuparsene. Non un modulo aggiuntivo che nemmeno un transpiler dovrebbe collocare in ogni file che ho. Facciamo anche moduli aggiuntivi per let -> var di sostituzione. Spero che qualcuno sia d'accordo con me sul fatto che abbia senso. Grazie per una spiegazione, a proposito. – Rantiev

+3

Bene, i polyfill sono sempre esistiti, perché IE, Chrome, Firefox ecc non hanno implementato la stessa funzionalità. Babel gestisce solo cose come funzioni di freccia, importazioni, const, ecc, ma generalmente non tocca le funzioni API di js. Se hai bisogno di supportare IE9 o qualsiasi altra cosa, non è qualcosa a cui Babel dovrebbe interessare. Crea solo javascript che segue schemi tradizionali, ma le funzioni utilizzate sono il tuo compito di polyfill _se necessario_. – dannyjolie

Problemi correlati