ÐÑо ÑÑководÑÑво ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð°Ñала ÑабоÑÑ Ñ Ð¼Ð¾Ð´ÑлÑми JavaScript.
ÐодÑли: иÑÑоÑÐ¸Ñ Ð²Ð¾Ð¿ÑоÑаСнаÑала пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° JavaScript бÑли неболÑÑими â в пÑежние вÑемена они иÑполÑзовалиÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð»Ð¸ÑованнÑÑ Ð·Ð°Ð´Ð°Ñ, добавлÑÑ Ð¿Ñи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи немного инÑеÑакÑивноÑÑи веб-ÑÑÑаниÑам, Ñак ÑÑо болÑÑие ÑкÑипÑÑ Ð² оÑновном не ÑÑебовалиÑÑ. ÐÑоÑло неÑколÑко леÑ, и Ð²Ð¾Ñ Ð¼Ñ Ñже видим полномаÑÑÑабнÑе пÑиложениÑ, ÑабоÑаÑÑие в бÑаÑзеÑÐ°Ñ Ð¸ ÑодеÑжаÑие маÑÑÑ ÐºÐ¾Ð´Ð° на JavaScript; кÑоме Ñого, ÑзÑк ÑÑал иÑполÑзоваÑÑÑÑ Ð¸ в дÑÑÐ³Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ (напÑимеÑ, Node.js).
Таким обÑазом, в поÑледние Ð³Ð¾Ð´Ñ Ð¿Ð¾ÑвилиÑÑ Ð¿ÑиÑÐ¸Ð½Ñ Ð½Ð° Ñо, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑмаÑÑ Ð¾ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð°Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÑогÑамм на JavaScript на оÑделÑнÑе модÑли, коÑоÑÑе можно импоÑÑиÑоваÑÑ Ð¿Ð¾ меÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи. Node.js вклÑÑал ÑакÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ñже давно, кÑоме Ñого, некоÑоÑÑе библиоÑеки и ÑÑеймвоÑки JavaScript ÑазÑеÑали иÑполÑзование модÑлей (напÑимеÑ, CommonJS и оÑнованнÑе на AMD ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð´Ñлей Ñипа RequireJS, а позднее Ñакже Webpack и Babel).
Ð ÑÑаÑÑÑÑ, ÑовÑеменнÑе бÑаÑзеÑÑ ÑÑали Ñами поддеÑживаÑÑ ÑÑнкÑионалÑноÑÑÑ Ð¼Ð¾Ð´Ñлей, о Ñем и ÑаÑÑказÑÐ²Ð°ÐµÑ ÑÑа ÑÑаÑÑÑ. ÐÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко поÑадоваÑÑÑÑ â бÑаÑзеÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾Ð¿ÑимизиÑоваÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¼Ð¾Ð´Ñлей, ÑÑо бÑло Ð±Ñ Ð³Ð¾Ñаздо ÑÑÑекÑивнее иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, и взÑÑÑ Ð½Ð° ÑÐµÐ±Ñ Ð¾Ð±ÑабоÑÐºÑ Ð½Ð° ÑÑоÑоне клиенÑа и пÑоÑие накладнÑе ÑаÑÑ Ð¾Ð´Ñ.
ÐÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ Ð¾Ð±ÑабоÑка модÑлей JavaScript ÑвÑзана Ñ Ð¸Ð½ÑÑÑÑкÑиÑми import
и export
, иÑ
поддеÑжка бÑаÑзеÑами показана в ÑледÑÑÑиÑ
ÑаблиÑаÑ
.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÑодемонÑÑÑиÑоваÑÑ Ð¸ÑполÑзование модÑлей, Ð¼Ñ Ñоздали пÑоÑÑой Ð½Ð°Ð±Ð¾Ñ Ð¿ÑимеÑов, коÑоÑÑй Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе найÑи на GitHub. Ð ÑÑиÑ
пÑимеÑаÑ
Ð¼Ñ ÑоздаÑм ÑÐ»ÐµÐ¼ÐµÐ½Ñ <canvas>
на веб-ÑÑÑаниÑе и заÑем ÑиÑÑем ÑазлиÑнÑе ÑигÑÑÑ Ð½Ð° нÑм (и вÑводим инÑоÑмаÑÐ¸Ñ Ð¾Ð± ÑÑом).
ÐÑимеÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑÑивиалÑнÑ, но они намеÑенно ÑÐ´ÐµÐ»Ð°Ð½Ñ Ð¿ÑоÑÑÑми Ð´Ð»Ñ ÑÑной демонÑÑÑаÑии модÑлей.
ÐÑимеÑание: ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе ÑкаÑаÑÑ Ð¿ÑимеÑÑ Ð¸ запÑÑÑиÑÑ Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ñно, вам нÑжно бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð¸Ñ ÑеÑез локалÑнÑй веб-ÑеÑвеÑ.
ÐÐ°Ð·Ð¾Ð²Ð°Ñ ÑÑÑÑкÑÑÑа пÑимеÑаРпеÑвом пÑимеÑе (Ñм. диÑекÑоÑÐ¸Ñ basic-modules) Ñ Ð½Ð°Ñ ÑледÑÑÑÐ°Ñ ÑÑÑÑкÑÑÑа Ñайлов:
index.html main.js modules/ canvas.js square.js
ÐÑимеÑание: ÐÑе пÑимеÑÑ Ð² ÑÑом ÑÑководÑÑве в оÑновном имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑÑÑÑкÑÑÑÑ.
ÐавайÑе ÑазбеÑÑм два модÑÐ»Ñ Ð¸Ð· диÑекÑоÑии modules:
canvas.js
â ÑодеÑÐ¶Ð¸Ñ ÑÑнкÑии, ÑвÑзаннÑе Ñ Ð½Ð°ÑÑÑойкой canvas:
create()
â ÑоздаÑÑ Ñ
олÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑиÑÐ¸Ð½Ñ width
и вÑÑоÑÑ height
внÑÑÑи <div>
-обеÑÑки Ñ ÑказаннÑм id
и помеÑÑнной в ÑодиÑÐµÐ»Ñ parent
. РезÑлÑÑаÑом вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии бÑÐ´ÐµÑ Ð¾Ð±ÑекÑ, ÑодеÑжаÑий 2D-конÑекÑÑ Ñ
олÑÑа и id обеÑÑки.createReportList()
â ÑоздаÑÑ Ð½ÐµÑпоÑÑдоÑеннÑй ÑпиÑок, добавленнÑй внÑÑÑи Ñказанного ÑлеменÑа-обÑÑÑки, коÑоÑÑй можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²Ñвода даннÑÑ
оÑÑÑÑа. ÐозвÑаÑÐ°ÐµÑ id ÑпиÑка.square.js
â ÑодеÑжиÑ:
name
â пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñо ÑÑÑоковÑм знаÑением 'square'.draw()
â ÑÑнкÑиÑ, ÑиÑÑÑÑÐ°Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð½Ð° Ñказанном Ñ
олÑÑе Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми ÑазмеÑом, положением и ÑвеÑом. ÐозвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ, ÑодеÑжаÑий ÑазмеÑ, положение и ÑÐ²ÐµÑ ÐºÐ²Ð°Ð´ÑаÑа.reportArea()
â ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑÑиÑаннÑÑ Ð¿Ð»Ð¾ÑÐ°Ð´Ñ ÐºÐ²Ð°Ð´ÑаÑа в ÑказаннÑй ÑпиÑок оÑÑеÑа.reportPerimeter()
â ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²Ñводи поÑÑиÑаннÑй пеÑимеÑÑ ÐºÐ²Ð°Ð´ÑаÑа в ÑказаннÑй ÑпиÑок оÑÑеÑа..mjs
пÑоÑив .js
Ð ÑÑой ÑÑаÑÑе Ð¼Ñ Ð¸ÑполÑзÑем ÑаÑÑиÑение .js
Ð´Ð»Ñ Ñайлов наÑиÑ
модÑлей, но в дÑÑгиÑ
иÑÑоÑникаÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вÑÑÑеÑиÑÑ ÑаÑÑиÑение .mjs
. ÐапÑимеÑ, в докÑменÑаÑии движка V8 иÑполÑзÑеÑÑÑ .mjs
. ÐÑиÑÐ¸Ð½Ñ ÑледÑÑÑие:
Тем не менее, Ð¼Ñ ÑеÑили пÑодолжаÑÑ Ð¸ÑполÑзоваÑÑ .js
, по кÑайней меÑе на даннÑм моменÑ. ЧÑÐ¾Ð±Ñ Ð¼Ð¾Ð´Ñли коÑÑекÑно ÑабоÑали в бÑаÑзеÑе, вам нÑжно ÑбедиÑÑÑÑ, ÑÑо Ð²Ð°Ñ ÑеÑÐ²ÐµÑ Ð¾ÑдаÑÑ Ð¸Ñ
Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ Content-Type
, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ JavaScript MIME type Ñакой как text/javascript
. РпÑоÑивном ÑлÑÑае Ð²Ñ Ð¿Ð¾Ð»ÑÑеÑе оÑÐ¸Ð±ÐºÑ Ð¿ÑовеÑки MIME type â "The server responded with a non-JavaScript MIME type", и бÑаÑÐ·ÐµÑ Ð½Ðµ ÑÐ¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð²Ð°Ñ JavaScript. ÐолÑÑинÑÑво ÑеÑвеÑов Ñже имеÑÑ Ð¿ÑавилÑнÑй Ñип Ð´Ð»Ñ .js
-Ñайлов, но еÑÑ Ð½Ðµ имеÑÑ Ð½Ñжного MIME type Ð´Ð»Ñ .mjs
-Ñайлов. СеÑвеÑÑ, коÑоÑÑе Ñже оÑдаÑÑ .mjs
ÑÐ°Ð¹Ð»Ñ ÐºÐ¾ÑÑекÑно, вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ GitHub Pagesи http-ÑеÑвеÑ
Ð´Ð»Ñ Node.js.
ÐÑо ноÑмалÑно, еÑли Ð²Ñ Ñже иÑполÑзÑеÑе ÑакÑÑ ÑÑÐµÐ´Ñ Ð¸Ð»Ð¸ еÑÑ Ð½ÐµÑ, но знаеÑе, ÑÑо делаÑÑ, и имееÑе нÑжнÑе доÑÑÑÐ¿Ñ (Ñо еÑÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе наÑÑÑоиÑÑ Ñвой ÑеÑвеÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑÑанавливал коÑÑекÑнÑй Content-Type
-заголовок Ð´Ð»Ñ .mjs
-Ñайлов). Ðднако ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ Ð¿ÑÑаниÑÑ, еÑли Ð²Ñ Ð½Ðµ конÑÑолиÑÑеÑе ÑеÑвеÑ, Ñ ÐºÐ¾ÑоÑого оÑдаÑÑÑÑ ÑайлÑ, или пÑбликÑеÑе ÑÐ°Ð¹Ð»Ñ Ð´Ð»Ñ Ð¾Ð±Ñего полÑзованиÑ, как Ð¼Ñ Ð·Ð´ÐµÑÑ.
Ð ÑелÑÑ
обÑÑÐµÐ½Ð¸Ñ Ð¸ пеÑеноÑимоÑÑи на ÑазнÑе плаÑÑоÑÐ¼Ñ Ð¼Ñ ÑеÑили оÑÑановиÑÑÑ Ð½Ð° .js
.
ÐÑли Ð²Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно видиÑе ÑенноÑÑÑ Ð¸ ÑÑноÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ .mjs
Ð´Ð»Ñ Ð¼Ð¾Ð´Ñлей по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¸ÑполÑзованием .js
Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
JavaScript-Ñайлов, но не Ñ
оÑиÑе ÑÑолкнÑÑÑÑÑ Ñ Ð¿Ñоблемой опиÑанной вÑÑе, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда иÑполÑзоваÑÑ .mjs
во вÑÐµÐ¼Ñ ÑазÑабоÑки и конвеÑÑиÑоваÑÑ Ð¸Ñ
в .js
во вÑÐµÐ¼Ñ ÑбоÑки.
Также ÑÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ, ÑÑо:
.mjs
, напÑимеÑ, TypeScript.<script type="module">
аÑÑибÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñого, ÑÑо Ñайл ÑвлÑеÑÑÑ Ð¼Ð¾Ð´Ñлем. ÐÑ ÑвидиÑе пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ аÑÑибÑÑа ниже.ÐеÑвое, ÑÑо нÑжно ÑделаÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑнкÑионалÑноÑÑи модÑлÑ, â ÑкÑпоÑÑиÑоваÑÑ ÐµÐ³Ð¾. ÐÑо делаеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½ÑÑÑÑкÑии export
.
СамÑй пÑоÑÑой ÑпоÑоб иÑполÑзоваÑÑ ÑкÑпоÑÑ â помеÑÑиÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ export
пеÑед лÑбÑми ÑлеменÑами, коÑоÑÑе Ð²Ñ Ñ
оÑиÑе ÑкÑпоÑÑиÑоваÑÑ Ð¸Ð· модÑлÑ, напÑимеÑ:
export const name = "square";
export function draw(ctx, length, x, y, color) {
ctx.fillStyle = color;
ctx.fillRect(x, y, length, length);
return {
length: length,
x: x,
y: y,
color: color,
};
}
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑкÑпоÑÑиÑоваÑÑ var
-, let
-, const
-пеÑеменнÑе, и â как Ð¼Ñ Ñвидим позже â клаÑÑÑ. Ðни Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð² веÑÑ
ней облаÑÑи видимоÑÑи, Ð²Ñ Ð½Ðµ можеÑе иÑполÑзоваÑÑ export
внÑÑÑи ÑÑнкÑии, напÑимеÑ.
Ðолее ÑдобнÑй ÑпоÑоб ÑкÑпоÑÑа вÑеÑ
ÑлеменÑов, коÑоÑÑе Ð²Ñ Ñ
оÑиÑе ÑкÑпоÑÑиÑоваÑÑ,â иÑполÑзоваÑÑ Ð¾Ð´Ð½Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ export
в конÑе Ñайла модÑлÑ, где ÑказаÑÑ Ð¿ÐµÑеменнÑе, ÑÑнкÑии, клаÑÑÑ, коÑоÑÑй Ð²Ñ Ñ
оÑиÑе ÑкÑпоÑÑиÑоваÑÑ, ÑеÑез запÑÑÑÑ Ð² ÑигÑÑнÑÑ
ÑкобкаÑ
. ÐапÑимеÑ:
export { name, draw, reportArea, reportPerimeter };
ÐмпоÑÑ ÑÑнкÑионалÑноÑÑи в Ð²Ð°Ñ ÑкÑипÑ
ÐоÑле Ñого, как Ð²Ñ ÑкÑпоÑÑиÑовали некоÑоÑÑе ÑаÑÑи из Ñвоего модÑлÑ, вам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ импоÑÑиÑоваÑÑ Ð¸Ñ Ð² Ñвой ÑкÑипÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ñ . СамÑй пÑоÑÑой ÑпоÑоб ÑделаÑÑ ÑÑо:
import { name, draw, reportArea, reportPerimeter } from "./modules/square.js";
ÐÑполÑзÑйÑе конÑÑÑÑкÑÐ¸Ñ import
, за коÑоÑой ÑледÑÐµÑ ÑазделеннÑй запÑÑÑми ÑпиÑок ÑÑнкÑий, коÑоÑÑе Ð²Ñ Ñ
оÑиÑе импоÑÑиÑоваÑÑ, заклÑÑÑннÑй в ÑигÑÑнÑе Ñкобки, за коÑоÑÑм ÑледÑÐµÑ ÐºÐ»ÑÑевое Ñлово from, за коÑоÑÑм ÑледÑÐµÑ Ð¿ÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ð¼Ð¾Ð´ÑÐ»Ñ â пÑÑÑ Ð¾ÑноÑиÑелÑно коÑÐ½Ñ ÑайÑа, коÑоÑÑй Ð´Ð»Ñ Ð½Ð°Ñего пÑимеÑа basic-modules
бÑÐ´ÐµÑ Ñавен /js-examples/modules/basic-modules
.
Ðднако, Ð¼Ñ Ð½Ð°Ð¿Ð¸Ñали пÑÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ инаÑе â Ð¼Ñ Ð¸ÑполÑзÑем (.
) ÑинÑакÑиÑ, ознаÑаÑÑий "ÑекÑÑÑÑ Ð´Ð¸ÑекÑоÑиÑ", за коÑоÑÑм ÑледÑÐµÑ Ð¿ÑÑÑ Ðº ÑайлÑ, коÑоÑÑй Ð¼Ñ Ð¿ÑÑаемÑÑ Ð½Ð°Ð¹Ñи. ÐÑо намного лÑÑÑе, Ñем каждÑй Ñаз запиÑÑваÑÑ Ð²ÐµÑÑ Ð¾ÑноÑиÑелÑнÑй пÑÑÑ, поÑколÑÐºÑ Ð¾Ð½ коÑоÑе и Ð´ÐµÐ»Ð°ÐµÑ URL-адÑÐµÑ Ð¿ÐµÑеноÑимÑм - пÑÐ¸Ð¼ÐµÑ Ð²Ñе Ñавно бÑÐ´ÐµÑ ÑабоÑаÑÑ, еÑли Ð²Ñ Ð¿ÐµÑемеÑÑиÑе его в дÑÑгое меÑÑо в иеÑаÑÑ
ии ÑайÑа.
Так напÑимеÑ:
/js-examples/modules/basic-modules/modules/square.js
ÑÑановиÑÑÑ
./modules/square.js
ÐÑ Ð¼Ð¾Ð¶ÐµÑе найÑи подобнÑе ÑÑÑоки кода в Ñайле main.js
.
ÐÑимеÑание: РнекоÑоÑÑÑ
модÑлÑнÑÑ
ÑиÑÑемаÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑÑÑиÑÑ ÑаÑÑиÑение Ñайла и наÑалÑнÑе /
, ./
, or ../
(напÑÐ¸Ð¼ÐµÑ 'modules/square'
). ÐÑо не ÑабоÑÐ°ÐµÑ Ð² наÑивнÑÑ
JavaScript-модÑлÑÑ
.
ÐоÑле Ñого, как Ð²Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑовали ÑÑнкÑии в Ñвой ÑкÑипÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¸Ñ
Ñак же, как еÑли Ð±Ñ Ð¾Ð½Ð¸ бÑли опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑÑом же Ñайле. СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в main.js
, ÑÑÐ°Ð·Ñ Ð·Ð° ÑÑÑоками импоÑÑа:
let myCanvas = create("myCanvas", document.body, 480, 320);
let reportList = createReportList(myCanvas.id);
let square1 = draw(myCanvas.ctx, 50, 50, 100, "blue");
reportArea(square1.length, reportList);
reportPerimeter(square1.length, reportList);
ÐÑимеÑание: ХоÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑованнÑе ÑÑнкÑии доÑÑÑÐ¿Ð½Ñ Ð² Ñайле, они доÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ. ÐÑ Ð½Ðµ можеÑе измениÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑованнÑÑ Ð¿ÐµÑеменнÑÑ, но Ð²Ñ Ð²ÑÑ Ñавно можеÑе изменÑÑÑ ÑвойÑÑва Ñ const
-пеÑеменнÑÑ
. ÐÑоме Ñого, пеÑеменнÑе импоÑÑиÑÑеÑÑÑ ÐºÐ°Ðº "live bindings" - ÑÑо ознаÑаеÑ, ÑÑо они могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ð¾ знаÑениÑ, даже еÑли Ð²Ñ Ð½Ðµ можеÑе измениÑÑ Ð¿ÑивÑзкÑ, в оÑлиÑие Ð¾Ñ const
.
Ðалее нам необÑ
одимо подклÑÑиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ main.js
на наÑÑ HTML-ÑÑÑаниÑÑ. ÐÑо оÑÐµÐ½Ñ Ð¿Ð¾Ñ
оже на Ñо, как Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑаем обÑÑнÑй ÑкÑÐ¸Ð¿Ñ Ð½Ð° ÑÑÑаниÑÑ, Ñ Ð½ÐµÐºÐ¾ÑоÑÑми замеÑнÑми оÑлиÑиÑми.
ÐÑежде вÑего, вам нÑжно добавиÑÑ type="module"
в <script>
-ÑлеменÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑÑвиÑÑ, ÑÑо ÑкÑÐ¸Ð¿Ñ ÑвлÑеÑÑÑ Ð¼Ð¾Ð´Ñлем. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ main.js
, нÑжно напиÑаÑÑ ÑледÑÑÑее:
<script type="module" src="main.js"></script>
ÐÑ Ñакже можеÑе вÑÑÑоиÑÑ ÑкÑÐ¸Ð¿Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в HTML-Ñайл, помеÑÑив JavaScript-код внÑÑÑÑ <script>
-ÑлеменÑа:
<script type="module">/* код JavaScript модÑÐ»Ñ */</script>
СкÑипÑ, в коÑоÑÑй Ð²Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑеÑе модÑлÑ, в оÑновном дейÑÑвÑÐµÑ ÐºÐ°Ðº модÑÐ»Ñ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ. ÐÑли Ð²Ñ ÑпÑÑÑиÑе ÑÑо, Ñо Firefox, напÑимеÑ, вÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ "SyntaxError: import declarations may only appear at top level of a module".
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ import
и export
инÑÑÑÑкÑии ÑолÑко внÑÑÑи модÑлей, внÑÑÑи обÑÑнÑÑ
ÑкÑипÑов они ÑабоÑаÑÑ Ð½Ðµ бÑдÑÑ.
file://
URL), Ð²Ñ ÑÑолкнÑÑеÑÑ Ñ Ð¾Ñибками CORS из-за ÑÑебований безопаÑноÑÑи JavaScript-модÑлей. Ðам нÑжно пÑоводиÑÑ ÑеÑÑиÑование ÑеÑез ÑеÑвеÑ.defer
(Ñм. аÑÑибÑÑÑ <script>
ÑлеменÑа) пÑи загÑÑзке модÑлÑ, модÑли ÑвлÑÑÑÑÑ deferred по ÑмолÑаниÑ.<script>
ÑÑгаÑ
.ÐкÑпоÑÑÑ ÑÑнкÑий и пеÑеменнÑÑ
, коÑоÑÑе Ð¼Ñ Ð¸ÑполÑзовали в пÑимеÑаÑ
вÑÑе ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñми ÑкÑпоÑÑами â каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ (бÑÐ´Ñ Ñо ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ const
-пеÑеменнаÑ, напÑимеÑ) ÑпоминаеÑÑÑ Ð¿Ð¾ имени пÑи ÑкÑпоÑÑе, и ÑÑо Ð¸Ð¼Ñ Ñакже иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÑÑлки на него пÑи импоÑÑе.
СÑÑеÑÑвÑÐµÑ Ñакже Ñип ÑкÑпоÑÑа, коÑоÑÑй назÑваеÑÑÑ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ â он ÑÑÑеÑÑвÑÐµÑ Ð´Ð»Ñ Ñдобного ÑкÑпоÑÑа оÑновной ÑÑнкÑии, а Ñакже Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¼Ð¾Ð´ÑлÑм JavaScript взаимодейÑÑвоваÑÑ Ñ ÑÑÑеÑÑвÑÑÑими модÑлÑнÑми ÑиÑÑемами CommonJS и AMD (ÑÑо Ñ Ð¾ÑоÑо обÑÑÑнÑеÑÑÑ Ð² ÑÑаÑÑе ÐжейÑона ÐÑендоÑÑа ES6 в деÑалÑÑ : ÐодÑли, иÑиÑе по клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÐ»Ð¾Ð²Ñ Â«Default exports»).
ÐавайÑе поÑмоÑÑим на пÑÐ¸Ð¼ÐµÑ Ð¸ обÑÑÑним, как ÑÑо ÑабоÑаеÑ. РмодÑле square.js
из наÑего пÑимеÑа Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе найÑи ÑÑнкÑÐ¸Ñ randomSquare()
, коÑоÑÐ°Ñ ÑоздаÑÑ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ñо ÑлÑÑайнÑм ÑвеÑом, ÑазмеÑом и кооÑдинаÑами. ÐÑ Ñ
оÑим ÑкÑпоÑÑиÑоваÑÑ ÑÑÑ ÑÑнкÑии по ÑмолÑаниÑ, поÑÑÐ¾Ð¼Ñ Ð² конÑе Ñайла пиÑем ÑледÑÑÑее:
export default randomSquare;
ÐбÑаÑиÑе внимание на оÑÑÑÑÑÑвие ÑигÑÑнÑÑ Ñкобок.
ÐÑÑаÑи, можно бÑло Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑÑнкÑÐ¸Ñ ÐºÐ°Ðº анонимнÑÑ Ð¸ добавиÑÑ Ðº ней export default
:
export default function(ctx) {
...
}
РнаÑем Ñайле main.js
Ð¼Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑем ÑÑнкÑÐ¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, иÑполÑзÑÑ ÑÑÑ ÑÑÑокÑ:
import randomSquare from "./modules/square.js";
Снова обÑаÑиÑе внимание на оÑÑÑÑÑÑвие ÑигÑÑнÑÑ
Ñкобок. Такой ÑинÑÐ°ÐºÐ¸Ñ Ð´Ð¾Ð¿ÑÑÑим, поÑколÑÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ модÑÐ»Ñ ÑазÑеÑен ÑолÑко один ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ, и Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼, ÑÑо ÑÑо randomSquare
. ÐÑÑеÑпомÑнÑÑÐ°Ñ ÑÑÑока ÑвлÑеÑÑÑ ÑокÑаÑением длÑ:
import { default as randomSquare } from "./modules/square.js";
ÐÑимеÑание: «as» ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÐµÑÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÑкÑпоÑÑиÑÑемÑÑ ÑлеменÑов поÑÑнÑеÑÑÑ Ð½Ð¸Ð¶Ðµ в Ñазделе ÐеÑеименование импоÑÑа и ÑкÑпоÑÑа.
Ðак избежаÑÑ ÐºÐ¾Ð½ÑликÑов имÑнÐока ÑÑо наÑи модÑли Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑигÑÑ Ð½Ð° Ñ
олÑÑе ÑабоÑаÑÑ Ð½Ð¾ÑмалÑно. Ðо ÑÑо пÑоизойдÑÑ, еÑли Ð¼Ñ Ð¿Ð¾Ð¿ÑÑаемÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¼Ð¾Ð´ÑлÑ, коÑоÑÑй занимаеÑÑÑ ÑиÑованием дÑÑгой ÑигÑÑÑ, напÑÐ¸Ð¼ÐµÑ ÐºÑÑга или ÑÑеÑголÑника? С ÑÑими ÑигÑÑами, веÑоÑÑно, Ñоже бÑдÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñакие ÑÑнкÑии, как draw()
, reportArea()
и Ñ.д.; еÑли Ð±Ñ Ð¼Ñ Ð¿Ð¾Ð¿ÑÑалиÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ ÑазнÑе ÑÑнкÑии Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же именем в один и ÑÐ¾Ñ Ð¶Ðµ Ñайл модÑÐ»Ñ Ð²ÐµÑÑ
него ÑÑовнÑ, Ð¼Ñ Ð±Ñ ÑÑолкнÑлиÑÑ Ñ ÐºÐ¾Ð½ÑликÑами и оÑибками.
Ð ÑÑаÑÑÑÑ, еÑÑÑ Ð½ÐµÑколÑко ÑпоÑобов обойÑи ÑÑо. ÐÑ ÑаÑÑмоÑÑим Ð¸Ñ Ð² ÑледÑÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ .
ÐеÑеименование импоÑÑа и ÑкÑпоÑÑаÐожно изменÑÑÑ Ð¸Ð¼Ñ ÑÑнкÑионалÑноÑÑи в Ñелевом модÑле Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова as
внÑÑÑи ÑигÑÑнÑÑ
Ñкобок инÑÑÑÑкÑий import
и export
.
Так, напÑимеÑ, оба ÑледÑÑÑÐ¸Ñ ÑлеменÑа бÑдÑÑ Ð²ÑполнÑÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑабоÑÑ, Ñ Ð¾ÑÑ Ð¸ немного по-ÑазномÑ:
// внÑÑÑи module.js
export { function1 as newFunctionName, function2 as anotherNewFunctionName };
// внÑÑÑи main.js
import { newFunctionName, anotherNewFunctionName } from "./modules/module.js";
// внÑÑÑи module.js
export { function1, function2 };
// внÑÑÑи main.js
import {
function1 as newFunctionName,
function2 as anotherNewFunctionName,
} from "./modules/module.js";
ÐавайÑе поÑмоÑÑим на ÑеалÑнÑй пÑимеÑ. РнаÑей renaming диÑекÑоÑии Ð²Ñ ÑвидиÑе ÑÑ Ð¶Ðµ модÑлÑнÑÑ ÑиÑÑемÑ, ÑÑо и в пÑедÑдÑÑем пÑимеÑе, за иÑклÑÑением Ñого, ÑÑо Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ модÑли circle.js
и triangle.js
Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÑÑгов и ÑÑеÑголÑников и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÑÑеÑов по ним.
ÐнÑÑÑи каждого из ÑÑиÑ
модÑлей Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑÑнкÑии Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми именами, коÑоÑÑе ÑкÑпоÑÑиÑÑÑÑÑÑ, и поÑÑÐ¾Ð¼Ñ Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из ниÑ
еÑÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ опеÑаÑÐ¾Ñ export
Ð²Ð½Ð¸Ð·Ñ Ñайла:
export { name, draw, reportArea, reportPerimeter };
ÐÑли Ð±Ñ Ð² main.js
пÑи иÑ
импоÑÑе Ð¼Ñ Ð¿Ð¾Ð¿ÑÑалиÑÑ Ð¸ÑполÑзоваÑÑ
import { name, draw, reportArea, reportPerimeter } from "./modules/square.js";
import { name, draw, reportArea, reportPerimeter } from "./modules/circle.js";
import { name, draw, reportArea, reportPerimeter } from "./modules/triangle.js";
Ñо бÑаÑÐ·ÐµÑ Ð²Ñдал Ð±Ñ Ð¾ÑÐ¸Ð±ÐºÑ â "SyntaxError: redeclaration of import name" (Firefox).
ÐмеÑÑо ÑÑого нам нÑжно пеÑеименоваÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½ бÑл ÑникалÑнÑм:
import {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
reportPerimeter as reportSquarePerimeter,
} from "./modules/square.js";
import {
name as circleName,
draw as drawCircle,
reportArea as reportCircleArea,
reportPerimeter as reportCirclePerimeter,
} from "./modules/circle.js";
import {
name as triangleName,
draw as drawTriangle,
reportArea as reportTriangleArea,
reportPerimeter as reportTrianglePerimeter,
} from "./modules/triangle.js";
ÐбÑаÑиÑе внимание, ÑÑо вмеÑÑо ÑÑого Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑеÑиÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð² ÑÐ°Ð¹Ð»Ð°Ñ Ð¼Ð¾Ð´ÑлÑ, напÑимеÑ.
// внÑÑÑи square.js
export {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
reportPerimeter as reportSquarePerimeter,
};
// внÑÑÑи main.js
import {
squareName,
drawSquare,
reportSquareArea,
reportSquarePerimeter,
} from "./modules/square.js";
Ð ÑÑо ÑÑабоÑало Ð±Ñ ÑоÑно Ñак же. Ðакой ÑпоÑоб Ð²Ñ Ð±ÑдеÑе иÑполÑзоваÑÑ, завиÑÐ¸Ñ Ð¾Ñ Ð²Ð°Ñ, однако, возможно, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл оÑÑавиÑÑ ÐºÐ¾Ð´ модÑÐ»Ñ Ð² покое и внеÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² импоÑÑ. ÐÑо оÑобенно важно, когда Ð²Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑеÑе из ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð¼Ð¾Ð´Ñлей, над коÑоÑÑми Ñ Ð²Ð°Ñ Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ конÑÑолÑ.
Создание обÑекÑа модÑлÑÐÑÑеÑпомÑнÑÑÑй ÑпоÑоб ÑабоÑÐ°ÐµÑ Ð½Ð¾ÑмалÑно, но он немного запÑÑан и многоÑловен. СÑÑеÑÑвÑÐµÑ ÑеÑение полÑÑÑе â импоÑÑиÑоваÑÑ ÑÑнкÑии каждого модÑÐ»Ñ Ð²Ð½ÑÑÑи обÑекÑа модÑлÑ. ÐÐ»Ñ ÑÑого иÑполÑзÑеÑÑÑ ÑледÑÑÑÐ°Ñ ÑинÑакÑиÑеÑÐºÐ°Ñ ÑоÑма:
import * as Module from "./modules/module.js";
ÐÑа конÑÑÑÑкÑÐ¸Ñ Ð±ÐµÑÑÑ Ð²Ñе ÑкÑпоÑÑÑ, доÑÑÑпнÑе внÑÑÑи module.js
и Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ñ
доÑÑÑпнÑми в каÑеÑÑве ÑвойÑÑв обÑекÑа Module
, ÑакÑиÑеÑки Ð´Ð°Ð²Ð°Ñ ÐµÐ¼Ñ ÑобÑÑвенное пÑоÑÑÑанÑÑво имен. Так напÑимеÑ:
Module.function1();
Module.function2();
и Ñ.д.
ÐпÑÑÑ Ð¶Ðµ, давайÑе поÑмоÑÑим на ÑеалÑнÑй пÑимеÑ. ÐÑли Ð²Ñ Ð¿Ð¾ÑмоÑÑиÑе на наÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ module-objects, Ð²Ñ Ñнова ÑвидиÑе ÑÐ¾Ñ Ð¶Ðµ ÑамÑй пÑимеÑ, но пеÑепиÑаннÑй Ñ ÑÑÑÑом пÑеимÑÑеÑÑв ÑÑого нового ÑинÑакÑиÑа. РмодÑлÑÑ Ð²Ñе ÑкÑпоÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑледÑÑÑей пÑоÑÑой ÑоÑме:
export { name, draw, reportArea, reportPerimeter };
С дÑÑгой ÑÑоÑонÑ, импоÑÑ Ð²ÑглÑÐ´Ð¸Ñ Ñак:
import * as Canvas from "./modules/canvas.js";
import * as Square from "./modules/square.js";
import * as Circle from "./modules/circle.js";
import * as Triangle from "./modules/triangle.js";
Ркаждом ÑлÑÑае ÑепеÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð´Ð¾ÑÑÑп к импоÑÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¿Ð¾Ð´ ÑказаннÑм ÑвойÑÑвом обÑекÑа, напÑимеÑ:
let square1 = Square.draw(myCanvas.ctx, 50, 50, 100, "blue");
Square.reportArea(square1.length, reportList);
Square.reportPerimeter(square1.length, reportList);
Таким обÑазом, ÑепеÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе напиÑаÑÑ ÐºÐ¾Ð´ ÑоÑно Ñак же, как и ÑанÑÑе (пÑи ÑÑловии, ÑÑо Ð²Ñ Ð²ÐºÐ»ÑÑаеÑе имена обÑекÑов Ñам, где ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾), и импоÑÑ Ð±ÑÐ´ÐµÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ более аккÑÑаÑнÑм.
ÐодÑли и клаÑÑÑÐак Ð¼Ñ Ð½Ð°Ð¼ÐµÐºÐ°Ð»Ð¸ Ñанее, Ð²Ñ Ñакже можеÑе ÑкÑпоÑÑиÑоваÑÑ Ð¸ импоÑÑиÑоваÑÑ ÐºÐ»Ð°ÑÑÑ â ÑÑо еÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб избежаÑÑ ÐºÐ¾Ð½ÑликÑов в ваÑем коде, и он оÑобенно полезен, еÑли Ñ Ð²Ð°Ñ Ñже еÑÑÑ ÐºÐ¾Ð´ модÑлÑ, напиÑаннÑй в обÑекÑно-оÑиенÑиÑованном ÑÑиле.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑвидеÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð½Ð°Ñего модÑÐ»Ñ Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑигÑÑ, пеÑепиÑанного Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»Ð°ÑÑов ES в наÑей диÑекÑоÑии classes. РкаÑеÑÑве пÑимеÑа, Ñайл square.js
ÑепеÑÑ ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑ ÑÐ²Ð¾Ñ ÑÑнкÑионалÑноÑÑÑ Ð² одном клаÑÑе:
class Square {
constructor(ctx, listId, length, x, y, color) {
...
}
draw() {
...
}
...
}
коÑоÑÑй Ð¼Ñ Ð·Ð°Ñем ÑкÑпоÑÑиÑÑем:
Ðалее в main.js
, Ð¼Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑем его Ñак:
import { Square } from "./modules/square.js";
РзаÑем иÑполÑзÑем импоÑÑиÑованнÑй клаÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑиÑоваÑÑ Ð½Ð°Ñ ÐºÐ²Ð°Ð´ÑаÑ:
let square1 = new Square(myCanvas.ctx, myCanvas.listId, 50, 50, 100, "blue");
square1.draw();
square1.reportArea();
square1.reportPerimeter();
ÐгÑегиÑÑÑÑие модÑли
ÐÐ¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑлÑÑаи, когда Ð²Ñ Ð·Ð°Ñ Ð¾ÑиÑе обÑединиÑÑ Ð¼Ð¾Ð´Ñли вмеÑÑе. У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко ÑÑовней завиÑимоÑÑей, где Ð²Ñ Ñ Ð¾ÑиÑе ÑпÑоÑÑиÑÑ Ð²ÐµÑи, обÑединив неÑколÑко подмодÑлей в один ÑодиÑелÑÑкий модÑлÑ. ÐÑо возможно Ñ Ð¸ÑполÑзованием ÑледÑÑÑего ÑинÑакÑиÑа ÑкÑпоÑÑа в ÑодиÑелÑÑком модÑле:
export * from "x.js";
export { name } from "x.js";
ÐÐ»Ñ Ð¿ÑимеÑа поÑмоÑÑиÑе на наÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ module-aggregation. Ð ÑÑом пÑимеÑе (на оÑнове наÑего пÑедÑдÑÑего пÑимеÑа Ñ ÐºÐ»Ð°ÑÑами) Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй модÑÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ shapes.js
, коÑоÑÑй ÑобиÑÐ°ÐµÑ ÑÑнкÑионалÑноÑÑÑ circle.js
, square.js
и triangle.js
вмеÑÑе. ÐÑ Ñакже пеÑемеÑÑили наÑи подмодÑли в доÑеÑнÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð²Ð½ÑÑÑи диÑекÑоÑии modules
под названием shape
. ÐÑак, ÑÑÑÑкÑÑÑа модÑÐ»Ñ Ð² ÑÑом пÑимеÑе:
modules/ canvas.js shapes.js shapes/ circle.js square.js triangle.js
Ркаждом из подмодÑлей ÑкÑпоÑÑ Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑоÑмÑ, напÑимеÑ:
Ðалее Ð¸Ð´ÐµÑ Ð°Ð³ÑегиÑование. ÐнÑÑÑи shapes.js
, Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем ÑледÑÑÑие ÑÑÑоки:
export { Square } from "./shapes/square.js";
export { Triangle } from "./shapes/triangle.js";
export { Circle } from "./shapes/circle.js";
Ðни беÑÑÑ ÑкÑпоÑÑ Ð¸Ð· оÑделÑнÑÑ
подмодÑлей и ÑакÑиÑеÑки делаÑÑ Ð¸Ñ
доÑÑÑпнÑми из модÑÐ»Ñ shape.js
.
ÐÑимеÑание: ÐкÑпоÑÑÑ, ÑказаннÑе в shape.js
, по ÑÑÑи пеÑенапÑавлÑÑÑÑÑ ÑеÑез Ñайл и на Ñамом деле Ñам не ÑÑÑеÑÑвÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð²Ñ Ð½Ðµ ÑможеÑе напиÑаÑÑ ÐºÐ°ÐºÐ¾Ð¹-либо полезнÑй ÑвÑзаннÑй код внÑÑÑи Ñого же Ñайла.
ÐÑак, ÑепеÑÑ Ð² Ñайле main.js
Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð´Ð¾ÑÑÑп ко вÑем ÑÑÑм клаÑÑам модÑлей, заменив:
import { Square } from "./modules/square.js";
import { Circle } from "./modules/circle.js";
import { Triangle } from "./modules/triangle.js";
на единÑÑвеннÑÑ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð´Ð°:
import { Square, Circle, Triangle } from "./modules/shapes.js";
ÐинамиÑеÑÐºÐ°Ñ Ð·Ð°Ð³ÑÑзка модÑлей
Ð¡Ð°Ð¼Ð°Ñ ÑÐ²ÐµÐ¶Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ JavaScript-модÑлей доÑÑÑÐ¿Ð½Ð°Ñ Ð² бÑаÑзеÑÐ°Ñ , â ÑÑо динамиÑеÑÐºÐ°Ñ Ð·Ð°Ð³ÑÑзка модÑлей. ÐÑо позволÑÐµÑ Ð²Ð°Ð¼ динамиÑеÑки загÑÑжаÑÑ Ð¼Ð¾Ð´Ñли ÑолÑко Ñогда, когда они Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ, вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð³ÑÑжаÑÑ Ð²ÑÑ Ð·Ð°Ñанее. ÐÑо даÑÑ Ð¾ÑевиднÑе пÑеимÑÑеÑÑва в пÑоизводиÑелÑноÑÑи â давайÑе пÑодолжим ÑиÑаÑÑ Ð¸ поÑмоÑÑим, как ÑÑо ÑабоÑаеÑ.
ÐоддеÑжка динамиÑеÑкой загÑÑзки модÑлей позволÑÐµÑ Ð²ÑзÑваÑÑ import()
в каÑеÑÑве ÑÑнкÑии, пеÑедав ей аÑгÑменÑом пÑÑÑ Ðº модÑлÑ. ÐаннÑй вÑзов возвÑаÑÐ°ÐµÑ Promise
, коÑоÑÑй ÑезолвиÑÑÑ Ð¾Ð±ÑекÑом модÑÐ»Ñ (Ñм. Создание обÑекÑа модÑлÑ), пÑедоÑÑавлÑÑ Ð²Ð°Ð¼ доÑÑÑп к ÑкÑпоÑÑÑ Ñказанного модÑлÑ, напÑимеÑ:
import("./modules/myModule.js").then((module) => {
// Ðелаем ÑÑо-нибÑÐ´Ñ Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑованнÑм модÑлем
});
ÐавайÑе поÑмоÑÑим на пÑимеÑ. РдиÑекÑоÑии dynamic-module-imports Ñ Ð½Ð°Ñ ÐµÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ пÑимеÑ, оÑнованнÑй на пÑимеÑе наÑÐ¸Ñ ÐºÐ»Ð°ÑÑов. Ðднако на ÑÑÐ¾Ñ Ñаз Ð¼Ñ Ð½Ð¸Ñего не ÑиÑÑем на Ñ Ð¾Ð»ÑÑе пÑи загÑÑзке ÑÑÑаниÑÑ. ÐмеÑÑо ÑÑого Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем на ÑÑÑаниÑÑ ÑÑи кнопки â «Circle», «Square» и «Triangle», коÑоÑÑе пÑи нажаÑии динамиÑеÑки загÑÑжаÑÑ ÑÑебÑемÑй модÑлÑ, а заÑем иÑполÑзÑÑÑ ÐµÐ³Ð¾ Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñказанной ÑигÑÑÑ.
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð²Ð½ÐµÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑолÑко в наÑи index.html
и main.js
â ÑкÑпоÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¾ÑÑаеÑÑÑ Ñаким же, как и ÑанÑÑе.
Ðалее в main.js
Ð¼Ñ Ð²Ð·Ñли ÑÑÑÐ»ÐºÑ Ð½Ð° каждÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ, иÑполÑзÑÑ Ð²Ñзов document.querySelector()
:
let squareBtn = document.querySelector(".square");
ÐаÑем Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем обÑабоÑÑик ÑобÑÑий на каждÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ, ÑÑÐ¾Ð±Ñ Ð¿Ñи нажаÑии ÑооÑвеÑÑÑвÑÑÑий модÑÐ»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки загÑÑжалÑÑ Ð¸ иÑполÑзовалÑÑ Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑигÑÑÑ:
squareBtn.addEventListener("click", () => {
import("./modules/square.js").then((Module) => {
let square1 = new Module.Square(
myCanvas.ctx,
myCanvas.listId,
50,
50,
100,
"blue",
);
square1.draw();
square1.reportArea();
square1.reportPerimeter();
});
});
ÐбÑаÑиÑе внимание: поÑколÑÐºÑ Ð²Ñполнение Promise возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¼Ð¾Ð´ÑлÑ, клаÑÑ Ð·Ð°Ñем ÑÑановиÑÑÑ Ð¿Ð¾Ð´ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñом обÑекÑа, поÑÑÐ¾Ð¼Ñ ÑепеÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к конÑÑÑÑкÑоÑÑ Ð½Ð°Ð¼ нÑжно добавиÑÑ Ðº Ð½ÐµÐ¼Ñ Module.
, напÑÐ¸Ð¼ÐµÑ Module.Square(...)
.
ÐÐ¾Ñ Ð½ÐµÑколÑко ÑовеÑов, коÑоÑÑе могÑÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð²Ð°Ð¼, еÑли вам не ÑдаÑÑÑÑ Ð·Ð°ÑÑавиÑÑ Ð²Ð°Ñи модÑли ÑабоÑаÑÑ. Ðе ÑÑеÑнÑйÑеÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑ ÑпиÑок, еÑли найдеÑе ÑÑо-Ñо еÑÑ!
.js
-ÑÐ°Ð¹Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ñ MIME-type ÑавнÑм text/javascript
(или лÑбÑм дÑÑгим JavaScript-ÑовмеÑÑимÑм MIME-type, но text/javascript
ÑвлÑеÑÑÑ ÑекомендованнÑм), в пÑоÑивном ÑлÑÑае Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе оÑÐ¸Ð±ÐºÑ Ð¿ÑовеÑки MIME-type, напÑÐ¸Ð¼ÐµÑ â "The server responded with a non-JavaScript MIME type".file://
), Ð²Ñ ÑÑолкнеÑеÑÑ Ñ Ð¾Ñибками CORS из-за ÑÑебований безопаÑноÑÑи JavaScript-модÑлей. Ðам нÑжно пÑоводиÑÑ ÑеÑÑиÑование ÑеÑез ÑеÑвеÑ. GitHub pages идеалÑно Ð´Ð»Ñ ÑÑого подÑ
одÑÑ, Ñак как оÑдаÑÑ .js
-ÑÐ°Ð¹Ð»Ñ Ñ Ð½ÑжнÑм MIME-type..mjs
â неÑÑандаÑÑное ÑаÑÑиÑение Ñайла, некоÑоÑÑе опеÑаÑионнÑе ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ ÐµÐ³Ð¾ не ÑаÑпознаÑÑ Ð¸Ð»Ð¸ попÑÑаÑÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð½Ð° ÑÑо-Ñо дÑÑгое. ÐапÑимеÑ, Ð¼Ñ Ð¾Ð±Ð½Ð°ÑÑжили, ÑÑо macOS незамеÑно добавлÑла .js
в ÐºÐ¾Ð½ÐµÑ Ñайлов .mjs
, а заÑем авÑомаÑиÑеÑки ÑкÑÑвала ÑаÑÑиÑение Ñайла. Таким обÑазом, вÑе наÑи ÑÐ°Ð¹Ð»Ñ Ð½Ð° Ñамом деле имели название Ñипа x.mjs.js
. Ðогда Ð¼Ñ Ð¾ÑклÑÑили авÑомаÑиÑеÑкое ÑкÑÑÑие ÑаÑÑиÑений Ñайлов и наÑÑили macOS пÑинимаÑÑ .mjs
, вÑÑ ÑÑало в поÑÑдке.RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4