Pull to refresh
14
0
Send message

Светлое будущее гибридной разработки на JS для меня выглядит так:


  • TypeScript как язык (статический анализ это круто)
  • Redux and friends для управления состоянием (помойка документации, примеров, best-practice и инструментов разработчика). На нем пилим ядро бизнес-логики, framework-agnostic
  • React-native для мобильных устройств.
  • your-framework-of-choice для фронта, с поддержкой серверного рендеринга.

Есть пара сравнительно крупных проектов на Ionic 1, в каждом около ~20 cordova-плагинов, push-уведомления, universal links.
Впечатления плохие.
Во втором чуть получше — без digest-циклов, человеческий роутер, но все те же лагающие события, запинающиеся анимации.
Писать на cordova новый проект не хочется, это постоянная боль.


У RN свои приколы, конечно, но с ними можно мириться, в конце концов переписать лагающие компоненты на натив.

К пункту 4:
file-loader позволяет передать свой собственный publicPath через параметры, отличный от того, что в output. Таким образом можно все картинки в production-режиме закинуть на отдельный сервер.
Более того, в качестве publicPath можно даже функцию передать, чтобы динамически url генерить.
Отсюда совет — читайте исходники лоадеров, в них много всего интересного.
Жаль, что не рассказали относительно того, как именно вы версионируете API на уровне кода.
Под каждую версию API держите свою ветку?
Или поддерживаете все версии внутри одной кодовой базы?
Какая у вас основная специфика работы? Frontend / backend? Как долго вы с Ангуляром знакомы? Судя по вашим эмоциям относительно Ангуляр 2 вы с первым не работали.
Потому что шаблоны в ангуляре декларативные.
Можно еще вот так делать. Что, кстати, и рекомендует делать автор bluebird, из-за преемственности со стандартным try-catch потоком.
.then(function() { 
  throw "Error";
})
.catch(function() {
  return "Fallback";
})
.then(function(result) { 
  console.log(result);
  // Получаем fallback
});
Да, на пару дней опоздала новость, но рад, что таки появилась! Жду не дождусь раскидаться с задачами чтобы плотно свои руки наложить на бету.
Расскажите лучше, как собирать пакет с приложением, использующим нативные плагины.
Делал утилиту для просмотра точек на карте Google Maps, точки грузил из SQLite. Для SQLite расширение собирается через node-gyp, вот я, помню, попрыгал. Слава богу нужно было только под одну платформу.
Еще интересный вопрос — есть у вас 10 вендорных библиотек. В каждой по css-файлу. В каждом css-файле ссылки на изображения и шрифты. Где-то шрифты лежат в ../fonts, где-то в ./fonts, где-то прямо в ./, то же самое с картинками.
Как будете собирать весь вендорный css в один файл, чтобы пути не поломать?
Ок, а что будет происходить, если вы файл удалили? Сначала собрали с ним, потом решили переименовать. Или совсем он вам не нужен. Что будет в этом случае?
gulp.watch при изменении любого файла будет полностью пересобирать скрипты. При 2-х файлах это нормально. А если файлов 100? А если каждый из них прогоняется через babel? Инкрементальная сборка маст хев.

livereload стили применяет также с перезагрузкой страницы? Применение новых стилей без перезагрузки страницы маст хев.

И да, пересаживайтесь на webpack (говорю, как человек, который долгое время сидел на gulp)
Возможно это мне так запомнилось. Но ООП и Ruby по сравнению с ФП там с гулькин нос.
По функциональному программированию в целом на Coursera есть прекрасный курс Programming Languages.
Его огромное преимущество в том, что он не учит какому-то конкретному языку, а в большей степени посвящен концепциям (иммутабельность, pattern matching, каррирование и.т.д) функциональных языков и почему это хорошо.
В качестве основного языка там используется ML, полученный опыт легко переносится на любой функциональный язык.
К сожалению свежих сессий не предвидится, но я нашел канал на ютубе, где выложены все лекции. www.youtube.com/channel/UCzMlECXd856E028HnSYExOQ
Также на github можно легко найти репозиторий с домашними заданиями.
Модели ($scope) в AngularJS работают через dirty-checking. Это одна из причин, почему его так любят лишний раз пнуть.
В Angular2 будет поддержка реактивности и иммутабельных данных.
Это фишка ngAnnotate плагина. Он есть, в том числе, в виде процессора browserify.
Я у себя классы сделал как-то так:
export default class Injectable {
  constructor ($injector){
    this._$injector = $injector;
  }

