Введение
ELM – это новый язык программирования, который компилирует JavaScript. Это функциональный язык программирования, который включает в себя статический набрав, обеспечивающий безопасность типа в ваших веб-приложениях и ловить общие ошибки.
React – это библиотека для создания пользовательских интерфейсов в JavaScript. Что делает его круто, это то, насколько быстро и исполнительным является привод, благодаря своему использованию концепции виртуального DOM (модель объекта документа). Виртуальный дом позволяет внести изменения в партии до того, как они применяются к DOM.
Хотя производительность реагирования является потрясающим, в определенной точке вы заметите, что реагирование просто недостаточно. Вы также захотите установленную библиотеку потока данных redux, flux или некоторые другие данные. Вы захотите установить WebPack и Babel, чтобы вы могли использовать последние функции ES6 (также известный как EmcaScript 2016). Тогда вы, вероятно, захотите добавить проверку типа и статические типы в этот момент, поэтому вам также нужно будет установить Поток , JavaScript Type-Checker.
ELM предоставит всем вкусности, которые реагируют, Redux/flux, а поток дают вам, но как язык коллективного программирования, а не как отдельные библиотеки.
II. Что вы узнаете
В этом руководстве вы узнаете, как использовать ELM для достижения того же, что и ориентирован на оригинал Facebook. Это означает, что мы будем создавать компонент комментариев, где пользователь может ввести новый комментарий и увидеть список существующих комментариев.
Вы узнаете, как сделать следующее в ELM:
- Как использовать реактор ELM для компиляции и запустить программу ELM
- Как создать модуль
- Как создать вид
- Обновите HTML на основе пользовательского ввода
III. Установка ELM.
Самый быстрый способ начать работу с ELM – это установить его с помощью NPM, управляющего узла пакета.
Вы можете сделать это с этой командой:
npm install -g elm
Внутри Запуск ALM-приложений
A. elm Reactor.
Reactor ELM запустит веб-сервер и проводит файлы ELM в вашем каталоге. Он будет скомпилировать каждый файл ELM, когда он запущен.
Чтобы запустить его, сделайте это:
elm reactor
Веб-сервер будет работать на localhost: 8000
И отобразит список файлов ELM, когда вы перейдете к этому URL в веб-браузере. Когда вы нажмете файл, он будет скомпилирован из ELM в JavaScript и запустите в браузере. Это делает его быстрым для итерации через разработку компонента или целого веб-приложения.
B. elm rep, интерактивный интерфейс командной строки
Вы также можете запустить ELM в REPL, CHEED-SEVINGE-PRINT-LOOP, который также известен как интерактивный интерфейс командной строки. Вы можете быть знакомы с этим на других языках, таких как IRB Python и Ruby. Reft позволяет вам экспериментировать с языком на командной строке, набрав в различных выражениях, чтобы увидеть, что произойдет.
V. Настройка проекта
Мы будем создавать компонент коробки комментариев, используя ELM, он похож на окно комментариев, который вы видите в блогах, таких как WordPress и веб-сайты, такие как Facebook. Он покажет список комментариев по поводу статьи вместе с формой для пользователя, чтобы ввести свой собственный комментарий и отправить его.
Во-первых, давайте создадим новый каталог с именем Elm-Tustorial
Отказ На командной строке, когда вы находитесь в каталоге, вам нужно будет создать проект ELM с пакетами Base Elm.
Вы можете сделать это, набрав:
elm package install
Вас спросит, хотите ли вы установить три elm-lang
Пакеты (CORE, HTML и Virtual-DOM), введите «y» и нажмите Enter, чтобы установить эти пакеты. Это создаст новый файл с именем elm-package.json
и каталог с именем alm-match
Отказ В elm-package.json
Вы увидите что-то, что выглядит как типичный NPM Package.json
файл. Вы можете заполнить этот файл позже. alm-match
каталог похож на node_modules
каталог при использовании NPM.
VI. Создание компонента комментариев
Откройте файл Commentbox.elm
Отказ Вот где мы делаем, чтобы определить наш комментарий Box Component и отобразить его пользователю.
A. Импортировка того, что нам нужно
Мы начинаем с импорта модулей и библиотек нам понадобится.
A.1. Импорт элементов HTML для рендеринга
Во-первых, это HTML-библиотека, которая используется для рендеринга элементов HTML DOM, таких как H1
(Уровень заголовка 1) и P
(абзацы):
import Html exposing (..)
A.2. Импортирование атрибутов HTML
Затем мы импортируем атрибуты для элементов HTML, такие вещи, как href
и Класс
:
import Html.Attributes exposing (..)
А.3. Импорт HTML-событий
Наконец, мы также импортируем события, которые будут обрабатываться как OnClick
и Oninput
:
import Html.Events exposing (..)
B. Представляя комментарий как объект
В ELM, как на других функциональных языках, таких как Haskell и схема, он имеет что-то называемое типом записи. Это похоже на класс, но без каких-либо методов его собственного, оно более похоже на структуру в языке программирования C.
Чтобы представлять комментарий к статье, мы определим тип записи комментариев. Он будет содержать имя пользователя и некоторые текст:
type alias Comment = { name : String , description : String }
C. Получение имени автора комментариев
При отображении комментариев, мы хотим сообщить пользователю, если они уже прокомментировали статью. Мы хотим проверить это, сравнивая автор комментариев с именем текущего пользователя. Когда имя автор комментария соответствует названию текущего пользователя, то их имя появится как «[имя] (вы), чтобы показать, что они уже разместили комментарий к статье.
Мы можем определить функцию, Автор
Это делает это, как так:
author : String -> Comment -> String author currentUser { name } = if currentUser == name then name ++ " (You)" else name
Первая часть – это подпись типа функции, вторая часть – это сама определение функции. Подпись типа функции не всегда должна быть определена, но это очень хорошая привычка и придает ясность к написанию кода.
D. Компоненты elm отображают модель
Каждый отображаемый компонент ELM, имеет определение модели. Эта модель содержит всю информацию, необходимую для рендера компонента. Они аналогичны свойствам и состоянию компонента реагирования.
Наш комментарий должен потребоваться три части данных; Текст для нового комментария, имя автора нового комментария и список существующих комментариев, которые отображаются:
type alias Model = { newCommentText : String , newCommentUser : String , comments : List Comment }
Модель определяется как псевдоним типа, потому что …
E. Как добавить новые комментарии с сообщениями и событиями
Чтобы получить что-то, чтобы произойти в ELM, вы отправляете сообщения. Сообщения – это тип, который вы определяете для каждого компонента ELM; Это события, которые ваш компонент сможет справиться и отвечать на.
В нашем случае компонент Comment Box имеет эти события:
- Пользователь ввел имя пользователя для нового комментария;
- Пользователь ввел какой-то текст для нового комментария;
- Или пользователь нажал «Добавить комментарий».
Давайте определим типы сообщений для нашего компонента:
type Msg = AddComment | ChangeNewCommentUser String | ChangeNewCommentText String
Далее мы определяем Обновить
функция. В этой функции мы будем проверять, какой тип сообщения был отправлен, а затем обновлять модель в частности.
Когда Дополнение
Сообщение получено, мы будем создавать новый комментарий от имени пользователя и текста, введенного пользователем, и добавляя его в качестве первого элемента списка комментариев. Мы также очищаем текст комментариев, чтобы пользователь мог добавить новый комментарий.
Когда ChangenewCommentuser
Сообщение получено, мы обновляем имя пользователя нового комментария на основе полученного значения.
Когда ChangenewCommentText
Сообщение получено, мы обновляем текст нового комментария на основе полученного значения.
update : Msg -> Model -> Model update msg model = case msg of AddComment -> let comment = { name = ( "User " ++ model.newCommentUser) , description = model.newCommentText } in { model | comments = comment :: model.comments , newCommentText = "" } ChangeNewCommentUser username -> { model | newCommentUser = username } ChangeNewCommentText description -> { model | newCommentText = description }
F. Отображение компонентов и отправки сообщений для запуска событий
Теперь мы определяем некоторые функции View для отображения кусочков страницы.
F.1. Отображение списка комментариев
Функция первого представления будет отображать существующий список комментариев. А поскольку мы отображаем список, нам также нужен другой помощник функции для отображения каждого отдельного комментария:
commentView : Comment -> Html Msg commentView comment = div [ class "comment" ] [ text (author "User A" comment) , text " - " , text comment.description ] commentList : Model -> Html Msg commentList model = div [ class "comment-list" ] (List.map commentView model.comments)
F.2. Отображение ввода для имени пользователя
Функция второго представления будет отображать поле ввода для пользователя, чтобы войти в их имя пользователя. Всякий раз, когда пользователь вводит в коробку, ChangenewCommentuser
сообщение будет отправлено на Обновить
функция.
inputUsername : Model -> Html Msg inputUsername model = div [] [ label[] [ text "User:" ] , input [ class "comment-input-user" , type' "text" , value model.newCommentUser , onInput ChangeNewCommentUser ] [] ]
F.3. Отображение ввода для текста комментариев
Функция Third View отобразит текстовую область для пользователя, чтобы ввести свой новый комментарий. Всякий раз, когда пользователь вводит в коробку, ChangenewCommentText
сообщение будет отправлено на Обновить
функция.
inputComment : Model -> Html Msg inputComment model = div [] [ label [] [ text "Comment:" ] , textarea [ class "comment-input-text" , onInput ChangeNewCommentText , value model.newCommentText ] [] ]
F.4. Отображение кнопки, чтобы добавить комментарий
Функция четвертого представления будет отображать кнопку. Когда кнопка нажата, она отправит Дополнение
сообщение. Это будет вызвать добавление нового комментария к списку комментариев:
inputButton : Html Msg inputButton = div [] [ button [ class "comment-button-add" , onClick AddComment ] [ text "Add Comment" ] ]
F.5. Объединение функций просмотра на один вид
Теперь мы определяем Вид
Функция, которая будет использовать функции просмотра, чтобы собрать компоненты для отображения пользователю:
view : Model -> Html Msg view model = div [ class "comment-box" ] [ commentList model , div [ class "comment-input" ] [ inputUsername model , inputComment model , inputButton ] ]
G. положить все это вместе
Наконец, нам нужно отобразить список ввода списка комментариев и комментариев на экране. Для этого мы собираемся определить основную точку входа в этот модуль, чтобы ELM знал, что нужно сделать в браузере, как запустить веб-приложение, какую функцию существует обновление и какие существуют подписки по течению данных.
В верхней части файла нам необходимо импортировать модуль HTML.App, который предоставляет функцию определения точки входа:
import Html.App
Затем в нижней части файла мы определяем начальное состояние приложения. Мы собираемся начать с пустых полей для нового текста комментариев и имени пользователя, и мы собираемся отобразить список двух комментариев:
model = { newCommentText = "" , newCommentUser = "" , comments = [ { name = "User A" , description = "Hi!" } , { name = "User B" , description = "Hello world!" } ] }
Затем мы определяем основную точку входа, используя Html.app.beginnerprogram
Функция:
main = Html.App.beginnerProgram { model = model , view = view , update = update }
BeginnerProgram
Функция – это упрощенный способ определить точку входа в программу ELM. Это позволяет вам указать модель компонента, представление, которое будет отображать модель и функцию, которая будет обновлять модель. Напротив, типичная программа ELM будет определять начальное состояние модели и любые подписки по течению данных. Упрощенный BeginnerProgram
Функция позволяет нам работать быстрее.
Вот как это выглядит, когда мы кладем все это вместе:
1 -- react-tutorial.elm 2 import Html exposing (..) 3 import Html.Attributes exposing (..) 4 import Html.Events exposing (..) 5 import Html.App 6 7 type alias Comment = 8 { name : String 9 , description : String 10 } 11 12 author : String -> Comment -> String 13 author currentUser { name } = 14 if currentUser == name then 15 name ++ " (You)" 16 else 17 name 18 19 type alias Model = 20 { newCommentText : String 21 , newCommentUser : String 22 , comments : List Comment 23 } 24 25 type Msg 26 = AddComment 27 | ChangeNewCommentUser String 28 | ChangeNewCommentText String 29 30 update : Msg -> Model -> Model 31 update msg model = 32 case msg of 33 AddComment -> 34 let 35 comment = { name = ( "User " ++ model.newCommentUser) 36 , description = model.newCommentText 37 } 38 in 39 { model 40 | comments = comment :: model.comments 41 , newCommentText = "" 42 } 43 44 ChangeNewCommentUser username -> 45 { model | newCommentUser = username } 46 47 ChangeNewCommentText description -> 48 { model | newCommentText = description } 49 50 commentView : Comment -> Html Msg 51 commentView comment = 52 div [ class "comment" ] 53 [ text (author "User A" comment) 54 , text " - " 55 , text comment.description 56 ] 57 58 commentList : Model -> Html Msg 59 commentList model = 60 div [ class "comment-list" ] 61 (List.map commentView model.comments) 62 63 inputUsername : Model -> Html Msg 64 inputUsername model = 65 div [] 66 [ label [] [ text "User:" ] 67 , input [ class "comment-input-user" 68 , type' "text" 69 , value model.newCommentUser 70 , onInput ChangeNewCommentUser 71 ] 72 [] 73 ] 74 75 inputComment : Model -> Html Msg 76 inputComment model = 77 div [] 78 [ label [] [ text "Comment:" ] 79 , textarea [ class "comment-input-text" 80 , onInput ChangeNewCommentText 81 , value model.newCommentText 82 ] 83 [] 84 ] 85 86 inputButton : Html Msg 87 inputButton = 88 div [] 89 [ button [ class "comment-button-add" 90 , onClick AddComment 91 ] 92 [ text "Add Comment" ] 93 ] 94 95 view : Model -> Html Msg 96 view model = 97 div [ class "comment-box" ] 98 [ commentList model 99 , div [ class "comment-input" ] 100 [ inputUsername model 101 , inputComment model 102 , inputButton 103 ] 104 ] 105 106 model = 107 { newCommentText = "" 108 , newCommentUser = "" 109 , comments = [ { name = "User A" , description = "Hi!" } 110 , { name = "User B" , description = "Hello world!" } ] 111 } 112 113 main = 114 Html.App.beginnerProgram 115 { model = model 116 , view = view 117 , update = update 118 }
VII. Использование компонента ELM на регулярной веб-странице
К крайниму, самая крутая вещь о ELM – насколько легко вставлять компоненты ELM на существующие веб-страницы и веб-приложения. Неважно, если вы используете Ember.js, angularjs или какой-то другой интерфейсный веб-каркас, вы все равно можете использовать компоненты ELM. Что делает этот крутой, это то, что когда вы работаете с существующим наследием кода, вы можете создавать новые компоненты в ELM и воспользоваться производительностью и проверкой типа безопасности ELM.
A. Компиляция файла ELM
Возьмите файл ELM, который мы написали, React-Tutorial.elm и компилируйте его с помощью ELM:
elm make react-tutorial.elm
Сгенерированный файл будет index.html
И он будет содержать компонент и весь код JavaScript, необходимый для компонента. Файл, сгенерированный для меня, было около 8000 строк кода. Хотя это отлично подходит для игры с ELM и Sharing HTML-файл позволит вам поделиться компонентом, он не совпадает с настройками производства реального мира.
Давайте попробуем это снова, на этот раз, составление компонента ELM в файл JavaScript:
elm make react-tutorial.elm --output comment-box.js
Когда вы открываете Комментарий-box.js
Это также будет около 8000 строк кода. Он включает в себя все ELM, все модули ELM We использовали и основной код компонента.
B. Установка компонента
Сначала мы собираемся настроить нашу основную страницу HTML, чтобы иметь Div, идентификатор которого является «комментарий». Это элемент, который будет захвачен ELM для отображения компонента коробки комментариев:
Hello Elm!
This is an article, below is the comment box.
Чтобы вставить компонент ELM на страницу, мы собираемся использовать Сценарий
Тег, чтобы импортировать файл JavaScript, который мы только что сгенерировали.
Затем мы собираемся вставить окно комментариев в элемент, идентификатор которого является «комментарий». Шаги будут похожи при интеграции эльма в рамки, такие как Angularjs и Ember.js:
C. Просто для удовольствия: стайлинг коробка комментариев в Facebook
Просто чтобы соответствовать стилю Facebook, давайте добавим некоторые CSS для компонента ELM.
Вот как это выглядит:
.comment-box { border-radius: 3px; border: 1px solid #ccccff; padding: 10px 3px; } .comment-input { margin-top: 10px; } .comment-input label { color: #5555cc; } .comment { padding: 10px; margin-bottom: 5px; background-color: #eeeeff; .comment-button-add { border-radius: 2px; border: 1px solid #555555; color: #333333; background-color: #ffffff; box-shadow: 0px 1px 5px 0px #aaa; }
D. Собрать окончательный HTML-файл
И, наконец, давайте посмотрим, как это выглядит, когда все это собрано. Мы устанавливаем стиль компонента, затем, включая файл JavaScript, который был скомпилирован ELM.
1 2 31 32Hello Elm!
33This is an article, below is the comment box.
34 35 36 40 41
VIII. Давайте посмотрим, как оказалось
Вот как это выглядит в браузере:
Спасибо, что ознакомились с этим руководством по использованию функционального языка программирования ELM для интерфейсного веб-разработки. Это отличная альтернатива другим языкам, которые компилируют JavaScript, как Teadercript или Babel/ES6. ELM имеет идеи о неизменности и подписки по течению данных, встроенные, наряду с проверкой типа. Это сильная альтернатива JavaScript и, как показано в этом уроке, это также простое, чтобы выучить альтернативу библиотекам и каркасам, таким как entt.js.
Попробуйте ELM для небольшого компонента, такой как коробка комментариев или форма опроса на вашем следующем веб-сайте. Счастливого взлома!
Другие учебники, которые вы можете найти интересным
- Создайте клон Trello, используя угловые, Node.js, Mongo и Express
- Создание красно-подобной системе комментариев с рельсами
- Создание приложения для путешествий геолокации IOS с реактивным