Kurkite formas, kad būtų galima atlikti tam tikrą modelio

Norint patenkinti vartotojų pasitenkinimą, labai svarbu kurti užduotis, kurias galima greitai ir efektyviai atlikti. Modeliu pagrįstas programas galima labai tinkinti ir kurti vartotojų poreikius atitinkančią patirtį, tačiau svarbu žinoti, kaip efektyviai koduoti, kurti ir paleisti modeliu pagrįstas programas, kurios greitai įkeliamos, kai vartotojas atidaro ir naršo jūsų programoje dirbdamas su kasdiene užduotimis. Efektyvumas buvo įrodyta, kad yra pagrindinis programos dfactions, kai jis nėra optimalus efektyvumą.

Pažangios tinkinimo ir performantinės formos yra svarbūs aspektai kuriant itin efektyvias ir produktyvias formas. Be to, svarbu užtikrinti, kad kursite itin produktyvias formas naudodami geriausią vartotojo sąsajos dizaino ir išdėstymo praktiką. Informacijos apie efektyvumo ir produktyvumo formų projektavimą ieškokite Produktyvių pagrindinių formų kūrimas modeliuojamose programose.

Taip pat svarbu užtikrinti, kad vartotojai turėtų rekomenduojamus ir palaikomus įrenginius bei minimalias reikiamas specifikacijas. Daugiau informacijos: Palaikomos žiniatinklio naršyklės ir mobilieji įrenginiai

Darbas su duomenimis ir skirtukais

Šiame skyriuje aprašoma, kaip valdikliai, kurie rodo duomenis ir skirtukus, turi įtakos formos našumui.

Numatytojo skirtuko naršymas

Numatytasis skirtukas yra pirmasis išplėstinis formos skirtukas. Labai svarbus formos puslapio įkėlimo vaidmuo. Numatyta, kad atidarant įrašą visada atvaizduojami numatytojo skirtuko valdikliai. T. y. iškviečiama kiekvieno skirtuko valdiklio inicijavimo logika, pvz., duomenų gavimas.

Priešingai, kai forma iš pradžių įkeliama, antrinis skirtukas šio inicijavimo su valdikliais atlikti neatliks. Vietoj to valdiklio inicijavimas įvyksta atidarius antrinį skirtuką vartotojui sąveikaudami arba iškviesdami setFocus kliento API metodą. Tai suteikia galimybę išsausti pradinę formos apkrovą iš išslėpimo valdiklio apdorojimo: tam tikri valdikliai yra išsamūs antriniuose skirtukuose, o ne numatytame skirtuke. Todėl valdymo vietos strategija gali turėti didelį poveikį pradinės formos įkėlimo interaktyvumui. Labiau interaktyvus numatytasis skirtukas suteikia galimybę bendrai keisti svarbius laukus, sąveikauti su komandų juosta ir naršyti kitus skirtukus bei skyrius.

Visada padėkite valdiklius, kurie yra labiausiai naudojami numatytojo skirtuko viršuje. Išdėstymas ir informacija apie efektyvumą yra ne tik svarbūs, bet ir produktyvumo didinimas, kai vartotojai sąveikauja su formoje pateikiamais duomenimis. Daugiau informacijos: pagrindinių produktyvių formų kūrimas modeliuojamose programose

Duomenimis valdomi valdikliai

Valdiklius, kuriems atlikti reikia papildomų duomenų, o ne pirminiame įraše, formos interaktyvumas ir įkėlimo greitis yra labiausiai sustingęs. Šie valdikliai "fetch" duomenis iš tinklo ir dažnai apima laukimo laikotarpį (kuris vertinamas kaip eigos indikatoriai), nes duomenų perduoti gali užtrukti.

Kai kurie duomenyss valdomi valdikliai yra:

Numatytame skirtuke laikykite tik dažniausiai naudojamus šiuos valdiklius. Likę duomenų valdomi valdikliai turi būti paskirstyti antriniuose skirtukuose, kad būtų galima greitai įkelti numatytąjį skirtuką. Ši išdėstymo strategija, išsaugus, sumažina tikimybę, kad duomenys, kurie baigiasi, bus iškvietos nenaudojami.

Yra ir kitų valdiklių, kurie yra mažiau veikiami nei duomenimis pagrįsti valdikliai, tačiau, norėdami užtikrinti geriausią efektyvumą, vis tiek gali dalyvauti aukščiau pateiktoje maketo strategijoje. Šie valdikliai yra:

Žiniatinklio naršyklė

Šis skyrius apima geras praktikas, naudojamas su žiniatinklio naršyklėmis.

Neatidarykite naujų langų

