<\/HEAD>
<\/P>
Na fórech se nedávno objevila otázka<\/A>, kterou jsem si myslel, že bych mohl lépe vysvětlit formou blogového příspěvku než jedinou odpovědí. Jak migrovat ze starého Dojo na moderní styl Dojo AMD?<\/EM> To je platná otázka, a s níž jsem bojoval, když bylo vydáno Dojo 1.7.<\/A> Můžete se podívat zpět na Migraci na 3.0<\/A> v dokumentaci, abyste získali představu o změnách.<\/P><\/P>
Myslím, že v této fázi lidé už vědí, že dojo.declare je nyní modul nazvaný dojo\/_base\/_declare, ale jak používat části AMD způsobuje určité zmatení.<\/P>
<\/P>
Myslím, že některé překážky jsou jen tím, že si musíte zvyknout na AMD. Měl jsem zpočátku pár momentů, kdy mi to zamotalo hlavu, protože jsem si nebyl jistý, kdy použít require<\/SPAN> nebo kdy použít define<\/SPAN> nebo jak pracovat s moduly. Moje počáteční potíže byly s requirejs a neměl jsem mentora, který by mi opravdu pomohl, ale prokousal jsem se dokumentací a příspěvky v google skupinách, abych to pochopil, takže když bylo vydáno Dojo 1.7 s AMD loaderem, byl jsem lépe připraven.<\/P><\/P>Rozložme to na nejjednodušší formu a co uvidíte ve většině příkladů na
stránkách ArcGIS Developers<\/A>.<\/P>require(["esri\/_map", "dojo\/_domReady!"], function(Map) {
var map = new Map("map", {
center: [-118, 34.5],
zoom: 8,
basemap: "topo"
});
});<\/PRE><\/P>Tady je ten obávaný require<\/SPAN> metoda. Pokud jste někdy pracovali v C++\Java nebo podobných jazycích, můžete být obeznámeni s funkcí main()<\/SPAN>. To je funkce, která nastává při spuštění aplikace, tam začíná ta zábava<\/EM>. Metoda require<\/SPAN> je hlavní funkcí AMD<\/STRONG>. Takže někde v modulech ArcGIS API pro JavaScript stažených přes CDN při přidání skriptového tagu do vaší stránky je JavaScriptový soubor nazvaný map.js<\/SPAN> ve složce nazvané esri<\/SPAN>, který vypadá takto.<\/P><\/P>define(['dependency1', 'dependency2'], function(dependency1, dependency2) {
var Map;
\/\*magické jednorožčí věci*\/
return Map;
});<\/PRE><\/P>Metoda require<\/SPAN> vyhledá tento soubor a načte ho asynchronně do vaší aplikace. Když je načtení dokončeno, funkce ve vaší aplikaci je pak zavolána a věci definující co je Map (velmi existenciální<\/EM>) jsou vráceny z funkce. Všimněte si, že tento modul má své vlastní závislosti a ve funkci jsou načteny v pořadí, v jakém jsou požadovány. TO JE DŮLEŽITÉ. Pořadí záleží<\/EM>. Tyto závislosti mohou být funkce nebo objekty či možná řetězce. Níže je diagram z mé knihy<\/A>, který vám může pomoci.<\/P><\/P>
<\/P>
<\/P>
Ve své knize používám soubor nazvaný run.js<\/SPAN>, který provádí metodu require<\/SPAN>, definující můj
dojoConfig a soubor main.js<\/SPAN>, který skutečně začíná práci. To je jen můj styl, ale není to definitivní styl.<\/P><\/P>Někteří lidé se zaseknou u použití souboru main.js<\/SPAN>, a upřímně i já zpočátku. Dobrou referencí je tutoriál Pokročilé moduly<\/A> od Dojo. Citovat důležitou část pod Konfigurací Loaderu.
- main<\EM> (volitelné, výchozí = main.js<\EM>) 😞 používá se k nalezení správného modulu k načtení pokud někdo zkusí require balík samotný. Například pokud byste chtěli require "dojo", skutečný soubor který by byl načten je "\js\dojo\main.js". Protože jsme přepsali tuto vlastnost pro balík "my", pokud někdo požádá o "my", skutečně by načetl "\js\my\app.js".Pokud bychom zkusili require "util", což není definovaný balík, loader by se pokusil načíst "\js\util.js". Vždy byste měli definovat všechny své balíky v konfiguraci loaderu.
Zde je ukázka toho, jak může vypadat jeden z mých dojoConfigs, můj vstupní bod require.
var pathRX = new RegExp(\\/\\\\[^\\\\]+$\\/)
, locationPath = location.pathname.replace(pathRX, '');
require({
packages: [{
name: 'widgets',
location: locationPath + 'js\\widgets'
}, {
name: 'utils',
location: locationPath + 'js\\utils'
}, {
name: 'app',
location: locationPath + 'js'
}]
}, ['app']);
V metodě require je první parametr objekt dojoConfig, druhý je závislost ['app'], což je můj vstupní bod. Takže podle výše uvedené dokumentace jednoduše požádáním o 'app', výchozí chování bude hledat soubor 'app/main.js'.
Pokud vám to všechno přijde stále příliš matoucí, můžete stále definovat globální objekt dojoConfig pro konfiguraci svých balíků a použít obyčejný starší příkaz require ke spuštění aplikace. Něco jako toto.
<body class=\"nihilo\">
<script>
var pathRX = new RegExp(\\/\\\\[^\\\\]+$\\/)
, locationPath = location.pathname.replace(pathRX, '');
var dojoConfig = {
async: true,
isDebug: true,
packages: [
{ name: 'xstyle', location: locationPath + '\/bower_components\/xstyle' },
{ name: 'mayhem', location: locationPath + '\/bower_components/mayhem/dist' },
{ name: 'app', location: locationPath + 'js' }
],
tlmSiblingOfDojo: false
};
</script>
<script>require(['app/start'], function() {})</script>
</body>
Doufám, že to trochu objasní některé věci.
Mnoho z toho se můžete naučit prostřednictvím dokumentace Dojo a zejména tutoriálu CDN Modules<\/A>. Tato stránka<\/A> podrobně pokrývá některé části Legacy do Modern Dojo. Zde je také průvodce migrací<\/A>. A zde je také konvertor legacy Dojo na AMD<\/A>, který můžete vyzkoušet. Nikdy jsem ho nepoužil, ale může to být dobrý výchozí bod. Pochybuji však, že bude fungovat stoprocentně se všemi Esri moduly, ale stojí za pokus.
Doufám, že to trochu pomůže těm, kteří stále bojují s migrací Legacy Dojo aplikací na moderní Dojo. Může to chvíli trvat než to všechno vstřebáte, ale nakonec to půjde. Pro více tipů a triků z geodev sledujte můj blog na adrese můj blog<\.a>.