ÐодÑли JavaScript
ÐÑо ÑÑководÑÑво ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð°Ñала ÑабоÑÑ Ñ Ð¼Ð¾Ð´ÑлÑми 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. ÐÑиÑÐ¸Ð½Ñ ÑледÑÑÑие:
- ÐÑо полезно Ð´Ð»Ñ ÑÑноÑÑи, Ñо еÑÑÑ Ð´Ð°ÐµÑ Ð¿Ð¾Ð½ÑÑÑ, какие ÑÐ°Ð¹Ð»Ñ ÑвлÑÑÑÑÑ Ð¼Ð¾Ð´ÑлÑми, а какие â обÑÑнÑми JavaScript-Ñайлами.
- ÐÑо гаÑанÑиÑÑеÑ, ÑÑо ÑÐ°Ð¹Ð»Ñ Ð²Ð°Ñего модÑÐ»Ñ Ð±ÑдÑÑ Ð¿ÑоанализиÑÐ¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº модÑÐ»Ñ ÑÑедами вÑполнениÑ, Ñакими как Node.js, и инÑÑÑÑменÑами ÑбоÑки, Ñакими как Babel.
Тем не менее, Ð¼Ñ ÑеÑили пÑодолжаÑÑ Ð¸ÑполÑзоваÑÑ .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.
Ðобавление модÑÐ»Ñ Ð½Ð° HTML-ÑÑÑаниÑÑ
Ðалее нам необÑ
одимо подклÑÑиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ 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 инÑÑÑÑкÑии ÑолÑко внÑÑÑи модÑлей, внÑÑÑи обÑÑнÑÑ
ÑкÑипÑов они ÑабоÑаÑÑ Ð½Ðµ бÑдÑÑ.
ÐÑÑгие оÑлиÑÐ¸Ñ Ð¼Ð¾Ð´Ñлей Ð¾Ñ Ð¾Ð±ÑÑнÑÑ ÑкÑипÑов
- ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾ÑÑоÑÐ¾Ð¶Ð½Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð»Ð¾ÐºÐ°Ð»Ñного ÑеÑÑиÑование â еÑли Ð²Ñ Ð¿Ð¾Ð¿ÑÑаеÑеÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ñайл HTML локалÑно (Ñо еÑÑÑ Ð¿Ð¾
file://URL), Ð²Ñ ÑÑолкнÑÑеÑÑ Ñ Ð¾Ñибками CORS из-за ÑÑебований безопаÑноÑÑи JavaScript-модÑлей. Ðам нÑжно пÑоводиÑÑ ÑеÑÑиÑование ÑеÑез ÑеÑвеÑ. - Также обÑаÑиÑе внимание, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑолкнÑÑÑÑÑ Ñ Ð¾ÑлиÑнÑм Ð¾Ñ Ð¾Ð±ÑÑнÑÑ Ñайлов поведением кода в модÑлÑÑ . ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¸Ð·-за Ñого, ÑÑо модÑли иÑполÑзÑÑÑ strict mode авÑомаÑиÑеÑки.
- ÐÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи иÑполÑзоваÑÑ Ð°ÑÑибÑÑ
defer(Ñм. аÑÑибÑÑÑ<script>ÑлеменÑа) пÑи загÑÑзке модÑлÑ, модÑли ÑвлÑÑÑÑÑ deferred по ÑмолÑаниÑ. - ÐодÑли вÑполнÑÑÑÑÑ ÑолÑко один Ñаз, даже еÑли на ниÑ
еÑÑÑ ÑÑÑлки в неÑколÑкиÑ
<script>ÑÑÐ³Ð°Ñ . - РпоÑледнее, но не менее важное: ÑÑнкÑионалÑноÑÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑÑÑÑÑ Ð² облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи одного ÑкÑипÑа, она недоÑÑÑÐ¿Ð½Ñ Ð² глобалÑной облаÑÑи видимоÑÑи. СледоваÑелÑно, Ð²Ñ ÑможеÑе полÑÑиÑÑ Ð´Ð¾ÑÑÑп к импоÑÑиÑованнÑм ÑаÑÑÑм модÑÐ»Ñ ÑолÑко в ÑкÑипÑе, в коÑоÑÑй он импоÑÑиÑован, и, напÑимеÑ, Ð²Ñ Ð½Ðµ ÑможеÑе полÑÑиÑÑ Ðº Ð½ÐµÐ¼Ñ Ð´Ð¾ÑÑÑп из конÑоли JavaScript. ÐÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð±ÑдеÑе полÑÑаÑÑ ÑинÑакÑиÑеÑкие оÑибки в DevTools, но Ð²Ñ Ð½Ðµ ÑможеÑе иÑполÑзоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе меÑÐ¾Ð´Ñ Ð¾Ñладки, коÑоÑÑе, возможно, ожидали иÑполÑзоваÑÑ.
ÐкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑоÑив именованного ÑкÑпоÑÑа
ÐкÑпоÑÑÑ ÑÑнкÑий и пеÑеменнÑÑ
, коÑоÑÑе Ð¼Ñ Ð¸ÑполÑзовали в пÑимеÑаÑ
вÑÑе ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñми ÑкÑпоÑÑами â каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ (бÑÐ´Ñ Ñо ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ 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() {
...
}
...
}
коÑоÑÑй Ð¼Ñ Ð·Ð°Ñем ÑкÑпоÑÑиÑÑем:
export { Square };
Ðалее в 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
Ркаждом из подмодÑлей ÑкÑпоÑÑ Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑоÑмÑ, напÑимеÑ:
export { Square };
Ðалее Ð¸Ð´ÐµÑ Ð°Ð³ÑегиÑование.
ÐнÑÑÑи 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". - ÐÑли Ð²Ñ Ð¿Ð¾Ð¿ÑÑаеÑеÑÑ Ð·Ð°Ð³ÑÑзиÑÑ HTML-Ñайл локалÑно (Ñо еÑÑÑ Ð¿Ð¾ ÑÑÑлке
file://), Ð²Ñ ÑÑолкнеÑеÑÑ Ñ Ð¾Ñибками CORS из-за ÑÑебований безопаÑноÑÑи JavaScript-модÑлей. Ðам нÑжно пÑоводиÑÑ ÑеÑÑиÑование ÑеÑез ÑеÑвеÑ. GitHub pages идеалÑно Ð´Ð»Ñ ÑÑого Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ, Ñак как оÑдаÑÑ.js-ÑÐ°Ð¹Ð»Ñ Ñ Ð½ÑжнÑм MIME-type. - ÐоÑколÑкÑ
.mjsâ неÑÑандаÑÑное ÑаÑÑиÑение Ñайла, некоÑоÑÑе опеÑаÑионнÑе ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ ÐµÐ³Ð¾ не ÑаÑпознаÑÑ Ð¸Ð»Ð¸ попÑÑаÑÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð½Ð° ÑÑо-Ñо дÑÑгое. ÐапÑимеÑ, Ð¼Ñ Ð¾Ð±Ð½Ð°ÑÑжили, ÑÑо macOS незамеÑно добавлÑла.jsв ÐºÐ¾Ð½ÐµÑ Ñайлов.mjs, а заÑем авÑомаÑиÑеÑки ÑкÑÑвала ÑаÑÑиÑение Ñайла. Таким обÑазом, вÑе наÑи ÑÐ°Ð¹Ð»Ñ Ð½Ð° Ñамом деле имели название Ñипаx.mjs.js. Ðогда Ð¼Ñ Ð¾ÑклÑÑили авÑомаÑиÑеÑкое ÑкÑÑÑие ÑаÑÑиÑений Ñайлов и наÑÑили macOS пÑинимаÑÑ.mjs, вÑÑ ÑÑало в поÑÑдке.
СмоÑÑиÑе Ñакже
- ÐÑполÑзование JavaScript-модÑлей в вебе, Ð¾Ñ Ðдди ÐÑмани и ÐаÑиаÑа ÐайненÑа (англ.)
- ÐлÑбокое погÑÑжение в ES-модÑли в каÑÑÐ¸Ð½ÐºÐ°Ñ , Ð¾Ñ Ðина ÐлаÑка на Hacks blog (англ.)
- ÐлÑбокое погÑÑжение в ES-модÑли в каÑÑÐ¸Ð½ÐºÐ°Ñ , пеÑевод на ÑÑÑÑкий ÑзÑк Ð¾Ñ Â«Ðеб-ÑÑандаÑÑов»
- ES6 в деÑалÑÑ : ÐодÑли, ÑÑаÑÑÑ Ð¾Ñ ÐжейÑона ÐÑендоÑÑа на Hacks blog (англ.)
- ÐзÑÑаем JS: ÐодÑли (англ), книга ÐкÑÐµÐ»Ñ Ð Ð°ÑÑмайеÑа (англ.)