• Зачем собирать проект на сервере?

    Stalker_RED
    @Stalker_RED
    У софта, библиотек, и прочих зависимостей бывают версии. Еще и у железа отличия бывают.

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

    Собрав у себя локально и перелив на сервер, у которого отличается окружение - рискуете получить кучу глюков, и чем больше оно отличается, тем сильнее рискуете.
    Ответ написан
    7 комментариев
  • Тестовое задание (Junior Frontend), приемлемое ли?

    @uroot
    Дали 3 дня и после можно скинуть даже не полностью готовое.
    В этом вся соль. Делаете что умеете, а после пытаетесь сделать все остальное. От этого, видимо, будет зависеть ваша ЗП. Вам же не сказали, что нужно заверстать весь макет + анимация + API карты, иначе вы бездарь. Они дали типичный макет для их студии и хотят по максимуму проверить ваши навыки, понять что вы умеете. Но и вправду, не сильно понятно, зачем столько страниц верстать, можно было одну + карта.
    Ответ написан
    Комментировать
  • Тестовое задание (Junior Frontend), приемлемое ли?

    SkipTyler
    @SkipTyler
    Junior+ Front-End developer
    Как по мне это даже не для Front-end

    А для верстальщика, еще и без адаптива...
    Ответ написан
    Комментировать
  • Тестовое задание (Junior Frontend), приемлемое ли?

    Слишком большое задание для теста. Хватило бы и одной страницы. А тут - довольно плотно поработать, чтобы сделать хорошо. Если без оплаты, то вероятно, они так экономят на верстке лендосов каких-нибудь.
    Ответ написан
    2 комментария
  • Тестовое задание (Junior Frontend), приемлемое ли?

    @stratosmi
    Имхо, вы путаете:

    Junior
    и
    Trainee

    Для джуна задание нормальное. Более чем несложное.

    А то, как вы к нему относитесь боязливо - скорее выдает трейни.

    Радует что нет адаптива


    И это вы пишите в конце второго десятилетия 21 века?
    Когда трафик со смартфонов давно превысил 60% ?
    Ответ написан
    Комментировать
  • Тестовое задание (Junior Frontend), приемлемое ли?

    @kirill-93
    Вертел я такие задания при устройстве на работу.
    Однажды тоже устраиваясь в "крутую" контору прислали большое задание. Все выходные убил на него. Потом еще две недели мурыжили собеседованиями и в итоге не взяли.
    Я с тех пор никогда не соглашаюсь на тестовые задания, которые займут больше получаса моего времени.
    Объемные задания должны оплачиваться. Если они очень требовательно отбирают сотрудников, то сначала надо дать простое задание/прособеседовать и уже если человек их устраивает, давать объемное задание и платить.

    UPD
    Не слушайте, пожалуйста, бред об опыте и пользе для вас. Из таких "будущих хороших специалистов" потом веревки вьют, типа "поработай по вечерам, это ж опыт для тебя!" или "давай ты теперь и по субботам выходить будешь, а мы тебя за это серьёром называть будем!". Очень работает с наивными молодыми людьми.
    Вы поймите, что все эти разговоры про опыт и пользу для вас - это уловки с целью сэкономить и вас обмануть. Всем плевать на ваш опыт, им нужно денег меньше вам заплатить и все.
    Огромное тестовое задание - это неуважение к кандидаду.
    Давай представим обратную ситуацию: я прихожу к потенциальному работодателю и говорю: "Давайте я у вас тут недельку посижу без каких-либо обязательств, а вы мне зарплату платите. А потом посмотрим, может быть останусь, а может уйду". Нормально? Ситуация выглядит именно так, потому что работодатель не делает одолжения принимая на работу, он "покупает" ваше время и ваш опыт и все.
    Ответ написан
    13 комментариев
  • Чем конкретно занимается Frontender сейчас?

    orlov0562
    @orlov0562
    I'm cool!
    Да, фронты занимаются всем тем, что видит пользователь. И если раньше, это была только верстка под 1-2 браузера, то сейчас это верстка под разные разрешения, анимация, попапы, реактивные компоненты и много чего еще. Не думаю, что обычный бэк пишущий парсеры и API, вот так может взять psd-шный макет по слоям и сделать из него за разумное время адаптивное SPA приложение, например на Vue. Вот отсюда и выросла отрасль - фронт усложнился и нужны узкие специалисты. При этом бэк в свою очередь становится все проще и проще, тк в 90% случаев бэк это лишь набор инструкций для вывода данных из базы.
    Ответ написан
  • Как сегодня верстают такие бордеры?

    profesor08
    @profesor08 Куратор тега CSS
    Псевдоэлементы в помощь:
    Ответ написан
    2 комментария
  • Почему гугл и яндекс не сделали свои главные страницы в виде pwa?

    @stratosmi
    Незачем.

    PWA предполагает что в браузере остается работать некая часть кода сайта, берущая на себя частично серверный функционал.

    Но зачем это поисковику?
    Какой там будет функционал?
    Как вы себе представляете без сети поисковик?

    А, скажем, для почты того же Google некоторый смысл в этом есть и они используют PWA для GMail. Также и для Youtube. И mail.ru использует.
    В Firefox в этом можно убедиться вбив в строке адресной
    about:serviceworkers
    Ответ написан
    3 комментария
  • Почему выводится старое значение state?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    this.setState(
      prevState => ({ test: !prevState.test }),
      () => console.log(this.state.test),
    );
    Ответ написан
    Комментировать
  • Почему выводится старое значение state?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Because this.props and this.state may be updated asynchronously, you should not rely on their values for calculating the next state.

    Документация

    Вот так правильно:
    this.setState(
      (state) => ({test: !state.test}),
      () => console.log(this.state.test)
    );
    Ответ написан
    Комментировать
  • Как скопировать все props в state?

    @dimoff66
    Кратко о себе: Я есть
    this.state = {...props}
    Ответ написан
    1 комментарий
  • Как скопировать все props в state?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Есть и такая, но, скорее всего, вы видели вот это: this.state = {...props}

    Тогда не нужно будет писать this.state.props.foo, можно будет обращаться через this.props.foo.

    На мой взгляд, это плохая практика и так можно делать только в некоторых очень ограниченных сценариях.
    Ответ написан
    1 комментарий
  • Разработчик на React Native — все еще frontend разработчик?

    Может ли опыт на React Native считаться одновременно опытом на обычном React? Они настолько похожи?
    Я бы сказал, процентов на 60. Там нет CSS в традиционном понимании и свои правила раскладки, но то, что касается JS вполне транслируется в браузер - архитектура приложения, паттерны React и т.п. Система сборки там тоже своя и нет заморочек браузерного рендеринга.
    Ответ написан
    Комментировать
  • Стоит ли уходить с разработки WordPress?

    OtshelnikFm
    @OtshelnikFm Куратор тега WordPress
    Обо мне расскажет yawncato.com
    Уходите.

    А вообще как один этап развития в фрилансе (в частности в вордпресс) - это уход от фриланса как такового в сторону пассивного дохода: блогеры, курсы, менторство, премиум решения (уход на энвато, кодеселлер в рунете).
    Уход вообще из рунета. Но скиллы вы понимаете какие там должны быть?

    Ну или развитие своей площадки - многие авторы не продают на чужих площадках свои решения, а делают это через свои сайты. Но тут придется решить множество вопросов:
    - это ИП или иное оформление. Но выйти из тени придется.
    - прием платежей на своем сайте
    - создание своей ТП
    - магазина
    - решить вопрос с лецинзированием и ключами для своих премиум решений (защищать придется вам), их обновлением
    - продумать систему продаж. Маркетинг.

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

    В фрилансе перегорают почему? Потому что надо искать заказ, снова общаться с заказчиками (жрать хочется - поэтому многие за сложных клиентов борются) узнавая т.з. (а иногда выбивая т.з.) - это психологически сложно. Это иногда долго по времени и вот только потом начинаешь работать. Хорошо если проект не стандартный, а если типовой сайт/магазин/элементор (материться нельзя) - это тоска. И ты понимаешь что живешь день за днем как в дне сурка. Дне. Дно... Всё - мотивация ушла, депрессняк.

    Поэтому бросайте заниматься ерундой - и если скиллы есть - ищите уникальную нишу. Рынок переполнен типовыми исполнителями - докажите что вы круче. А для этого вы должны выделяться и в вас должно быть что-то что выделяет вас выгодно от других.
    Ответ написан
    3 комментария
  • Оценка своего уровня. Как улучшить код?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Используйте const вместо let для определения переменных которые не переопределяются в коде. Это помогает снизить когнитивную нагрузку с человека читающего код и негласный стандарт в React разработке.

    2. Такие вещи как globalStyles и конфигурацию store лучше вынести в отдельные файлы. Они могут со временем хорошо разрастись.
    По поводу globalStyles, вы вообще можете вынести их в отдельный css файл.

    3. Вместо:
    {
      isModal
      ? <Route path="/auth" component={AuthPopup} />
      : null
    }

    лучше:
    {isModal && <Route path="/auth" component={AuthPopup} />}


    4. Вместо:
    function mapDispatchToProps(dispatch) {
        return {
            autoLogin: () => dispatch(autoLogin()),
            getBrowser: () => dispatch(getBrowser()),
            getMedia: () => dispatch(getMedia())
        }
    }


    лучше:
    const mapDispatchToProps = {
      autoLogin,
      getBrowser,
      getMedia,
    };


    5. Точки с запятыми в конце то есть, то нет. Определитесь и приведите код к одному виду.

    6.
    & label {}
    & input {}
    & span {}

    Это не очень хороший подход. Во-первых ваши стили не изолированные, что может приводить к неожиданным результатам. Во-вторых у вас очень много дублирования стилей. Определите Input и Label как базовые компоненты и используйте в разных местах, то же с остальным если есть.

    7. Почему папка со страницами называется Containers? Дань бойлерплейтам?

    8. Использование trailing comma является хорошей практикой.

    9.
    import {combineReducers} from 'redux';
    import photoReducer from './photoReducer';
    import authReducer from './authReducer';
    import globalReducer from './globalReducer';
    
    export default combineReducers({
        photoReducer, authReducer, globalReducer
    })


    Все таки приятней работать с хранилищем в котором ключи не имеют в названии слова reducer:
    import {combineReducers} from 'redux';
    import photo from './photoReducer';
    import auth from './authReducer';
    import global from './globalReducer';
    
    export default combineReducers({
      photo, 
      auth,
      global,
    });


    10. Забудьте вообще, что в языке есть возможность использовать вложенный тернарный оператор:
    return e === 'invalid-email' ? 'Неверно указан e-mail'
        : e === 'user-not-found' ? 'Указанный e-mail на найден'
        : e === 'wrong-password' ? 'Неверный пароль'
        : e === 'email-already-in-use' ? 'Указанный e-mail уже используется'
        : e === 'network-request-failed' ? 'Нет подключения к интернету'
        : e === 'operation-not-allowed' ? 'Произошла ошибка, попробуйте снова'
        : e === 'popup-closed-by-user' ? 'Окно авторизации закрыто пользователем'
        : e === 'account-exists-with-different-credential' ? 'Аккаунт уже существует с другими данными, используйте другой способ авторизации'
        : e

    Это одна из самых худших практик в JavaScript разработке. Тут лучше подойдет конструкция switch case

    11. Константы actionTypes лучше вынести в папку constants и разложить по разным файлам, иначе со временем у вас там будет свалка.

    12. Вместо:
    import {SET_ACTIVE, CHANGE_VALUE, SET_DEFAULT, UPLOAD, UPDATE_IMAGE, SET_IMAGE_ERROR, SET_LIKE, SET_COMMENT, ADD_ARTICLE_SUCCESS, FETCH_ARTICLES_START, FETCH_ARTICLES_SUCCESS, FETCH_ARTICLES_ERROR} from '../actions/actionTypes';

    Лучше:
    import {
      SET_ACTIVE,
      CHANGE_VALUE,
      SET_DEFAULT, UPLOAD,  
      UPDATE_IMAGE,
      SET_IMAGE_ERROR,
      SET_LIKE,
      SET_COMMENT,
      ADD_ARTICLE_SUCCESS,
      FETCH_ARTICLES_START,
      FETCH_ARTICLES_SUCCESS,
      FETCH_ARTICLES_ERROR,
    } from '../actions/actionTypes';


    13. Попробуйте внедрить библиотеку reselect. И для получения значения из store вместо записи вида:
    function mapStateToProps(state) {
        return {
            browser: state.globalReducer.browser
        }
    }


    использовать селектор:
    const mapStateToProps = state => ({
      browser: browserSelector(state),
    });
    Ответ написан
    12 комментариев
  • Как отправить картинку методом POST после вставки картинки через ctrl+v?

    Jhon_Light
    @Jhon_Light Автор вопроса
    Пришел к такому выводу
    $(document).ready(function(e) {
    	
          // показываем картинку. Отменяем события для формы
      	var port = $('.port').css('display','none');
    	$("#text").change(function () {
    		$('#sendFormNews').submit(function(){return false;});
    		port.css('display','block');
    		$('.uploadIcon').css('display','none');
    	});
    });
    // вешаем слушателя
    window.addEventListener('load', function(e) {
            // откуда пришла картинка
    	let input = document.querySelector("#text");
            // где показать
    	let windowPrevImg = document.querySelector('#image_upload_preview');
    	// наша форма для отправки
    	let sendFormNews = document.getElementById('sendFormNews');
    
            // функция для страховки
    	function uploadPasteImage()
    	{
               // еще один слушатель - вешаем на submit - валидим форму один словом. (у меня аякс валидация выше)
    	    sendFormNews.addEventListener('submit',(e) => {
               // конвертим нашу строку base64 - говорим что это файл
    	    function dataURLtoFile(dataurl, filename) {
    		    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
    		    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    		    while(n--){
    		        u8arr[n] = bstr.charCodeAt(n);
    		    }
                        //отдаем результат
    		    return new File([u8arr], filename, {type:mime});
    		}
                    // вытягиваем base64 с картинки/прелоада 
    		var pasteImage = windowPrevImg.getAttribute('src');
                    // скармливаем функции да бы получить нужный нам файл да бы обьяснить серверу что это файл
    		var file = dataURLtoFile(pasteImage, input.value);
    		
                   // юзаем FormData https://developer.mozilla.org/ru/docs/Web/API/FormData
                   // в качестве аргумента передаем нашу форму
    		var fd = new FormData(sendFormNews);
                  // ищем нужное нам поле в форму и передаем туда наш полученный файл, который мы получили ранее
    		fd.append('News[image]',file);
                   // дальше дело техники
                    // вызываем
    		var request = new XMLHttpRequest();
                    // говорим куда и как 
    		request.open("POST", window.location.href);
                   // загружаем "если" делай то то
    		request.onload = function(oEvent) {
    		window.location.replace("/cabinet/my-news");
    			} else {
    				console.log("Error " + request.status + " occurred when trying to upload your file.<br \/>");
    			}
    		};
    		// отправляем
    		request.send(fd);
    		
    		});
    		
                   // события для копирования
    		input.addEventListener("paste",function(event){
    	    let items = (event.clipboardData || event.originalEvent.clipboardData).items;
    	    for (index in items) {
    	        let item = items[index];
    	        if (item.kind === 'file') {
    	            let blob = item.getAsFile();
    	            let reader = new FileReader();
    	            reader.onload = function(event){
    	                windowPrevImg.setAttribute('src', event.target.result);
    	            }; 
    	            reader.readAsDataURL(blob);
    	            }
    	        }
    	    });	
    	}
           // инициализируем нашу функцию
    	uploadPasteImage();
    });
    Ответ написан
    Комментировать
  • Есть ли способ перевести проект с React на React Native?

    trofProg
    @trofProg
    Fullstack developer (Typescript / Python)
    Так, как вы хотите, этого сделать нельзя. Проще будет переписать проект с нуля. Все, что можно сделать в связке React/ReactNative это переиспользовать логику и то это тоже трудоемкая задача, требующая совместимости. Они почти никак не связаны. Преимущество ReactNative только в его кроссплатформенности, бюджетности и легкости вхождения, так как можно писать на js
    Ответ написан
    1 комментарий
  • Как написать большое приложение на Vue.js и не умереть?

    @ber_enot Автор вопроса
    Веб-разработчик, Vue.js / Node.js
    Спасибо всем ответившим!

    Нашел решение.
    Проблема была в конфигурации vue.config.js (использую vue-cli 3).

    Для глобальных переменных и миксинов SASS (SCSS) использовал плагин style-resources-loader.

    pluginOptions: {
        'style-resources-loader': {
          preProcessor: 'scss',
          patterns: [
            path.resolve(__dirname, 'src/scss/_variables.scss'),
            path.resolve(__dirname, 'src/scss/_mixins.scss'),
          ],
        }
      },


    Именно из-за него сборка занимала много времени. Изменение одной буквы в HTML-коде компонента приводило к пересборке всех компонентов, использующих SCSS.

    Решение проблемы:
    1. npm remove style-resources-loader
    2. удаление из конфига кода (см. выше)
    3. добавление в конфиг кода:
    css: {
        loaderOptions: {
          sass: {
            data: `
              @import "@/scss/_variables.scss";
              @import "@/scss/_mixins.scss";
            `,
          }
        }
      },


    Результат:
    DONE Compiled successfully in 1704ms 15:06:07
    App running at:
    - Local: localhost:8080
    Ответ написан
    Комментировать