Kliento openForm API metodas leidžia parametrų parinktį rodyti formą naujame lange. Nenaudokite šio parametro arba nustatykite jį kaip klaidingą. Nustačius ją kaip klaidingą, bus užtikrinta, kad metodas atliks numatytąjį openForm formos rodymo naudojant esamą langą veikimą. Taip pat galima tiesiogiai paskambinti „JavaScript" funkcijai iš pasirinktinio scenarijaus ar kitos programos; tačiau tai window.open taip pat turėtų būti išsąstas. Naujo lango atidarymas reiškia, kad visus puslapio išteklius reikia iškvietą ir įkelti iš indų, nes puslapis negali išnaudoti atminties duomenų talpyklų galimybių tarp anksčiau įkeltos formos ir formos naujame lange. Kaip alternatyvą naujiems langams atidaryti galite pasinaudoti kelių sąsijų funkcija, kuri leidžia įrašus atidaryti keliuose skirtukuose ir tuo pačiu maksimaliai padidinti kliento talpyklų efektyvumo pranašumus.

Naudokite modernias naršykles

Naudojant naujausias žiniatinklio naršykles labai svarbu užtikrinti, kad modeliu pagrįsta programa būtų vykdoma kiek įmanoma greičiau. Taip yra todėl, kad daugelį efektyvumo patobulinimų galima naudoti tik naujesnėse šiuolaikinėse naršyklėse.

Pavyzdžiui, jei jūsų organizacijoje yra senesnių, ne Iesiemsio versijų, naršyklių ir t. t., daugelio efektyvumo patobulinimų, įtaisytų į modeliu pagrįstą programą, senesnėse naršyklės versijose nebus galima, nes jos nepalaiko funkcijų, kurios priklauso nuo to, ar programa veiks greitai ir „Firefox“ sklandžiai.

Daugeliu atvejų galite tikėtis, kad page load improvements (puslapio įkėlimas) pagerėja tik pereidami prie, atnaujindami į naujausią dabartinę naršyklės versiją iš senesnės versijos arba pereidami prie modernios „Microsoft Edge“ senesnės pagrįstos naršyklės.

„JavaScript" tinkinimas

Šiame skyriuje aprašoma, kaip atlikti pažangius tinkinimus naudojant „JavaScript", kad būtų galima kurti performantingas formas ir puslapius modeliu pagrįstoje programoje.

„JavaScript" naudojimas su formomis

„JavaScript" formų tinkinimo galimybė suteikia profesionalams kūrėjams didelį lankstumo, nei atrodo ir veikia forma. Šis lankstumo naudojimas gali turėti neigiamos įtakos formos našumui. Kūrėjai, naudodami toliau nurodytas strategijas, turėtų maksimizuoti formos našumą, kai įgyvendina „JavaScript" tinkinimus.

Asinchroninių tinklo užklausų naudojimas duomenų užklausose

Užklausti duomenų asinchroniškai, o ne sinchroniškai, kai tinkinamam reikia papildomų duomenų. Įvykiams, kurie palaikomi laukiantys nesinchroninio kodo, tokie kaip OnLoad forma ir forma OnSave įvykiai, įvykio tvarkymas turėtų grįžti į Promise tam, kad platforma lauktų, kol Promise bus nustatytas. Kol vartotojas lauks, kol įvykis bus baigtas, platformoje bus rodoma tinkama UI.

Jei įvykiai nepalaiko laukimo asinchroninio kodo, pvz., formos įvykio, galite naudoti sprendimą, kad, kai kodas vykdo asinchroninę užklausą, nebegalėsite naudoti veiksmo su OnChange forma showProgressIndicator. Tai geriau nei sinchroninės užklausos, nes vartotojai vis tiek galės bendrauti su kitomis programos dalimis kaip eigos indikatorius.

Štai pavyzdys, kai sinchroninio plėtinio punktuose naudojamas asinchroninis kodas.

//Only do this if an extension point does not yet support asynchronous code
try {
    await Xrm.WebApi.retrieveRecord("settings_entity", "7333e80e-9b0f-49b5-92c8-9b48d621c37c");
    //do other logic with data here
} catch (error) {
    //do other logic with error here
} finally {
    Xrm.Utility.closeProgressIndicator();
}

// Or using .then/.finally
Xrm.Utility.showProgressIndicator("Checking settings...");
Xrm.WebApi.retrieveRecord("settings_entity", "7333e80e-9b0f-49b5-92c8-9b48d621c37c")
    .then(
        (data) => {
            //do other logic with data here
        },
        (error) => {
            //do other logic with error here
        }
    )
    .finally(Xrm.Utility.closeProgressIndicator);

Įvykio apdorojimo programoje, kuri nepalaiko laukimo asinchroninio kodo, turite būti neasveršūs, kai naudojate asinchroninį kodą. Tai ypač pasakytina ir apie kodą, kurį naudojant reikia atlikti arba tvarkyti asinchroninio kodo skiriamąją geba. Asinchroninis kodas gali sukelti problemų, jei sprendimo apdorojimo programa tikisi, kad taikomosios programos kontekstas liks toks pat, kaip pradėjus asinchroninį kodą. Jūsų kodas turi patikrinti, ar vartotojas yra tame pačiame kontekste po kiekvieno asinchroninio pasisekimo taško.

