Bendrinti naudojant


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 formų kūrimą siekiant efektyvumo ir produktyvumo ieškokite produktyvių pagrindinių formų kūrimas modeliu pagrįstose 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 tuo metu, kai atidaromas antrinis skirtukas per vartotojo sąveiką arba iškviečiant 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: Produktyvių pagrindinių formų kūrimas modeliu pagrįstose 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 parametro parinktį rodyti formą naujame lange. Nenaudokite šio parametro arba nustatykite jį kaip klaidingą. Nustačius jį į klaidingą, bus užtikrinta, kad openForm metodas atlieka numatytąjį formos rodymo veiksmą naudojant esamą langą. Taip pat galima tiesiogiai iškviesti window.open "JavaScript" funkciją iš pasirinktinio scenarijaus ar kitos programos; tačiau to taip pat reikėtų vengti. 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 palaiko asinchroninio kodo, pvz., formos OnLoad ir formos OnSave įvykių, laukimą, įvykių tvarkytojai turėtų grąžinti a Promise , kad platforma lauktų, kol bus išspręsta. Promise Kol vartotojas lauks, kol įvykis bus baigtas, platformoje bus rodoma tinkama UI.

Įvykiams, kurie nepalaiko asinchroninio kodo laukimo, pvz., formos OnChange įvykiui, galite naudoti sprendimą, kad sustabdytumėte sąveiką su forma, kol kodas atlieka asinchroninę užklausą naudodami 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

Forma OnLoad ir OnSave įvykiai palaiko prižiūrėtojus, kurie grąžina pažadus. Į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, įsivaizduokite, kad yra forma, kuri reikalauja duomenų iš nustatymų lentelės. Pagal parametrų lentelės duomenis forma gali pasirinkti paslėpti formos skyrių. Tokiu atveju "JavaScript" gali talpykloje saugoti duomenis sessionStorage , kad duomenų būtų prašoma tik vieną kartą per seansą (onLoad1). Pasenusio pakartotinio patvirtinimo strategija taip pat gali būti naudojama, kai "JavaScript" naudoja duomenis iš sessionStorage ir prašo duomenų kitai formos naršymo naršymui (onLoad2). Galiausiai, dublikatų šalinimo strategija gali būti naudojama tuo atveju, jei tvarkytojas iškviečiamas 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 prašę vartotojo saugos vaidmenų į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ą, skirtą tik formoms A ir B formai, jis neturėtų būti įtrauktas į biblioteką, kuri įkelta į C formą. Jis turėtų būti savo bibliotekoje.

Venkite įkelti bibliotekas tuo atveju, OnLoad jei jos naudojamos tik įvykiams ar OnChange įvykiams OnSave . Vietoj to įkelkite juos į šiuos įvykius. Taip platforma gali užkrauti jas tol, kol įkeliama forma. Daugiau informacijos: Formos 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 visus įvykių klausytojus ir prenumeratas, ypač jei tai yra window objekte.
  • Išvalykite visus laikmačius kaip setInterval.
  • Stenkitės nenaudoti, apribokite ir išvalykite nuorodas į visuotinius arba statinius objektus.

Pasirinktinių valdymo komponentų valymą galima atlikti sunaikinimo metodu.

Norėdami gauti daugiau informacijos apie atminties problemų sprendimą, eikite į šią "Edge" kūrėjo dokumentaciją.

Į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 našumo įž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 modeliu pagrįstoms programoms patvirtinti 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ų tikrintuvo naudojimas sprendimo komponentui diagnozuoti (peržiūra)

Paskesni veiksmai

Kurkite produktyvias pagrindines formas modeliu pagrįstose programose