Этот урок входит в цикл "Блог на React".
Если версии пакетов отобразятся, то, значит, они установлены, и Вы можете пропустить этот блок.
Но если отображается ошибка(пакеты не найдены), то пути к этим пакетам нужно добавить в глобальные переменные вручную.
В Ubuntu самый простой способ:
sudo ln -s /absolute/node/path/node /usr/bin/node
sudo ln -s /absolute/npm/path/npm /usr/bin/npm
В Windows нужно добавить эти пакеты в переменную PATH
Для этого Пуск -> User accounts -> Change my enviroment variables -> New.../Edit... Path -> New -> D:\absolute\node\path
Двигаемся дальше.
Выбираем/создаём директорию для будущего проекта и устанавливаем первые пакеты:
npm init
Можно пропустить все запросы нажав несколько раз Enter
Устанавливаем пакеты (для окружения разработки):
Немного о синтаксисе. Что такое JSX.
JSX - напоминает смесь ES6 и HTML. Мы имеем import, const, let, class (и т.д.) из ES6, но ещё мы можем вернуть HTML просто сделав:
О компонентах.
Компонент в React помогает разбить UI на несколько независимых частей и работать с ними, как с изолированными друг от друга объектами.
В React три основных вида компонента:
Создадим HTML-документ
index.html
Теперь, чтобы это заработало в браузере, нам нужно:
Из конфига видно, что все файлы jsx будут собраны в один файл bundle.js, чтобы после сборки наши компоненты заработали, нужно добавить этот скомпилированный JS-файл в index.html
index.html
Теперь, чтобы запустить сборку проекта нужно выполнить:
node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --progress --colors
После завершения сборки в браузере можно будет увидеть наш проект по URL:
http://localhost:8080/
Также webpack-dev-server следит за изменениями файлов и автоматически пересобирает проект (и даже перезагружает страницу).
Проверим.
Когда webpack-dev-server работает (наш проект доступен по http://localhost:8080/), изменим файл main.jsx. Запишем Hello world вместо Hello.
main.jsx
Обратите внимание! При сохранении файла webpack-dev-server сам все пересоберёт и перезапустит(без ручного перезапуска команды), окно в браузере автоматически обновится.
Также вы можете заметить, что наш bundle.js уже занимает больше 1МБ. Это плата за использование сторонних библиотек (react, react-dom в данном случае). Не огорчайтесь, этот размер можно уменьшить, т.к. это только dev-сборка. Сборка для prod-серверов будет ощутимо легче (но чуда ожидать не стоит, вес будет больше, по сравнению с чистым JS)
В следующем уроке из этого цикла мы соберём несколько компонентов, научимся настраивать webpack-dev-server, создадим более удобные команды для сборки приложения (через npm run), разберём props и state.
Спасибо за внимание.
- Блог на ReactJS #1. Компоненты. npm, jsx, webpack, webpack-dev-server
- Блог на ReactJS #2. Несколько компонентов, props, state. npm run, конфигурация webpack
- Блог на ReactJS #3. Redux, Middleware, json-server, fetch
npm install --save react react-dom npm install --save-dev webpack webpack-dev-servernpm install --save-dev babel-loader babel-core babel-preset-es2015 babel-preset-react Создаём первый компонент: main.jsx
1 2 3 4 5 6 7 | import React from 'react' ; class Main extends React.PureComponent { render() { return <h1>Hello</h1>; } } |
1 2 3 4 5 6 | //Кавычки или нечто подобное не требуется return ( <div> <p>Текст абзаца</p> </div> ); |
- Функция - это миниатюрный компонент, в котором нет state. Компонент-функция выполняет роль render (т.е. она и исполняется в случае изменений). В целом, она даёт наименьшую нагрузку и предпочтительнее компонентов ниже.
- React.Component - перед выполнением render проверяет все props, state и вложенные в них элементы. Если что-то отличается, произойдёт render. Т.е. перед каждым render проходится всё дерево ваших переменных от props, state;
- React.PureComponent - перед выполнением проверяет только верхний уровень вложенности props, state. Если что-то изменяет данные внутри переменных, но не меняет ссылку на этот объект, то render не произойдёт.
1 2 3 4 5 6 7 8 9 10 | import React from 'react' ; import ReactDOM from 'react-dom' ; class Main extends React.PureComponent { render() { return <h1>Hello</h1>; } } ReactDOM.render(<Main />, document.getElementById( 'main' )); |
1 2 3 4 5 6 7 8 9 10 | <!doctype html> < html > < head > < meta charset = "UTF-8" > < title >Hello React</ title > </ head > < body > < div id = "main" ></ div > </ body > </ html > |
- Перевести JSX в понятный браузеру Javascript
- Связать HTML и полученный JS
- Как-то получить эти связанные элементы (в виде сайта) через браузер
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var path = require( 'path' ); var webpack = require( 'webpack' ); module.exports = { entry: './main.jsx' , output: { path: __dirname, filename: 'bundle.js' }, module: { loaders: [ { test: /.jsx?$/, loader: 'babel-loader' , exclude: /node_modules/, query: { presets: [ 'es2015' , 'react' ] } } ] }, }; |
1 2 3 4 5 6 7 8 9 10 11 | <!doctype html> < html > < head > < meta charset = "UTF-8" > < title >Hello React</ title > </ head > < body > < div id = "main" ></ div > < script src = "bundle.js" ></ script > </ body > </ html > |
1 2 3 4 5 6 7 8 9 10 | import React from 'react' ; import ReactDOM from 'react-dom' ; class Main extends React.PureComponent { render() { return <h1>Hello world</h1>; } } ReactDOM.render(<Main />, document.getElementById( 'main' )); |