Pull to refresh
5
0

Frontend engineer

Send message
Вот статья про скролл infinite-list-and-react
Чего уж тут лукавить, первые пару-тройку дней я действительно ожидал увидеть ответ в почтовом ящике. Но затем, в летней суете, как-то и подзабылось…
Отправляя заявку в школу, я честно говоря, и ожидал знакомства с полным стеком БЭМа, т.к. для меня технология, в плане самостоятельного изучения, казалась несколько неподступной. И когда нам предложили самим выбирать технологии для проекта, я сильно не раздумывал. Так что не вижу ничего странного в том, что я изучал БЭМ в Яндексе =)
Только правильно так (имя переменной в которую попадет значение, указывается справа от двоеточия):
const {id: someIdInData} = data
console.log(someIdInData)
Вместо костыля с перезапуском через 5 минут, я бы рекомендовал использовать встроенные в certbot хуки: в данном случае post-hook, который описан тут

Т.е. вместо строк в crontab'e:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx


достаточно использовать:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew --post-hook "service nginx reload" >> /var/log/le-renew.log
Да собственно ничего)
У меня есть сайт на angular работающий на данном способе. Но сейчас, с приходом react'а, я предпочитаю пререндерить страницу не только для SEO, но и для пользователей (что имеет свои плюсы). При этом например метод с _escaped_fragment_ не понимали боты соц. сетей и для них приходилось городить определение по user-agent'у на уровне nginx'a и перенапрявлять на тот же _escaped_fragment_.
В общем я за простоту, особенно если спека помечена как deprecated)
В статье упомянуто об этом способе, а заодно указана ссылка на спеку в которой говорится что данный метод deprecated.
Я делаю сейчас по другому:
Много кода
class BlogPage extends Component {
    componentDidMount() {
        this.props.fetchPosts(this.props.params.page);
    }
}

BlogPage.dispatchOnServer = [
    params => fetchPosts(params.page)
];

и на сервере используется функция которая резолвит все dispatchOnServer компонентов:
export default (dispatch, components, params) => {
    const needs = components.reduce((prev, current) =>
        (current ? (current.dispatchOnServer || []).concat(prev) : prev),
        []
    );
    const promises = needs.map(fn => {
        let action = fn(params);

        if (isFunction(action)) {
            action = action(dispatch);
        } else {
            dispatch(action);
        }

        if (!('promise' in action)) {
            throw new Error('dispatchOnServer action MUST have \'promise\' key');
        }

        return action.promise;
    });

    return Promise.all(promises);
};

При этом action'ы выглядят так:
export function fetchPosts(offset) {
    return dispatch => dispatch({
        type: actions.FETCH_POSTS,
        offset,
        promise: fetch(`${constants.API}/posts?offset=${offset}&limit=${constants.POSTS_PER_PAGE}`)
            .then(responseData => dispatch({
                type: actions.FETCH_POSTS_SUCCESS,
                posts: responseData.data,
                total: responseData.total
            }))
            .catch(error => dispatch({
                type: actions.FETCH_POSTS_FAILURE,
                error: apiHelpers.formatResponseError(error)
            }))
    });
}

Ее использование:
app.get('*', (req, res) => {
    const memoryHistory = createMemoryHistory(req.url);
    const store = initReduxStore(memoryHistory);
    const location = req.url;
    const history = syncHistoryWithStore(memoryHistory, store);

    match({ routes, location, history }, (error, redirectLocation, renderProps) => {
        if (error) {
            return res
                .status(500)
                .send(error.message);
        }

        if (redirectLocation) {
            return res.redirect(302, redirectLocation.pathname + redirectLocation.search);
        }

        if (renderProps) {
            return fetchComponentsData(store.dispatch, renderProps.components, renderProps.params)
                .then(renderTemplate.bind(null, store, renderProps))
                .then(dataToServing => res
                    .status(dataToServing.status)
                    .end(dataToServing.html)
                )
                .catch(renderError => res.status(500).end(renderError.message));
        }

        return res.status(404).send('Not found');
    });
});



Это позволяет держать всю логику наполнения стора в компоненте, хоть и по разному для клиентской части и сервера. Ничего удобнее я пока не видел, хотя хотелось бы конечно =)
А еще есть шикарнейший http://include-media.com/
Осенью должны перевести в статус кандидата.
http://www.w3.org/Style/CSS/Planet/#item2
Но при этом он вряд-ли знает как грамотно собрать здоровый SPA например. Это из области сравнения теплого с мягким…
Конечно, решит) Но все-равно не будет работать в IE < 11, что ограничивает круг использования.
Да и вообще, имхо, второе демо интересно лишь в роли демо как раз, в проектах бы я такое не применял… Для каждого слова по dom-элементу как-то черезчур)
Потому что поверх, с помощью использования псевдоэлемента ::after, отрисовывается прозрачный блок, что и блокирует выделение текста.
Есть еще отличный extension под Chrome для тестирования запросов: Postman — REST Client
под скомпилированный файл ставить то ничего не нужно, среду необходимо поставить единожды на компьютере разработчика
Присоединюсь к предыдущим комментариям. Может кто-то подскажет хорошего российского регистратора? Насколько это возможно=)
Ко всему вышеперечисленному выше — я бы вынес загрузку данных в resolve роутов.
И тоже не особо понял чем не угодил в данном случае MySQL и почему ngAnnotate не справится с аннотированием. Со стандартными регистрациями angular'овских компонентов (и даже некоторых сторонних плагинов, например resolv'ы ui-router'а) он отлично справляется без дополнительной помощи. В свои компоненты, при использовании например $injector'a, да, иногда надо добавлять /*@ngInject*/
я так понял у человека index отдается phalcon'ом, и роутинг phalcon'а совпадает с роутингом фронта, поэтому так и выходит… Но вообще да, правильно на любой запрос вернуть index…
А чего спорного? Если человек не пользуется проектом, то откуда он может узнать что в проекте можно улучшить/исправить?
1

Information

Rating
Does not participate
Location
Симферополь, Республика Крым, Россия
Date of birth
Registered
Activity