Обновить
256K+

JavaScript *

Прототипно-ориентированный язык программирования

272,65
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Готовим идеальный CSS

Время на прочтение13 мин
Охват и читатели61K
Привет, Хабр!

Не так давно я понял, что работа с CSS во всех моих приложениях — это боль для разработчика и пользователя.

Под катом лежат мои проблемы, куча странного кода и подводные камни на пути к правильной работе со стилями.

Read more →

Руководство по JavaScript, часть 6: исключения, точка с запятой, шаблонные литералы

Время на прочтение10 мин
Охват и читатели21K

HolyJS 2018 Moscow: бесплатная онлайн-трансляция, вечеринка и научно-технический рэп

Время на прочтение3 мин
Охват и читатели3.3K


Конференция HolyJS 2018 Moscow пройдёт уже в эти выходные, и в этом посте есть ценная информация как для идущих туда, так и для всех остальных JavaScript-разработчиков. Зрители конференции узнают, что именно они увидят на вечеринке, а остальные — какие доклады они смогут посмотреть бесплатно в прямом эфире на YouTube.
Читать дальше →

Крестики нолики «Без границ»

Время на прочтение14 мин
Охват и читатели29K
Крестики-нолики… в них играли все, я уверен. Игра притягательна своей простотой, особенно когда ты тянешь часы где-нибудь на уроке, паре, а под рукой нет ничего, кроме тетрадного листа и простого карандаша. Уж не знаю, кто первым когда-то догадался рисовать кресты и кружки в 9 квадратах, но с тех пор игра нисколько не потеряла в востребованности, тем более, что народ придумал огромное множество её вариаций.



Эта статья про процесс разработки ИИ на javascript для игры в одну из таких вариаций крестиков-ноликов: получилось довольно много материала, но я разбавил его анимацией и картинками. В любом случае, хотя бы стоит попробовать поиграть в это.
Отличия этого варианта игры от оригинала в следующем:

  1. Поле может быть сколь угодно большим (На сколько хватит тетради)
  2. Побеждает тот, кто поставит 5 фигур (если их можно так назвать) в ряд.

Все просто… и в то же время сложно: исход игры не может быть просчитан заранее, как в классическом аналоге. Этот «маленький проектик» отнял у меня много времени и нервов. Надеюсь, что вам будет интересно.
Читать дальше →

Руководство по JavaScript, часть 5: массивы и циклы

Время на прочтение12 мин
Охват и читатели92K

Мутационный анализ, или как тестировать тесты

Время на прочтение10 мин
Охват и читатели10K
Тестов много не бывает — это все знают. Мемы про unit и интеграционное тестирование уже не очень-то веселят. А мы по-прежнему не знаем, можно ли полагаться на результаты прохождения тестов, и какой процент покрытия позволит не пустить баги в продакшен. Если фатальные изменения в коде проскакивают тесты, не оказывая влияния на их результат, то решение напрашивается само — надо тестировать тесты!



О подходе к автоматизации этой задачи и был доклад Марка Лангового на Frontend Conf. Видео и статья короткие, а идеи очень рабочие — надо брать на заметку.

Валидация форм React. Часть 2

Время на прочтение5 мин
Охват и читатели3.6K
В первой части (Валидация форм React. Часть 1) я описал, как можно работать с react-validate-form, теперь буду улучшать код. Вынесем в отдельный блок поле инпут, подсказки и ошибки. И подключим redux.

import React, {Component} from 'react';
import {connect as vBooConnect} from 'react-validation-boo';
import {connect as reduxConnect} from 'react-redux';
import {InputBlock, InputCheckboxBlock, InputRadioGroupBlock, TextareaBlock, SelectBlock} from '../form/default';