Pavyzdžiui, įvykių apdorojimo programoje gali būti kodas, kad būtų galima pateikti tinklo užklausą ir pakeisti valdiklį, kuris pagal atsako duomenis turi būti išjungtas. Prieš gavęs atsakymą iš užklausos, vartotojas galbūt sąveikavo su valdikliu arba perėjo į kitą puslapį. Kadangi vartotojas yra skirtingame puslapyje, formos kontekstas gali būti prieinamas, todėl gali atsirasti klaidų arba gali būti kitų veiksmų.

„Async" palaikymas formoje „OnLoad" ir „OnSave" įvykiai

Formos OnLoad ir OnSave įvykiai palaiko apdorojimo programas, kurios pateikia įsipareigojimus. Įvykiai lauks, kol apdorojimo programa išspręs visus jos grąžinusias sumas iki pabaigos periodo. Šį palaikymą galima įgalinti programos parametruose.

Daugiau informacijos:

Formos įkėlimo metu prašomų duomenų limitas

Užklauskite tik minimalaus kiekio duomenų, reikalingų formos verslo logikai atlikti. Talpykloje išsaugomi duomenys, kurių reikia kuo daugiau, ypač duomenims, kurie dažnai nesikeičia arba kurių nereikia keisti. Pavyzdžiui, yra forma, kuri prašo duomenų iš parametrų lentelės. Pagal parametrų lentelės duomenis forma gali pasirinkti paslėpti formos skyrių. Tokiu atveju „JavaScript" gali talpykloje naudoti duomenis, kad sessionStorage duomenys būtų prašomi tik kartą per seansą (onLoad1). Pasenusią pakartotinių duomenų strategiją taip pat galima naudoti tais atvejais, kai „JavaScript" naudoja duomenis prašydama duomenų tolesniam naršymui sessionStorage prie formos (onLoad2). Galiausiai, jei apdorojimo programa iškvieta kelis kartus iš eilės (onLoad3).

const SETTING_ENTITY_NAME = "settings_entity";
const SETTING_FIELD_NAME = "settingField1";
const SETTING_VALUE_SESSION_STORAGE_KEY = `${SETTING_ENTITY_NAME}_${SETTING_FIELD_NAME}`;

// Retrieve setting value once per session
async function onLoad1(executionContext) {
    let settingValue = sessionStorage.getItem(SETTING_VALUE_SESSION_STORAGE_KEY);

    // Ensure there is a stored setting value to use
    if (settingValue === null || settingValue === undefined) {
        settingValue = await requestSettingValue();
    }

    // Do logic with setting value here
}

// Retrieve setting value with stale-while-revalidate strategy
async function onLoad2(executionContext) {
    let settingValue = sessionStorage.getItem(SETTING_VALUE_SESSION_STORAGE_KEY);

    // Revalidate, but only await if session storage value is not present
    const requestPromise = requestSettingValue();

    // Ensure there is a stored setting value to use the first time in a session
    if (settingValue === null || settingValue === undefined) {
        settingValue = await requestPromise;
    }
    
    // Do logic with setting value here
}

// Retrieve setting value with stale-while-revalidate and deduplication strategy
let requestPromise;
async function onLoad3(executionContext) {
    let settingValue = sessionStorage.getItem(SETTING_VALUE_SESSION_STORAGE_KEY);

    // Request setting value again but don't wait on it
    // In case this handler fires twice, don’t make the same request again if it is already in flight
    // Additional logic can be added so that this is done less than once per page
    if (!requestPromise) {
        requestPromise = requestSettingValue().finally(() => {
            requestPromise = undefined;
        });
    }

    // Ensure there is a stored setting value to use the first time in a session
    if (settingValue === null || settingValue === undefined) {
        settingValue = await requestPromise;
    }
    
    // Do logic with setting value here
}

async function requestSettingValue() {
    try {
        const data = await Xrm.WebApi.retrieveRecord(
            SETTING_ENTITY_NAME,
            "7333e80e-9b0f-49b5-92c8-9b48d621c37c",
            `?$select=${SETTING_FIELD_NAME}`);
        try {
            sessionStorage.setItem(SETTING_VALUE_SESSION_STORAGE_KEY, data[SETTING_FIELD_NAME]);
        } catch (error) {
            // Handle sessionStorage error
        } finally {
            return data[SETTING_FIELD_NAME];
        }
    } catch (error) {
        // Handle retrieveRecord error   
    }
}

Vietoje užklausų naudokite kliento API prieinamą informaciją. Pavyzdžiui, užuot panaudoę vartotojo saugos vaidmenis įkeliant formą, galite naudoti getGlobalContext.userSettings.roles.