  di (){
    var args = _.map(arguments, _.clone);

    if(args.length == 1){
      return this._$injector.get(args[0]);
    }

    if(args.length > 1){
      return _.map(args, function(arg) {
        return this._$injector.get(arg);
      }, this);
    }
  }
}

export default class NgController {
  constructor ($scope, $injector){
    this._scope = $scope;
    this._$injector = $injector;

    this.log = this._$injector.get('$log');
  }

  /**
   *
   * @returns {...String} dependency
   */
  di (dependency){
    var args = _.map(arguments, _.clone);

    if(args.length == 1){
      return (this._resolves.hasOwnProperty(args[0]) && this._resolves[args[0]]) ||
        this._$injector.get(args[0]);
    }

    if(args.length > 1){
      return _.map(args, function(arg) {
        return (this._resolves.hasOwnProperty(arg) && this._resolves[arg]) ||
          this._$injector.get(arg)
      }, this);
    }
  }

  /**
   * @param {String} dependency
   */
  resolve (dependency){
    return this._$injector.get('$state').$current.locals.globals[dependency];
  }
}



Использую так:
export default class MyController extends NgController {
  /** @ngInject */ constructor($scope, $injector) {
    super($scope, $injector);
    var [MyService1, MyService2] = this.di('MyService1', 'MyService2');
    MyService1.doSomething();

    var data = this.resolve('preloaded'); // Вытаскивает данные resolve-секции роутов. Использую ui.router
  }
}


Все-таки основное преимущество классов в ES6 это как раз наследование без костылей, не использовать его как минимум странно.
Именно поэтому сервисы я не стал делать классами — попробовал, да мороки больше, не возникало кейсов, где их надо наследовать.

P.S. Ну и ngAnnotate наше все, прекрасно работает с /** @ngInject */ constructor() {}
Платформа для создания многоплатформенных приложений.

Это BaaS обычный.
Версия с поддержкой ngModel. Писал навскидку, мог где-то ошибиться.
Также поддержка интерполяции внутри атрибута и сохранение в куку, только если введенный текст — email.

(function() {
    var app = angular.module('habr-demo-app', []);
    
    app.directive('habrRememberInCookie', habrRememberInCookie);
    
    function habrRememberInCookie($interpolate) {
        function link(scope, element, attrs, ngModel) {
            var cookieName = $interpolate(attrs.habrRememberInCookie)($scope); 
            if(ngModel) {
                if(!ngModel.$viewValue) {
                    ngModel.$setViewValue($.cookie(cookieName));
                }
                ngModel.$viewChangeListeners.push(function(value) {
                    if(!ngModel.$error.email){
                        setCookieValue(value);    
                    }
                }); 
                 
                return;  
            }

            if(!element.val()) {
                var savedValue = $.cookie(cookieName);
                element.val(savedValue);
            }
            
            element.on('change', function(event) {
                var newValue = element.val();
                setCookieValue(newValue);
            });
            
            function setCookieValue(value) {
               $.cookie(cookieName, value, {expires: 360}); 
            } 
        }
        return {
            restrict: 'A',
            require: '?ngModel',
            link: link
        };
    }
})();
Некисло, быстрее Go, на уровне Rust. Спасибо за ссылку!

Information

Rating
Does not participate
Registered
Activity