class MyForm extends Component {
    constructor() {
        super();

        this.genderOptions = [
            {value: '', label: 'Ваш пол?'},
            {value: 1, label: 'Мужской'},
            {value: 2, label: 'Женский'}
        ];

        this.familyRadioList = [
            {value: 1, label: 'холост'},
            {value: 2, label: 'сожительство'},
            {value: 3, label: 'брак'}
        ];
    }
    componentWillMount() {
        this.props.vBoo.subscribe('change:input', this.props.onChangeVBooInput);
        this.props.vBoo.subscribe('valid:form', this.props.onChangeVBooValid);
    }
    render() {
        let s = this.props.myStore.inputs;
        return <Form connect={this.props.vBoo.connect}>
            <InputBlock name="name" value={s.name} />
            <InputBlock name="email" value={s.email} />
            <SelectBlock name="gender" options={this.genderOptions} value={s.gender} />
            <InputRadioGroupBlock name="familyStatus" items={this.familyRadioList} value={s.familyStatus} />
            <TextareaBlock name="comment" value={s.comment} />
            <InputCheckboxBlock name="addition" value="yes" checked={s.addition==='yes'} />

            <button onClick={this.sendForm}>
                {this.props.vBoo.isValid() ? 'Можно отправлять': 'Будьте внимательны!!!'}
            </button>
        </Form>
    }
}

export default reduxConnect(
    store => ({
        myStore: { // для наглядности
            isValid: false,
            inputs: {
                email: 'test@mail.ru',
                gender: 0,
                familyStatus: 1
            }
        }
    }),
    dispatch => ({
        onChangeVBooInput: (input) => {...},
	onChangeVBooValid: (isValid) => {...}
    })
)(vBooConnect({
    rules: () => ([...]),
    labels: () => ({...}),
})(MyForm));
Читать дальше →

Руководство по JavaScript, часть 4: функции

Время на прочтение12 мин
Охват и читатели78K

Модальное окно, которое вы ждали. Или как вызвать «всплывашку» с разных кнопок на чистом JS

Время на прочтение3 мин
Охват и читатели25K
Добрый день! Меня зовут Черепанов Борис, я занимаюсь разработкой сайтов на wordpress и bitrix. Я тут над проектом работал. Одно из ограничений было не использовать jquery, а мне нужно было вызвать одно и тоже модальное окно с разных кнопок. Собственно, это довольно простая задача, но я решил пойти дальше и сделать модальное окно, которое бы создавалось при первом клике, сохраняло своё состояние, имело конструктор для вызова и т.д. И в итоге я не пожалел. Объясню почему позже. Я «обернул» это модальное окно в готовое решение, которое можно использовать постоянно.
Читать дальше →

«Тут всегда придётся развиваться»: интервью с Евгением Кувшиновым (ManyChat) о разработке в стартапе

Время на прочтение14 мин
Охват и читатели8.3K


Все мы примерно представляем, как выглядит разработка в крупной компании и чем от неё может отличаться разработка в небольшой. А что происходит, если размеры компании стремительно меняются, и число сотрудников за пару лет увеличивается в десять раз? Когда стартап бурно растёт, и надо на ходу адаптироваться к новым обстоятельствам, как это сказывается на всём (от процессов до технологий)?

В нашей конференции HolyJS поучаствует компания ManyChat, у которой как раз так и происходит. Поэтому мы расспросили техлида разработки фронтенда Евгения Кувшинова и конкретно о ManyChat, и вообще о том, каково заниматься (фронтенд)-разработкой в стартапе.
Читать дальше →

Дайджест свежих материалов из мира фронтенда за последнюю неделю №339 (12 — 18 ноября 2018)

Время на прочтение4 мин
Охват и читатели14K
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Читать дальше →

Валидация сложных форм React. Часть 1

Время на прочтение10 мин
Охват и читатели23K
Для начала надо установить компонент react-validation-boo, предполагаю что с react вы знакомы и как настроить знаете.

npm install react-validation-boo

Чтобы много не болтать, сразу приведу небольшой пример кода.

import React, {Component} from 'react';
import {connect, Form, Input, logger} from 'react-validation-boo';