Įkelti kodą tik tada, kai to reikia

Įkeliami tiek kodų, kiek reikia konkrečios formos įvykiams. Jei turite kodą, kuris skirtas tik formai A ir formai B, jis neturėtų būti įtraukiamas į biblioteką iš formos C. Jis turėtų būti savo bibliotekoje.

Jei bibliotekos naudojamos tik OnLoad įvykyje arba įvykyje, jų neįkeliama OnChange ar OnSave. Vietoj to įkelkite juos į šiuos įvykius. Taip platforma gali užkrauti jas tol, kol įkeliama forma. Daugiau informacijos: Formų efektyvumo optimizavimas

Konsolės API naudojimo pašalinimas iš gamybos kodo

Nenaudokite konsolės API metodų, pvz., console.log, gamybos kode. Duomenų registravimas konsolėje gali gerokai padidinti atminties poreikį ir trukdyti išvalyti atmintyje esančius duomenis. Dėl to programa laikui bėgant gali sulėtėti ir galiausiai sugesti.

Venkite atminties nutekėjimų

Atminties nutekėjimai kode gali laikui bėgant sulėtinti našumą ir programa galiausiai gali sugesti. Atminties nutekėjimas įvyksta, kai programai nepavyksta atlaisvinti nebereikalingos atminties. Naudodami visus tinkinimus ir kodo komponentus savo formoje:

  • Kruopščiai apsvarstykite ir ištestuokite scenarijus, susijusius su visais elementais, kurie gali būti atsakingi už atminties valymą, pvz., klasės, atsakingos už objektų gyvavimo ciklo tvarkymą.
  • Išvalykite visas įvykio nukreipimo priemones ir prenumeratas, ypač tada, jei jie yra objekte window.
  • Išvalykite visus laikmačius, pvz.,setInterval.
  • Stenkitės nenaudoti, apribokite ir išvalykite nuorodas į visuotinius arba statinius objektus.

Naudojant pasirinktinius valdiklio komponentus, išvalyti galima naudojant sunaikinimo metodą.

Norėdami gauti daugiau informacijos apie atminties problemų sprendimą, žr. šias „Edge“ kūrėjo instrukcijas.

Įrankiai, kuriuos galite naudoti, kad būtų galima atlikti programų funkcijas

Šiame skyriuje aprašomi įrankiai, galimi padėti suprasti efektyvumo problemas ir pateikti rekomendacijų, kaip optimizuoti modelių programų tinkinimus.

Efektyvumo įžvalgos

Našumo įžvalgos yra įmonės programų kūrėjams skirtas savitarnos įrankis, analizuojantis vykdymo proceso telemetrijos duomenis ir kuriame pateikiamas rekomendacijų, padėsiančių pagerinti modelio valdomų programų efektyvumą, sąrašas. Ši funkcija pateikia su „Power Apps“ modeliu pagrįsta ar kliento įsitraukimo programa, pvz., „Dynamics 365 Sales“ ar „Dynamics 365 Service“ susijusį analizės įžvalgų kasdienį rinkinį su rekomendacijomis ir veiksmų elementais. „Enterprise" programų kūrėjai gali peržiūrėti išsamias efektyvumo įžvalgas programos lygiu „Power Apps“. Daugiau informacijos: Kas yra efektyvumo įžvalgos? (peržiūra)

Sprendimų tikrintuvas

Sprendimų tikrintuvė yra efektyvus įrankis, galinis analizuoti klientų ir serverio tinkinimus dėl efektyvumo ar patikimumo problemų. Ji gali sintaksės būdu peržiūrėti kliento „JavaScript", XML formos ir .NET serverio papildinį bei pateikti tikslinių įžvalgų, kas gali sulėtinti galutinių vartotojų srautą. Kiekvieną kartą publikuojant pakeitimus programavimo aplinkoje rekomenduojame paleisti sprendimų tikrintojas, kad prieš pasiekdami galutiniai vartotojai galėtų pasiekti visus efektyvumo patobulinimus. Daugiau informacijos: Sprendimų tikrintuvo naudojimas norint patikrinti modeliu pagrįstas programas, esančias Power Apps

Kai kurie su rezultatais susijusių problemų, kurias nustatė sprendimų tikrintojas, pavyzdžiai:

Objekto tikrintuvas

Objektų tikrintojas sprendimo komponentų objektuose realiuoju laiku vykdo diagnostiką. Jei aptinkama problemų, pateikiamos rekomendacijos, aprašančios, kaip ištaisyti problemą. Daugiau informacijos: Objektų tikrintojas naudojimas sprendimo komponentui diagnozuoti (peržiūra)

Paskesni veiksmai

Produktyvių pagrindinių formų projektavimas modeliu pagrįstose programose