2016-03-24 4 views
6

Интересно, если мы загружаем загрузчик babel + все пресеты, почему мы должны включать babel-polyfill в любом случае в наши компоненты? Я просто думаю, что Babel-loader должен выполнять всю работу самостоятельно. были принятыЗачем нам нужно использовать импорт «babel-polyfill»; в реакционных компонентах?

Примеры здесь https://github.com/reactjs/redux/tree/master/examples

Что я спрашиваю о том:

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

Вот 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 синтаксис. Однако это не означает, что используемые встроенные функции реализованы во всех браузерах, поэтому нам нужно включить полисполнение.

+0

Если бы я был разработчиком транспилеров, я бы подумал вот так: Ok -> Мне нужно сделать let from var, yep? Ага! Следующая вещь, я хочу сделать функцию, которая добавляет те же функции, что и Object.assign. Разве это не ожидаемое поведение? Поэтому, если Object.assign находится в es6, transpiler (или preset) должен позаботиться об этом. Если он существует в es7, es7 preset должен позаботиться об этом. Не дополнительный модуль, который даже не транспилер, который должен сидеть в каждом файле, который у меня есть. Позволяет также сделать дополнительные модули для let -> var замены. Надеюсь, что кто-то согласится со мной, что это имеет смысл. Спасибо за объяснение кстати. – Rantiev

+3

Ну, полиполки были навсегда, потому что IE, Chrome, Firefox и т. Д. Не имеют такой же функциональности. Babel обрабатывает только такие функции, как функции стрелок, импорт, const и т. Д., Но, как правило, не затрагивает функции js API. Если вам нужно поддерживать IE9 или что-то еще, это не то, о чем должен заботиться Babel. Он просто создает javascript, который следует за традиционными шаблонами, однако используемые функции - это ваша работа по полированию _if required_. – dannyjolie

Смежные вопросы