class MyForm extends Component {
    sendForm = (event) => {
        event.preventDefault();

        if(this.props.vBoo.isValid()) {
            console.log('Получаем введённые значения и отправляем их на сервер', this.props.vBoo.getValues());
        } else {
            console.log('Выведем в консоль ошибки', this.props.vBoo.getErrors());
        }
    };
    getError = (name) => {
        return this.props.vBoo.hasError(name) ? <div className="error">{this.props.vBoo.getError(name)}</div> : '';
    };
    render() {
        return <Form connect={this.props.vBoo.connect}>
            <div>
                <Input type="text" name="name" />
                {this.getError('name')}
            </div>
            
            <button onClick={this.sendForm}>
                {this.props.vBoo.isValid() ? 'Можно отправлять': 'Будьте внимательны!!!'}
            </button>
        </Form>
    }
}

export default connect({
    rules: () => (
        [
            ['name', 'required'],
        ]
    ),
    middleware: logger
})(MyForm);

Читать дальше →

От var b до собеседования

Время на прочтение4 мин
Охват и читатели12K
Вы почти закончили универ или колледж? Вас пригласили на собеседования, но вы идете туда без подготовки? У вас нет образования (высшего), но хотите работать программистом или в сфере IT? Речь пойдёт по большей степени о поиске работы, я буду говорить лишь за свой город (Челябинск) т.к. искал работу именно здесь.


Читать дальше →

Ближайшие события

Приручить зверя. С чем мы столкнулись при разработке приложения для ведения личного дневника на React Native

Время на прочтение8 мин
Охват и читатели11K
В предыдущей статье я подробно рассказал о нашем опыте создания веб-сервиса/мобильного приложения для ведения личного дневника. Актуальная версия приложения (минимальная работоспособная версия уже выложена в Google Play) разрабатывается на React Native, и вот на нем мы и остановимся подробно сегодня.

Рассказываем о собственном опыте работы с фреймворком, способах расширения функционала, «подводных камнях» (куда ж без них!) и как мы их обошли.

О фреймворке в целом


Немного о виновнике торжества — React Native. Он все-таки хорош!

Для тех, кто в достаточной степени знает JavaScript и тем более NodeJS — он очень хорош. Если же есть опыт с React, ну или хотя бы есть понимание ее идеи, механизма — он просто великолепен!

Главное, что на выходе получается действительно нативное приложение. Расширения и плагины покрывают практически 99% типовых задач. Оставшийся процент при острой необходимости можно дописать на родных языках (java, object-c) и подключить к React Native приложению.

Но хватит про плюсы, от них толку ноль, хоть список и будет внушительным. Все плюшки и вкусности бессмысленны, если приложение не запускается, а это первое чем нас «порадовал» React Native.

Сначала ему не понравилась версия NodeJS. Потом версия npm. Потом версия Android SDK, потом версия Android tools, потом… Писать про то, как все проблемы решились, смысла нет, ибо с того момента все вышеперечисленное ПО обновило свои версии и инструкции будут неактуальны.

Просто знайте: узкое место React Native — среда сборки. Будьте готовы к штудированию google, чтению форумов и stackoverflow. На развертывание в итоге потратили: Ubuntu — 3 дня, Win10 — 2 дня. Как ни странно, на «винде» все оказалось проще, ну, или просто на ubuntu «шишек набили» и уже понимали, что и куда подсовывать.

На заметку, вдруг кому пригодится: код, представленный ниже, решил все проблемы с совместимостью версий sdk у дополнений при компиляции проекта.
Читать дальше →

Руководство по JavaScript, часть 3: переменные, типы данных, выражения, объекты

Время на прочтение14 мин
Охват и читатели106K

Как строить и построить

Время на прочтение11 мин
Охват и читатели4K

Предыстория


Встретившись в многочисленных местах разработки на Javascript с ситуациями, где необходимо было проводить валидацию значений, стало понятно, что необходимо как-то решить этот вопрос. С этой целью была поставлена следующая задача:
Разработать библиотеку, которая будет давать возможность:


  • валидировать типы данных;
  • задавать дефолтные значения вместо невалидных полей или элементов;
  • удалять невалидные части объекта или массива;
  • получать сообщение об ошибке;

