Praktické Emberjs Globals pro vývoj

TL;DR

Zde je několik užitečných globálních kódů, které můžete použít v aplikaci Ember.js k rychlejšímu ladění, a to i bez inspektora ember

Pokud byste chtěli použít verzi doplňku:

ember-handy-globals

Můžete to také najít jako gist

V tomto příspěvku na blogu se dozvíte, jak přidat nějaké pěkné globální prvky, které vám pomohou při vývoji vaší aplikace Ember.js.

Jednou z věcí, díky kterým je ekosystém Ember.js hračkou, je Ember Inspector. Jako vývojáři Ember.js jej často používáme k získání aktuálního řadiče, služby, aktuálního modelu trasy nebo komponenty k jeho ladění, i když jsem se při psaní tohoto příspěvku dozvěděl několik nových věcí o inspektoru, které jsem nikdy nepoužil záložka Promises předtím 🤒, miluji to!

Ale čas od času rychlé opravy a kontroly začínají být trochu otravné. Speciálně v dlouhých relacích ladění a samozřejmě pokud máte rádi automatické ukládání souborů ve VSCode, jako já.

Čas od času také potřebujete několik žhavých objektů v konzole pro správné ladění nebo sestavení nějakého složitého objektu, takže mít $E rezervované pro konkrétní objekt inspektora není nezbytně dostačující.

Dalším dobrým důvodem je to, že někdy testujete svou aplikaci v prohlížeči, který nemá k dispozici nebo nainstalovaný ember-inspector, takže máte k dispozici sadu nástrojů, jak to zvládnout!

Zde je vynikající Intro To Ember Inspector, pokud nejste obeznámeni 😄

Jdeme na to, Global instance-initializer

Jeden ze souborů, které neustále přenáším z projektu do projektu, je takzvaný instance-initializer/globals.js

ember generate instance-initializer globals

Zde cituji aplikaci a instance Ember.js

Takže v tomto instančním inicializátoru obdržíme instanci aplikace, kterou používám k vytváření nebo odvození globálů, které mě udržují produktivní.

//instance-initializer/globals.js

export function initialize(application) {}

export default {
  name: "globals",
  initialize,
};

Nejprve bychom se mohli ujistit, že je přidáme pouze během vývoje

//instance-initializer/globals.js

export function initialize(application) {
  let { environment } = application.resolveRegistration('config:environment')
  if ( environment !== 'production') {
  }
}

export default {
  name: "globals",
  initialize,
};

Základní užitečné globální informace

//instance-initializer/globals.js

export function initialize(application) {
  let { environment } = application.resolveRegistration('config:environment')
  if ( environment !== 'production') {
    /**
      This basically exposes the application, pretty useful because
      you can use stuff like this from the console.

      App.lookup('route:some-route').actions.doSomething();
    */
    window.App = application;

    /*
      This will gives us access to the store easily, to make fast queries or checks!

      Fast and easy:
      var s = App.store.peekRecord('some-model', 1);

      App.store.createRecord('some-model', {name: 'Alberto'})

    */
    window.App.store = application.__container__.lookup("service:store");
  }
}

export default {
  name: "globals",
  initialize,
};

Poté, co jsem nějakou dobu přímo používal App.lookup(), zjistil jsem, že je to příliš časově náročné na načasování typu objektu, který jsem hledal

App.lookup("service:some-service");
App.lookup("route:some-route");

Začal jsem tedy přidávat zkratky funkcí.

//instance-initializer/globals.js

export function initialize(application) {
  let { environment } = application.resolveRegistration('config:environment')
  if ( environment !== 'production') {

   ...//to avoid making this too long

    window.App.service = function(name) {
      return application.lookup(`service:${name}`)
    }
    // or a shortcut for every ember types.

    let objects = [
      'service',
      'controller',
      'route',
      'model'
    ];

    objects.forEach(type => {
      window.App[type] = function(name) {
        return application.lookup(`${type}:${name}`)
      }
    })
  }
}

export default {
  name: 'globals',
  initialize
}

I když je to téměř stejné psaní, zaprvé je to opravdu jednodušší, ale také se automaticky doplňuje chromovaná konzole, takže výhra.

App.controller("auth.projects");
App.model("some-model");
App.route("auth.projects");

A nejnovější přírůstek, který mě vlastně donutil napsat tento blogpost, můj konečný dárek 😅.

//instance-initializer/globals.js

export function initialize(application) {
  let { environment } = application.resolveRegistration('config:environment')
  if ( environment !== 'production') {
    class CurrentContext {
      get model() {
        return application.lookup(
          `controller:${application.lookup("service:router").currentRouteName}`
        ).model;
      }
      get controller() {
        return application.lookup(
          `controller:${application.lookup("service:router").currentRouteName}`
        );
      }
      get route() {
        return application.lookup(
          `route:${application.lookup("service:router").currentRouteName}`
        );
      }
    }


    window.App.ctx = new CurrentContext(); 
  }
}

export default {
  name: "globals",
  initialize,
};

Vytvoříme tento CurrentContext třídy jen proto, abychom měli nativní getry, abychom nemuseli volat metody. Používá currentRouteName od Service Router získat aktuální model, trasu nebo řadič, takže je to v podstatě super zkratka pro rychlé ladění!

var model = App.ctx.model; //current route model!
var controller = App.ctx.controller; //current route controller!
var route = App.ctx.route; //current route route!

Co si myslíte o těchto zkratkách? Plánujete některé z nich využít? máš nějaké tajemství, které bys chtěl sdílet s komunitou #emberjs? Prosím, udělejte to!

Pokud byste chtěli použít verzi doplňku:

ember-handy-globals

Můžete to také najít jako gist