• Что значит и как перевести на русский tree shaking?

    rockon404
    @rockon404
    Frontend Developer

    Tree shaking (встряхивание дерева) — термин объединения модулей JavaScript, обозначающий статический анализ всего импортированного кода и исключение того, что на самом деле не используется.

    Для более прямолинейной аналогии рассмотрим живое дерево. Дерево встряхивается, и это заставляет мертвые листья отваливаться, оставляя только живые. В основе tree shaking лежит концепция живого включения кода (live code inclusion): мы включаем части, необходимые для начала, в отличие от удаления ненужных частей в конце — устранения «мертвого кода» (dead code elimination).

    Tree shaking зависит от import и export модулей ES2015. Выражения import и export составляют статическую структуру модуля приложения. Когда модули объединяются для развертывания приложения, tree shaker анализирует статическую структуру модуля, чтобы исключить неиспользуемый экспорт, уменьшив размер окончательного пакета.

    ES2015 позволяет указывать явный импорт. Например, вместо импорта всей библиотеки RxJS мы можем импортировать именно то, что хотим:

    import { BehaviorSubject } from 'rxjs/BehaviorSubject';

    Это отличается от динамического выражения require, используемого CommonJS или AMD. Tree shaking использует этот принцип для перемещения по зависимостям и исключения ненужных зависимостей для уменьшения размера приложения.

    Принцип tree shaking не нов, но он только недавно был популяризирован с помощью сборщика rollup.js, объединяющего модули приложения. Webpack 2 также использует tree shaking. Концепция tree shaking также распространена в Angular с компиляцией AOT.

    Источник
    Ответ написан
    Комментировать
  • Можно ли после основ JS перейти к изучению React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Для того, чтобы начать изучение, возможно, хватит. Подтяните ES6 и промисы.
    Для того, чтобы написать полноценное, поддерживаемое SPA основ JS и изучения React в кратчайшие сроки, скорей всего не хватит.

    Я так же, в свое время, JavaScript параллельно с Backbone изучал. Надо было в кратчайшие сроки начать писать приложение и меня выдернули из мобильной разработки. Так вышло, что навсегда.)
    Ответ написан
    Комментировать
  • Как сделать исчезающую/появляющуюся стрелочку "вверх" на React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    class ArrowUp extends Component {
      state = {
        isVisible: false,
      };
    
      componentDidMount() {
        window.addEventListener('scroll', this.handleScroll);
      }
    
      componentWillUnmount() {
        window.removeEventListener('scroll', this.handleScroll);
      }
    
      handleScroll = () => {
        if (window.scrollY >= SOME_VALUE  && !this.state.isVisible) {
          this.setState({ isVisible: true });
        } else if (window.scrollY < SOME_VALUE && this.state.isVisible) {
          this.setState({ isVisible: false });
        }
      };
    
      render() { /* ... */ }
    }
    Ответ написан
    Комментировать
  • Нужен ли слепой 10-ти пальцевый набор?

    rockon404
    @rockon404
    Frontend Developer
    Осваивайте, очень полезный навык как для кодинга, так и для общения с командой/заказчиком в мессенджерах, постановки задач и прочего.
    Скорость придет с практикой.

    Тут в ответах ребята почему-то ставят акцент на скорость и на то, что она не нужна. Но я бы десятипальцевый набор больше относил не к скоростной печати, а к свободной и непринужденной. Вы как птица в полете. Не отвлекаетесь на клавиатуру, все на уровне рефлексов. Можете концентрироваться лишь на том, что действительно важно. Одним словом - кайф.

    От работы надо стараться получать удовольствие. Слепая печать - это один из шагов в этом направлении.
    Ответ написан
    Комментировать
  • Как сделать простую прокрутку (без анимации) до якоря без изменения адресной строки (без jQuery на React)?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Проще некуда:
    element.scrollIntoView();
    Демо

    В имплементации React как-то так:
    handleLinkClick = e => {
      e.preventDefault();
      const element = document.getElementById(e.target.href);
      element.scrollIntoView();
    };
    Ответ написан
    Комментировать
  • Что скажете о данном коде? Каков мой уровень?

    rockon404
    @rockon404
    Frontend Developer
    Ничего.
    1. Там пара строк всего. На приложение не тянет. Увидели где-то простой пример и немного изменили. Оценить по этому примеру навыки не представляется возможным. Разве можно сказать, что вы что-то где-то совсем недавно прочитали про MVC.
    2. Так уже лет 10 минимум никто не пишет.
    Ответ написан
    2 комментария
  • Как поднять состояние, если это нужно делать при каждом обновлении state потомка?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Храните все состояние формы в родителе и передавайте ребенку колбек:
    class Child extends Component {
      render() {
        const { handleChange } = this.props;
    
        return (
          <Wrapper>
            <SomeInput onChange={handleChange} /> 
          </Wrapper>
        );
      }
    }


    примерный код колбека:
    handleChange = e => {
      const { name, value } = this.props;
    
      this.setState({ [name]: value }, this.calculate);
    };
    Ответ написан
    1 комментарий
  • Как сделать скролл на список?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    react-window
    react-virtualized
    Если размер списка ожидается не большой и оптимизация производительности не нужна, то за глаза хватит любого кастомного скролла.
    Ответ написан
    2 комментария
  • А какая архитектура reactjs/redux приложения у вас?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Есть два хороших подхода к организации кодовой базы, которые подходят для большинства проектов: File Type First и Feature First:

    Пример Feature First

    Проект:
    /common
      /api
      /components
      /ducks
      /entities
      /sagas
      /selectors
      /utils
    /features
      /Feature1
      /Feature2
      /Feature3
      /Feature4
      ...
      /FeatureN
    /Main
      /pages
      index.js
      App.js
      routes.js
      rootReducer.js
      rootSaga.js
      store.js
    /Auth
      /pages
      index.js
      App.js
      routes.js
      rootReducer.js
      rootSaga.js
      store.js
    ...

    Отдельно взятая Feature:
    /features
      /Accounts
        /components
        index.js
        accountsDucks.js
        accountsSaga.js
        accountsSelectors.js
        accountsApi.js
        Accounts.js
        AccountsContainer.js

     
    Пример File Type First
    /actions
    /common
    /components
      /core
      /Feed
      /Profile
      ...
    /constraints
    /containers
    /entries
    /locales
    /pages
    /reducers
    /utils
    ...


    Оба подхода при умелом использовании они отлично масштабируются, поддерживаются и не вызывают проблем при рефакторинге.

    Дата мапперы в зависимости от задач можно использовать в редьюсерах, в mapStateToProps и asyncActions. Главное чтобы по проекту все было стандартизировано.
    В mapStateToProps пишут преобразования необходимые лишь для одного компонента.

    Большое количество бойлерплейта это плата которую вы платите за использование redux. Можно писать все константы и редьюсеры руками, можно использовать библиотеки вроде redux-actions и ей подобные. В первом случае вы получаете плюс к гибкости, читаемости и статическому анализу, во втором меньше кода. Я в большинстве проектов предпочитаю первый вариант. Так же создаю шаблоны файлов в Webstorm для asyncActions, contstraints, редьюсера, страницы, компонента и законнекченого компонента.
    В специфичных проектах с множеством CRUD запросов и похожих сущностей есть смысл написать CRUD Boilerpalte.
    Ответ написан
    Комментировать
  • Почему получаю "Uncaught SyntaxError: Unexpected token" при отдаче html-файла?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Ошибка не при отдаче html файла. Он без проблем отдается. Во втором случае проблемы со статикой. express.static это middleware(промежуточное ПО). Express все запросы обрабатывает по-порядку через все middleware пока не найдет подходящий endpoint. В первом случае express.static обрабатывает пути до роутера, перехватывая только запросы за статическими файлами и возвращая файлы в ответ. Во втором случае эти запросы попадают в роутер, который у вас обрабатывает все пути и возвращает index.html. До express.static запросы не доходят и вместо всей статики вы получаете этот файл и парсер JS выдает ошибку.

    Простой пример:
    app.use((req, res, next) => {
      console.log('Time: ', Date.now());
      next();
    });
    app.use(express.static(__dirname + '/public'));
    app.get("/about", (req, res) => { /* */}); // ( 1 )
    app.get("/home", (req, res) => { /* */});  // ( 2 )
    app.get("*", (req, res) => { /* */}); // ( 3 )
    app.get("/never", (req, res) => { /* */}); // ( 4 )

    Допустим приходит 4 запроса:
    GET https://site/public/img/1.png
    GET https://site/home
    GET https://site/feed
    GET https://site/never

    Во всех случаях в консоли покажется: Time: <текущее время>
    Первый запрос будет перехвачен express.static и не дойдет до роутера.
    Второй запрос будет перехвачен эндпоинтом ( 2 ), ( 1 ) будет пропущен так как пути не совпадают.
    Третий эндпоинтом ( 3 ), так как он перехватывает абсолютно все запросы которые до него доходят, ( 1 ) и ( 2 ) соответственно пропущены.
    Четвертый запрос так же будет перехвачен и обработан эндпоинтом ( 3 )
    До эндпоинта ( 4 ) запросы дойти не могут. Его надо поменять местами с ( 3 )
    Ответ написан
    1 комментарий
  • Как реализовать функцию invert для объекта?

    rockon404
    @rockon404
    Frontend Developer
    function invertTree(tree) {
      let { left, right, ...rest } = tree;
      [ left, right ] = [ right, left ];
    
      return { left, right, ...rest };
    }

    или:
    const invertTree = ({ left, right, ...rest }) => ({ left: right, right: left,  ...rest });
    Ответ написан
    Комментировать
  • Почему в моем примере не получается задать button.onclick?

    rockon404
    @rockon404
    Frontend Developer
    container.innerHTML += "<br />";
    Во время этого вызова происходит преобразование innerHTML в строку, конкатенация, удаление всех потомков узла container, анализ получившейся строки и создание новых элементов-потомков.
    Так как все элементы узла container заменяются новыми, то слушатели, которые вы вешали на потомков узла до вызова, естественно, не сохраняются.
    Можно заменить на:
    var br = document.createElement('br');      
    container.appendChild(br);
    Ответ написан
    2 комментария
  • Почему получаю "strict MIME type checking is enabled." при ре-роуте пользователя?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Возможно, в конфиге webpack не прописан public path:
    module.exports = {
        ...
        output: {
            publicPath: '/'
        }
    }


    Правильный путь:
    to={`/dictionary/${item.toLowerCase()}`}
    Ответ написан
    5 комментариев
  • Как сверстать подобное?

    rockon404
    @rockon404
    Frontend Developer
    Ответ написан
    Комментировать
  • Почему множественный fetch-запрос возвращает Promise вместо объектов?

    rockon404
    @rockon404
    Frontend Developer
    Promise.all(data).then(console.log);
    Ответ написан
    Комментировать
  • Как определить количество черных пятниц(13 числа) в году?

    rockon404
    @rockon404
    Frontend Developer
    Пройтись циклом по 13 числам года и если это пятница, класть в массив результатов.
    Ответ написан
    1 комментарий
  • Можно ли вынуть pdf с сайта через средства разработчика?

    rockon404
    @rockon404
    Frontend Developer
    Невозможно "вынуть" то, чего в коде сайта нет. На всех нормальных ресурсах купленные PDF, выдаются сервером по персональной ссылке с ограниченным сроком действия.
    Ответ написан
    Комментировать
  • Как объединить большое количество условий?

    rockon404
    @rockon404
    Frontend Developer
    Для подобных кейсов хорошо подходит конструкция switch:
    switch(a) {
      case 1:
        alert('b');
        break;
      case 2:
        alert('c');
        break;
      default:
        alert('d');
    }
    Ответ написан
    Комментировать
  • Добавление в таблицу значение из двух разных массивов с объектами?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    {this.props.massMedia.map(item => {
      const type = mediaType.find(el => el.id === item.type);
    
      return (
        <TableRow key={item.id} directory={item} directory1={type} />
      );
    })}
    Ответ написан
  • Какой вид локализации клентских приложений более гибкий?

    rockon404
    @rockon404
    Frontend Developer
    Первый вариант проверенный, удобный и отлично подходит в большинстве случаев.

    - Каждый раз нужно импортировать текст-контент и брать значение по нужным ключам

    Достаточно написать удобные хелперы и передавать в них короткий ключ:
    i18nMessage('landing_header');
    i18nPlural('comments_count', comments.size);
    i18nWrapper('landing_caption', [<strong />]);

    Вложенных ключей лучше стараться избегать. Использовать их разве для списков.
    Ответ написан
    Комментировать