В основе которой будет:


  • Легкость в освоении
  • Читабельность получаемого кода.
  • Легкость модификации кода

Для достижения этих целей была разработана библиотека валидации quartet.

Читать дальше →

Оптимизация обработки событий в Angular

Время на прочтение8 мин
Охват и читатели16K

Введение


Angular предоставляет удобный декларативный способ подписки на события в шаблоне, с помощью синтаксиса (eventName)="onEventName($event)". Вместе с политикой проверки изменений ChangeDetectionStrategy.OnPush подобный подход автоматически запускает цикл проверки изменений только по интересующему нас пользовательскому вводу. Иными словами, если мы слушаем (input) событие на <input> элементе, то проверка изменений не будет запускаться, если пользователь просто кликает по полю ввода. Это значительно улучшает
производительность, по сравнению с политикой по умолчанию (ChangeDetectionStrategy.Default). В директивах мы также можем подписаться на события на хост-элементе через декоратор @HostListener('eventName').


В моей практике нередко встречаются случаи, когда обработка конкретного события требуется только при выполнении какого-либо условия. т.е. обработчик выглядит примерно так:

Читать дальше →

CI для фронтенда: Gitlab, Traefik, Docker

Время на прочтение4 мин
Охват и читатели17K
В каждом уважающем себя проекте должны участвовать QA инженеры. Ежедневно перед ними будет стоять задача проверки выполнения задач в отдельных ветках. Очень часто процесс перехода на нужную ветку, сборки и тестирования занимает много времени, к тому же, локально не всегда возможно полностью воссоздать максимально идентичное боевому окружение.

Цель данной статьи — показать простую технику настройки стенда на несколько веток. Данная статья написана разработчикам от разработчика, поэтому вряд ли будет представлять существенный интерес для профессиональных DevOps инженеров.
Читать дальше →

Как настроить установку переменных окружения Nuxt.js в рантайме, или Как сделать всё не как все и не пожалеть

Время на прочтение5 мин
Охват и читатели13K

(Иллюстрация)

Senior web developer’ы Антон и Алексей продолжают рассказ о непростой борьбе с Nuxt. В предыдущем раунде битвы с этим фреймворком они показали, как запустить проект на Nuxt так, чтобы все были счастливы. В новой статье поговорим о реальном применении фреймворка.

Мы начали переписывать проект с огромным техническим долгом. Месячная аудитория составляла 6-7 млн. уникальных посетителей, но существующая платформа доставляла слишком много проблем. Поэтому было решено отправить ее на пенсию. Само собой, производительность была нашим наибольшим опасением, но также не хотелось просесть по SEO.

После пары раундов обсуждения решили не полагаться на традиционный подход с только серверным рендерингом — но и не загонять себя в ловушку клиентского рендеринга. Как итог мы начали строить решение на базе Nuxt.js.
Читать дальше →

Частичка программы HolyJS 2018 Moscow

Время на прочтение4 мин
Охват и читатели2.6K


HolyJS 2018 Moscow уже совсем скоро. Конференция состоится 24–25 ноября.

В этот раз программа получилась весьма разнообразной, однако несложно выделить главные тенденции:

  • Доклады из первых рук (#firsthand) — доклады о инструментах/решениях от их авторов. Мы особенно тщательно подошли к выбору выступающих в этом направлении.
  • Доклады о фундаментальных вещах (#fundamentals). Такие доклады необходимы всегда, особенно в нашей юной экосистеме.
  • Доклады, затрагивающие Node.js (#node). С каждой конференцией в отзывах мы видим призыв «еще больше про nodejs!», мы это слышим и пытаемся искать действительно качественные доклады в данном направлении.
  • Также получилось немало докладов про IoT (#iot) и инструменты (#tools).

Направления направлениями, но основа любой конференции — крутые спикеры, давайте взглянем на треть наших спикеров и познакомимся с ними поближе.
Читать дальше →