Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
Ahoj, zajímalo by mně, zda-li jde nějak "vyexportovat" (obalit do něčeho nebo tak), vlastní JS objekt, abych se vyhnul kolizi např. s objektem nebo funkcí, která se v projektu jmenuje stejně?
calendar.js function Calendar(el) { this.el = $(el); ... this.open = function() { ... }; this.close = function() { ... }; } |
||
Radek9 Profil |
#2 · Zasláno: 13. 11. 2018, 23:32:28
Kcko:
Trošku málo informací. 1) Předpokládám, že jde o webovou stránku, je to tak? 2) Používáš nějaký bundler? (Browserify, Webpack) 3) Používáš čistý JavaScript (alias ES5), nebo používáš i transpiler? (TypeScript, Babel) Pokud se chceš vyhnout kolizím objektů v globálním prostoru, tak se v zásadě používají moduly. A to buď CommonJS moduly (standard z Node.js): calendar.js function calendar(el) { ... } module.exports = Calendar index.js const Whatever = require('./calendar') const c = new Whatever() Nebo standardní ES moduly: calendar.js function Calendar(el) { ... } export default Calendar index.js import Whatever from './calendar' const c = new Whatever() Pokud to potřebuješ použít v prohlížečí, budeš potřebovat bundler. Pokud chceš použít ES moduly, tak dost pravděpodobně budeš potřebovat i transpiler (ačkoli Webpack možná už umí bundlovat i ES moduly). |
||
Kcko Profil |
Radek9:
Ahoj díky za reakci. 1) ano 2) ne 3) ano :-) Četl jsem si cosi o exportu přes NODE a knihovnu require a přišlo mi to nějaké složité. Ale je to defakto to co pišeš na konci svého příspěvku. Časem se do toho ponořím (až bude více času a chuti) a detailněji to prozkoumám. Takže to potřebuji přes něco prohnat. (Jsem z toho poslední dobou trošku znechucenej :-) ... všechno furt něčím buildit a kompilovat, slastně vzpomínám na doby, kdy jsem s webama začínal :-) ...) To je v programování framework + miliony dependecies kodování nejlépe preprocessor (SASS / LESS) JS (viz tranpilery, bundlery) taskmanagery (gulp / grunt ...) Git + CI . . . . . => web |
||
Radek9 Profil |
#4 · Zasláno: 14. 11. 2018, 10:27:38
Kcko:
Na RequireJS jsem zapomněl. To se buildit nemusí. Ale pro definici každého souboru se používá tenhle zápis: define(['./dependency1', './dependency2'], function (dep1, dep2) { return somethingToExport }) A ne každá knihovna to podporuje. Načtení hlavního modulu je pak popsáno tady: requirejs.org/docs/api.html#config |
||
Kcko Profil |
#5 · Zasláno: 14. 11. 2018, 10:30:18
Radek9:
Vím, používáme to nově na jednom projektu a občas to spíš přidělá práci než to ulehčí (některé jq pluginy nejsou napsané úplně optimálně a pak se to různě hádá nebo to prostě nefunguje). Každopádně mi to zatím stačí, až nastane vhodná konstelace, tak se k tomu zase vrátím. |
||
Keeehi Profil |
#6 · Zasláno: 14. 11. 2018, 10:40:51
Tak pokud chceš něco odstínit a chceš si to udělat ručně a ne na to používat knihovny, tak by to přece mělo stačit zabalit do anonymní funkce.
var myCalendar = (function () { function Calendar(el) { this.el = $(el); ... this.open = function() { ... }; this.close = function() { ... }; } return Calendar; })(); |
||
Radek9 Profil |
#7 · Zasláno: 14. 11. 2018, 10:59:13
Keeehi:
Tím ale úplně neřešíš jádro problému, jen ho omezíš. Pořád máš v globálním prostoru myCalendar .
|
||
Kcko Profil |
Ano, protože nevíš, jestil tam někde není "myCalendar".
Navíc jsem to myslel tak, že budu mít soubor calendar.js který bez starostí nalinkuju do projektu a budu jej moci využívat bez možnosti konfliktu. |
||
Keeehi Profil |
#9 · Zasláno: 14. 11. 2018, 15:02:52
Radek9:
To bude tím, že jsem myslel že to je cíl, že ho chce jen přejmenovat. Pokud nemá být z globálního prostoru dostupný pak stačí jen (function () { function Calendar(el) { this.el = $(el); ... this.open = function() { ... }; this.close = function() { ... }; } })(); |
||
Radek9 Profil |
#10 · Zasláno: 14. 11. 2018, 15:10:08
Keeehi:
Tady jde spíš o to přistupovat k exportům z knihoven/modulů nikoli skrze globální prostor (který je náchylný k přemazání kvůli kolizím jmen), ale skrze cestu k souborům, která bude vždy jedinečná. Pro se používají CommonJS nebo ES moduly. |
||
Časová prodleva: 5 let
|
0