Текст ниже не является обязательным для прочтения, достаточно скачать архив и выполнить npm install. В будущем мы установим react-router, поэтому вы точно ничего не "потеряете".
В процессе написания учебника "случился" отпуск. Да и новые версии выходят постоянно. Я старался обновляться по мере возможностей или в силу необходимых обстоятельств. Ниже будет список.
webpack в хроме выдавал слишком много "предупреждений" (из-за source maps). Обновился до webpack@1.13.0
Обратите внимание, в списке зависимостей нет ни react-router, ни даже redux, зато есть jQuery и Bootstrap. Собственно, jQuery - это зависимость Bootstrap. Реакт-роутер и редукс будут добавлены позже, как и другие необходимые пакеты.
Начнем распутывать "клубок".
Как видно из package.json приложение будем "стартовать" командой npm start, которая в свою очередь выполнит node bin/server.js
bin/server.js
var fs = require('fs');
var babelrc = fs.readFileSync('./.babelrc');
var config;
try {
config = JSON.parse(babelrc);
} catch (err) {
console.error('==> ERROR: Error parsing your .babelrc.');
console.error(err);
}
require('babel-core/register')(config);
require('../server');
Благодаря такой "обертке" мы убьем сразу несколько зайцев:
сможем выдавать красивое сообщение об ошибке, если не хватает какого-то из babel-preset'ов
сможем код файла по адресу ../server относительно текущего (напомню, текущий - это bin/server.js) писать на ES2015
Давайте создадим "этот самый файл" по адресу ../server.
В данном конфиге меня заинтересовали последние строчки. Посмотрите как происходят присваивания в переменную TARGET.
Если мы запускаем npm start - наш финальный конфиг будет равен текущему конфигу (webpack/common.config + webpack/dev.config)*.
* под "+" подразумевается "мерж" (слияние) с помощью webpack-merge*
Если же мы запустим npm build (у нас нет этого скрипта сейчас), то запустится сборка, которая возьмет текущий конфиг и "смержит" его с production конфигом.
Ниже приведен код dev и prod конфигов. Если интересно - посмотрите различия.
Зачем это в данном туториале? Я посчитал, что раз вы решили прочесть "ручную" настройку - вам будет интересно посмотреть на вариант сборки с использованием dev/prod версий. Если я прав - посмотрите как устроена секция scriptsздесь.
Ок, немного разобрались. Давайте установим зависимости: npm install
Создадим конфигурационные файлы для babel и ESLint:
import 'babel-polyfill'
import React from 'react'
import { render } from 'react-dom'
import App from './containers/App'
render(
<App />,
document.getElementById('root')
)
src/containers/App.js
import React, { Component } from 'react'
export default class App extends Component {
render() {
return <div className='container'>Привет из App!</div>
}
}
Ракета готова к запуску? На старт, внимание... npm install.
Теперь точно готова ;)
Проверьте, npm start (каждая первая сборка webpack после его остановки занимает продолжительное время (~6 секунд), последующие "пересборки" значительно быстрее)
Откройте браузер (обратите внимание так же и на css, должен примениться bootstrap-стиль к классу .container)