Ответы пользователя по тегу JavaScript
  • Почему использование $parse не рекомендуется в angularjs?

    @bromzh
    Drugs-driven development
    Может потому что это и есть почти тоже, что и eval? Следовательно нужно тщательно проверять входные параметры. А ты сразу вызываешь её от значений атрибутов, даже не проверив их ни на что. Ну и отслеживать ошибки в таких штуках крайне сложно.

    habrahabr.ru/post/244001/#comments
    Ответ написан
    1 комментарий
  • Какой MV*(js) фреймворк выбрать для конкретной задачи?

    @bromzh
    Drugs-driven development
    Да почти любой подойдёт. Возможно даже хватит библиотеки типа бекбона.
    Выбери наиболее популярный, с хорошими доками и крупным сообществом. Можешь тут посмотреть.

    Я бы взял ангуляр, потому что хорошо его знаю. Да, возможно будет оверхед, так как часть функций не будут использоваться. Но с другой стороны, приложение будет легко расширить в дальнейшем.
    Ответ написан
  • Как анимировать часы на главной странице?

    @bromzh
    Drugs-driven development
    Например momentjs.com
    Смотри исходники, подстраивай под себя.
    Ответ написан
    1 комментарий
  • Как вы храните разные gulp/grunt таски?

    @bromzh
    Drugs-driven development
    посмотри как генератор gulp-angular-generator хранит таски. Очень удобная и гибкая структура.
    Пощупать можно так:
    npm install -g yo gulp bower
    npm install -g yo gulp bower
    mkdir test
    cd test
    yo gulp-angular

    В папке gulp таски, разбитые по файлам. В Gulpfile подцепляются автоматом все файлы из папки gulp.
    Ответ написан
    Комментировать
  • Что лучше использовать async.js или promise?

    @bromzh
    Drugs-driven development
    Чисто промисы - это та же лапша, только в профиль. Ну только вложенность уменьшается. Генераторы и yield выглядят получше.

    Так же, где применим yield помимо асинхронного кода?
    Там, где нужны генераторы
    Ответ написан
  • Как вы организуете JS код в энтерпрайзе?

    @bromzh
    Drugs-driven development
    requirejs

    PS ответ к комменту:

    >Но весь js размазан по сотне тысяч строк html-файлов
    Нет, у нас ангуляр, только 1 html. Но если код так размазан - то это плохая архитектура всего приложения, надо что-то менять. Например, не стоит писать часть js в html, а часть в файлах. Оставить только отдельные js-файлы. Серверные вставки заменить на обращение к АПИ. Разбивать всё на компоненты так, чтобы каждый компонент был в своей папке вместе с его стилями, скриптами и статикой (картинки, шрифты). Собирать всё каким-нибудь сборщиком (Gulp, например). Тогда бардак уменьшится на порядки.

    >Как поддерживать работоспособность, когда часть кода уже в модулях, а часть — нет?
    Очень просто, надо описывать не amd-файлы в блоке shim в настройках requirejs. За подробностями - в доки.
    Ответ написан
  • Как передать значение с JQuery в AngularJS?

    @bromzh
    Drugs-driven development
    Если используешь ангуляр, то забудь про jquery. Напиши на ангуляре сервис, через $http отправляй/получай данные. Либо откажись от ангуляра и используй только jquery с чем-то другим. Текущий вариант - ненужные костыли.
    Ответ написан
    Комментировать
  • Сервисы визуализации взвешенных графов?

    @bromzh
    Drugs-driven development
    d3js.org
    Пример: mbostock.github.io/d3/talk/20111116/force-collapsi...
    Немного не то, но можно подстроить
    Вообще, примеров там куча
    Ответ написан
    Комментировать
  • Выбор языка для web разработки(real time). Какой вы посоветуете?

    @bromzh
    Drugs-driven development
    Real-time - это, наверное, long-polling, когда сервер и клиент подолгу держат соединение открытым, в противовес обычному вебу, где 1 запрос открывает соединение, ждёт ответа и сразу закрывает его. Для этого обычно используют многопоточные и/или асинхронные штуки.
    Со стороны клиента это реализуется через WebSocket (современный вариант), либо другими хитрыми методами. Протокол websocket поддерживают многие браузеры, однако есть SockJS, который в случае чего прозрачно меняет протокол на другой доступный. Там же есть ссылки на реализацию этого протокола для других языков.
    Со стороны сервера:
    Для питона - это tornado и asyncio (только для 3-й ветке, включён в стандарт). Можно писать в коллбечном стиле, можно в обычном с использованием корутин (сопрограмм). Tornado умеет sockjs, вебсокет есть для обеих вариантов.
    Java сама по-себе многопоточна, поддержка websocket включена в стандарт JavaEE. Помимо этого есть решения для спринга. Это удобно, потому что нужен всего 1 фреймворк и для обычной части сайта (если такая есть), и для его асинхронной части. Есть очень производительный сервер netty с неблокирующим вводом-выводом и апи к нему.
    И т.д.
    В принципе, почти для каждого языка есть свой неблокирующий сервер и фреймворк к нему. Просто смотри на тот язык, который удобнее и для которого есть большая инфраструктура.
    Ответ написан
    Комментировать
  • Можно ли прицепить протокол шифрования Павла Дурова в Telegram к Web сайту?

    @bromzh
    Drugs-driven development
    SSL, WSS (для вебсокетов)
    Этого хватит для 95% случаев.
    Ответ написан
    Комментировать
  • Где и как можно обучиться ООП по простому, желательно для web-оринтирования?

    @bromzh
    Drugs-driven development
    То MVC, которое в вебе - это неправильное MVC, там, например, модели не оповещают представления, как должны. Это по-хорошему надо называть MVP.
    Да и понятие ООП тоже сильно размыто. Реальное ООП - это smalltalk, а не то что в пхп или яве.

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

    @bromzh Автор вопроса
    Drugs-driven development
    Спасибо за ответы, они навели на решение. Сделал так:

    За основу взял структуру проекта, которую генерит generator-gulp-angular.
    В корне создал папку config, в которой лежат json-файлы с настройками. В default.json описаны всевозможные настройки. В других файлах достаточно лишь переопределить нужное поле:
    // config/default.json
    {
      "api": {
        "scheme": "http",
        "host": "localhost",
        "port": 8080,
        "root": "/api/v1/"
      }
    }
    // config/prod.json
    {
      "api": {
        "host": "example.com"
      }
    }
    // config/dev.json
    {}

    Файл local.json добавлен в гитигнор, но его можно использовать (если он есть).

    Далее, написал задачу для gulp, которая в зависимости от окружения генерирует с помощью gulp-ng-config js-файл с ангуляровским модулем:
    // gulp/config.js
    'use strict';
    
    var gulp = require('gulp');
    var gutil = require('gulp-util');
    var cjson = require('cjson');
    var b2v = require('buffer-to-vinyl');
    var gulpNgConfig = require('gulp-ng-config');
    
    module.exports = function (options) {
      function p(name) {
        return [options.config + '/default.json', options.config + '/' + name + '.json'];
      }
    
      gulp.task('config', function () {
        var env = gutil.env.env || 'dev'; // получаем имя окружения через значение аргумента командной строки, или выставляем его равным dev, если ничего не передавалось
        var config = JSON.stringify({
          config: cjson.load(p([env]), true) // Загружаем json'ы, сливая их в 1 объект
        });
    
        return b2v.stream(new Buffer(config), 'config.js') // создаём поток из строки
          .pipe(gulpNgConfig('lemonfront.config', { // генерим по JSON'у ангуляровский модуль
            createModule: false
          }))
          .pipe(gulp.dest(options.tmp + '/serve/app/')); // и записываем во временную папку
      });
    }

    Эта задача стоит в зависимостях у другой (script) и генерит такой файл:
    // .tmp/serve/app/config.js
    angular.module('app.config')
      .constant('config', {
        "api": {
          "scheme": "http",
          "host": "localhost",
          "port": 8080,
          "root": "/api/v1/"
        }
      });


    Далее, добавил этот скрипт в список для инъекции в html. В index.js определил сам модуль и добавил его в зависимости всего проекта, чтобы любой дочерний модуль имел доступ к этим настройкам:
    // src/app/index.js
    angular.module('app.config', []);
    angular.module('lemonfront', [
      'ngAnimate',
      'ngCookies',
      'ngSanitize',
      'ui.router',
    
      'app.config',
      'app.core'
    ]);

    В ангуляре теперь достаточно внедрить config:
    angular.module('...', [])
    .factory(SomeService, ['config', function (config) {
      console.log(config.api.host);
    }]);

    А выбор конфига идёт через аргумент при запуске gulp:
    gulp build --env=prod
    Ответ написан
    Комментировать
  • Альтернатива Browsersync для Gulp?

    @bromzh
    Drugs-driven development
    Порой бывает сложно настроить гулп в связке с этой штукой. Советую поставить yeoman, поставить генератор для него (generator-gulp-angular или generator-gulp-webapp) и посмотри как там всё настроено. Имхо, browsersync - лучшее из всех подобных для разработки фронтенда.
    Ответ написан
    1 комментарий
  • А каким способом Ты организуешь динамическую форму?

    @bromzh
    Drugs-driven development
    json-schema
    Ответ написан
    Комментировать
  • Как устроен AngularJS?

    @bromzh
    Drugs-driven development
    Конкретно скобки скорее всего парсятся регуляркой. Всё, что между них разбивается на токены (там ведь может быть не только простой вывод переменной. а целые выражения) и обрабатывается по сложной логике, учитывая всякие окружающие scope`ы, data binding-и, внедрённые зависимости в контроллер и т.д.
    Ответ написан
    6 комментариев
  • По каким материалам Вы поняли парадигму ООП в JavaScript?

    @bromzh
    Drugs-driven development
    javascript.ru/tutorial/object/inheritance
    + много практики
    Ответ написан
    Комментировать
  • Как правильно работать с чекбоксами в angular?

    @bromzh
    Drugs-driven development
    Комментировать
  • Взаимозаменяем ли switch с if в JavaScript?

    @bromzh
    Drugs-driven development
    switch - это частный случай if-else (т.е. свитч можно на иф заменить, а обратно не всегда)
    В питоне, например, свитча нет вообще, и отсутствие его не замечается.
    Ответ написан
    1 комментарий
  • Чем плох ajax чат?

    @bromzh
    Drugs-driven development
    Подумай, как в случае с AJAX сервер будет отдавать сообщения.
    В случае с websocket всё просто: список подключённых пользователей известен. Подключился новый пользователь, на сервере вызвался callback, соединение создалось и добавилось в список всех соединений. При получении сообщения от клиента сервер просто пройдёт в цикле по этому списку соединений, отправит данные и забудет про них. Пользователь отключился, вызвался callback, соединение удалилось из списка на сервере.

    А как в случае AJAX? Сервер не знает, сколько пользователей активно в данный момент. Клиент отправил запрос, создалось соединение, запрос пришёл на сервер, сервер ответил на него, соединение разорвалось. Если юзер уйдёт с сайта, то сервер просто не будет получать запросы. Как он определит, ушёл ли юзер или просто таймаут ещё не сработал? Можно, конечно, на сервере хранить список с пользователями, которые что-то прислали и раз в N секунд выкидывать протухших. Но это дополнительная нагрузка на серв, который и так будет нагружен огромным количеством периодических запросов (выгоднее держать 1000 открытых соединений, чем раз в секунду открывать и закрывать по тысячи соединений).
    Вот тебе ещё простой пример: есть 3 пользователя. Один ничего не пишет и каждые 3 секунды отправляет запрос на получение сообщений. 2 других каждые полсекунды отправляют сообщения. Сервер может только догадываться, в сети ли необщительный юзер, или у него таймаут не вышел. А до тех пор, он хранит все сообщения от 2-го и 3-го пользователей. Но они уже получили сообщения друг от друга, поэтому надо где-то хранить инфу для каждого пользователя, какие сообщения он уже получал, а какие - нет. Можно, конечно, и сообщения хранить только некоторое время, и отправлять на клиент всё, что есть, а уже на клиенте пропускать дубликаты. Но это, опять же, доп. нагрузка на сервер и клиент.

    В итоге, надо придумать довольно сложную логику хранения информации, которую надо отправить пользователям, да и список самих пользователей как-то хранить и мониторить. В итоге, куча малких запросов. которые будут просаживать сервер и нетривиальная система оповещений, которая, скорее всего, будет часто выдавать ошибки.
    Ответ написан
    5 комментариев
  • Как заработать на javascript библиотеке?

    @bromzh
    Drugs-driven development
    Можно сделать, как тут dhtmlx.com
    Есть урезанная версия с GPL-лицензией. Все проекты, использующие эту версию должны тоже быть GPL. Если хочется больше фич и другую лицензию - плати.
    Только в приведённом примере действительно крутая и востребованная вещь, бесплатных аналогов которой нет. Если у тебя такая же ситуация - попробуй продавать, вдруг получится.
    Ответ написан
    Комментировать