• Как правильно подключить JS файл в другом JS файле?

    @beh
    Разработчик python, javascript
    Если браузерная поддержка устроит то можно подключать через тег
    <script type="module">
    без использования бандлеров
    https://learn.javascript.ru/modules-intro
    Ответ написан
    Комментировать
  • Стоит ли использовать state, или все таки всегда хранить в redux store?

    @beh
    Разработчик python, javascript
    Возможно вам не нужен redux, статья Дэна Абрамова (создатель redux).
    Ответ написан
    Комментировать
  • Из-за Angular-шаблонизатора страницы в Гугле выглядят не читабельно. Что делать?

    @beh
    Разработчик python, javascript
    В дополнение к ответу Сергей Протько, посмотрите в сторону серверного рендеринга. Для angular 1.x существуют проекты позволяющие это делать, например: jangular
    Ответ написан
    1 комментарий
  • Стартовый шаблон для проекта react-redux?

    @beh
    Разработчик python, javascript
    Можно взять популярный - React Starter Kit, ветка feature/redux
    Ответ написан
    5 комментариев
  • Почему иммутабельные данные легче кэшировать?

    @beh
    Разработчик python, javascript
    Рискну предположить что имеется ввиду кэширование в контексте чистых функций.
    Если функция чистая то можно гарантировать при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных. А безопасно закешировать результат можно в том случае если аргументы имутабельны.

    Например у нас есть чистая функция для расчета чисел Фибоначчи, мы можем обернуть ее функцией memoize из lodash чтобы кешировать результат:
    // агрумент n является примитивом, а примитив имутабелен
    let fibonacci = _.memoize(function(n) {
      return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
    });
    
    console.time('first call');
    console.log(fibonacci(50));
    // => 12586269025
    console.timeEnd('first call');
    // => first call: 2.508ms
    
    console.time('second call');
    console.log(fibonacci(50));
    // => 12586269025
    console.timeEnd('second call');
    // => second call: 0.300ms

    codepen

    В примере выше функция принимает примитив, а он всегда имутабелен, и проблем нет.
    Теперь напишем пример где в кеширующую функцию можно подавать не имутабельные данные
    let cachedFn = _.memoize((arr) => arr.length);
    
    let arr = [1,2,3];
    console.log(cachedFn(arr));
    // => 3
    arr.push(4);
    console.log(cachedFn(arr));
    // => 3 - !!!
    console.log(cachedFn([...arr]));
    // => 4

    codepen
    Ответ написан
    Комментировать
  • Подходы тестирования асинхронного кода в javascript?

    @beh
    Разработчик python, javascript
    Можно посмотреть в сторону mocha
    Обычно используют вместе с assertion библиотекой chai
    Судя по трендам npm mocha развивается активнее Jasmine
    www.npmtrends.com/mocha-vs-jasmine-core
    Ответ написан
    Комментировать
  • Как получить список файлов который генерирует скрипт?

    @beh
    Разработчик python, javascript
    1. Можно попробовать через www.seleniumhq.org
    2. Вообще у них есть API. Запросы можно посмотреть через chrome developer tools
    Ответ написан
    Комментировать
  • Код про утечки памяти?

    @beh
    Разработчик python, javascript
    var theThing = null;
    var replaceThing = function () {
        var priorThing = theThing;
        // сохранив функцию в переменной, мы невольно сохраняем и контекст (цепочку областей видимости) 
        // в котором она была объявлена
        // т.е. в данном случае priorThing оказался в контексте unused
        var unused = function () {
            if (priorThing) {
                console.log("hi");
            }
        };
        // здесь ссылка на старый объект заменяется новым, 
        // старый объект ожидает съедения GC, 
        // unused так же отправится в пасть GC...
        theThing = {
            longStr: new Array(1000000).join('*'), 
            // ... и все бы хорошо, если бы не один нюанс который происходит здесь
            // как там пишут: both functions share the same lexical environment
            // т.е. здесь у функции будет тот же контекст что и у unused
            // потому что контекст уже пошарен при создании unused
            // т.е. ссылка на старый объект priorThing будет сохраняться 
            // в общем контексте someMethod каждый раз.
            someMethod: function () {
                console.log(someMessage);
            }
        };
    };
    setInterval(replaceThing, 1000);    // вызываем 'replaceThing' каждую секунду

    в итоге мы получаем следующую картину
    3ba7ea237ca847a380b43f7ac331ce3d.PNG
    более подробно об этой утечке info.meteor.com/blog/an-interesting-kind-of-javasc...
    подебажить пример можно здесь s.codepen.io/beholderrk/debug/jWGyaY
    Ответ написан
    2 комментария
  • Как сделать точку входа в webpack шаблон *.jade?

    @beh
    Разработчик python, javascript
    во 2-й версии html-webpack-plugin можно использовать loader-ы для шаблонов
    {
        entry: {
            application: _path + '/app/app.js'
        }
        module: {
            loaders: [{
                test: /\.jade$/,
                loader: "jade-loader"
            }]
        },
        plugins: [
            new HtmlPlugin({
                title: 'Title',
                chunks: ['application', 'vendors'],
                filename: 'index.html',
                template: path.join(_path, 'app', 'assets', 'templates', 'layouts', 'index.jade')
            })
        ]
    }
    Ответ написан
    Комментировать
  • Что эффективней: создать глобальный обьект или создавать его при каждом вызове функции?

    @beh
    Разработчик python, javascript
    можно объявить этот объект один раз и сделать его приватным
    var handler = (function() {
        var foo = {};
        return function () {
            // do something with foo
        }
    })();
    elem.addEventListener("click", handler);
    Ответ написан
    Комментировать
  • Модель взаимодействия с сервером?

    @beh
    Разработчик python, javascript
    Как я понял вам нужно сохранять состояние клиентского приложения на сервере, при любых действиях пользователя, чтобы потом это состояние восстановить например при обновлении страницы?
    Мне кажется лучше изменения над сущностью делать на клиенте, и периодически скидывать её на сервер. Такие обновления можно делать через _.debounce, т.е. накапливать изменения в состоянии за определенное время а потом сохранять его на сервере. Если пользователь будет беспорядочно тыкать во все подряд, то каждый раз дергать сервер не оптимально, лучше дернуть один раз когда он успокоится.
    Ответ написан
    Комментировать
  • Django angular coffee?

    @beh
    Разработчик python, javascript
    Мы сделали один большой проект на стеке angular + typescript, и пару мелких на angular + js. В итоге думаем отказаться от angular вообще, смотрим в сторону react на es6 через babel + сторонние библиотеки для ajax, promise, и т.д.

    Причины:
    1. Быстродействие. В нашем случае интерфейс может состоять из большого числа таблиц данные в которых непрерывно меняются (биржевые данные). Т.к. мы не можем повсеместно использовать :: (bind once) - digest цикл angular начинает сильно тормозить, интерфейс перестает быть отзывчивым. После того как рендер таблиц переписали на react (es6 через babel) все работает быстро. Весь остальной интерфейс работает через angular
    2. Чтобы реализовать некоторые вещи через angular, нужно досконально изучить как работает этот фрейморк, причем не по документации а исследуя его код. При этом получившееся решение может оказаться очень сложным для восприятия другими разработчиками. При этом те же самые вещи на React реализуются гораздо проще и понятнее, без траты времени на борьбу с фремворком.
    3. Используя React сложнее принять фиговые решения, чем если использовать angular (например в angular есть 20 способов как передать данные в директиву, когда как в react компонент он только 1). React реализует более простую и строгую концепцию нежели angular
    4. Мы видим что angular 2 совершенно не совместим с angular 1.x, и что у нас нет никаких шансов переехать, т.к. проект очень большой и никто не даст на это денег. Т.е. фактически мы будем вынуждены много лет поддерживать старую версию фреймворка на которую уже через год 2 все забьют, что удручает


    Coffescript тоже пытались использовать, но после анонса es2015 решили что не будем, т.к. все равно большая пачка фич перекочевала из кофескрипта в новый стандарт, решили использовать babel который в будущем можно будет просто отключить.

    Typescript - удобно использовать для написания библиотек, т.к. на выходе мы имеем так же .d.ts файлы которые могут использовать IDE для подсказок, так же .d.ts можно конвертнуть в jsdoc.
    Ответ написан
    Комментировать
  • Отображение при помощи Ajax в Django?

    @beh
    Разработчик python, javascript
    www.django-rest-framework.org - для построения API
    facebook.github.io/react/docs/tutorial.html - для отображения данных из API
    Ответ написан
    Комментировать
  • Можно ли в Django писать одни и те же модели для реляционных и документно-ориентированных БД?

    @beh
    Разработчик python, javascript
    Если вы используете postgres, то возможно стоит посмотреть на:
    hstorefield (можно использовать уже сейчас),
    jsonfield (ожидается в версии 1.9)
    Ответ написан
    1 комментарий
  • Для изучения какой области web-разработки нужно больше "мозгов"?

    @beh
    Разработчик python, javascript
    Наверное разница в сложности уже почти исчезла, раньше (лет 7 назад) фронт в основном представлял из себя html (и его генерацию на севрере), css, и изредка jquery.
    Сейчас фронт это большой набор разнообразных иструментов:
    * mvc фреймворки;
    * работа rest api
    * работа с websockets
    * вместо css - css3 да и сам по себе css стал "низкоуровневым" т.к. вместо него часто используют less, sass
    * вместо html - html5
    * вместо js все чаще пишут на coffee или typescript
    * для управления этим зоопарком инструментов созданы свои инструменты типа grunt, gulp, yeoman,
    * фронт теперь тоже покрывают юнит тестами используя jasmine, karma и т.п.
    Т.е. на фронте все сильно усложнилось, приходится осваивать большой стек технологий.

    Однозначно тут не ответишь, многое зависит от проекта и его потребностей.
    Ответ написан
    Комментировать