ÐиÑекÑÐ¸Ð²Ñ ÑкÑпоÑÑ Ð¸ импоÑÑ Ð¸Ð¼ÐµÑÑ Ð½ÐµÑколÑко ваÑианÑов вÑзова.
РпÑедÑдÑÑей главе Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ пÑоÑÑое иÑполÑзование, давайÑе ÑепеÑÑ Ð¿Ð¾ÑмоÑÑим болÑÑе пÑимеÑов.
ÐкÑпоÑÑ Ð´Ð¾ обÑÑвлениÑ
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ помеÑиÑÑ Ð»Ñбое обÑÑвление как ÑкÑпоÑÑиÑÑемое, ÑазмеÑÑив export пеÑед ним, бÑÐ´Ñ Ñо пеÑеменнаÑ, ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ клаÑÑ.
ÐапÑимеÑ, вÑе ÑледÑÑÑие ÑкÑпоÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑ:
// ÑкÑпоÑÑ Ð¼Ð°ÑÑива
export let months = ['Jan', 'Feb', 'Mar', 'Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
// ÑкÑпоÑÑ ÐºÐ¾Ð½ÑÑанÑÑ
export const MODULES_BECAME_STANDARD_YEAR = 2015;
// ÑкÑпоÑÑ ÐºÐ»Ð°ÑÑа
export class User {
constructor(name) {
this.name = name;
}
}
ÐбÑаÑиÑе внимание, ÑÑо export пеÑед клаÑÑом или ÑÑнкÑией не Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ñ
ÑÑнкÑионалÑнÑм вÑÑажением. ÐÑо вÑÑ Ñакже обÑÑвление ÑÑнкÑии, Ñ
оÑÑ Ð¸ ÑкÑпоÑÑиÑÑемое.
ÐолÑÑинÑÑво ÑÑководÑÑв по ÑÑÐ¸Ð»Ñ ÐºÐ¾Ð´Ð° в JavaScript не ÑекомендÑÑÑ ÑÑавиÑÑ ÑоÑÐºÑ Ñ Ð·Ð°Ð¿ÑÑой поÑле обÑÑвлений ÑÑнкÑий или клаÑÑов.
ÐоÑÑÐ¾Ð¼Ñ Ð² конÑе export class и export function не нÑжна ÑоÑка Ñ Ð·Ð°Ð¿ÑÑой:
export function sayHi(user) {
alert(`Hello, ${user}!`);
} // без ; в конÑе
ÐкÑпоÑÑ Ð¾ÑделÑно Ð¾Ñ Ð¾Ð±ÑÑвлениÑ
Также можно напиÑаÑÑ export оÑделÑно.
ÐдеÑÑ Ð¼Ñ ÑнаÑала обÑÑвлÑем, а заÑем ÑкÑпоÑÑиÑÑем:
// ð say.js
function sayHi(user) {
alert(`Hello, ${user}!`);
}
function sayBye(user) {
alert(`Bye, ${user}!`);
}
export {sayHi, sayBye}; // ÑпиÑок ÑкÑпоÑÑиÑÑемÑÑ
пеÑеменнÑÑ
â¦Ðли, ÑеÑ
ниÑеÑки, Ð¼Ñ Ñакже можем ÑаÑположиÑÑ export вÑÑе ÑÑнкÑий.
ÐмпоÑÑ *
ÐбÑÑно Ð¼Ñ ÑаÑполагаем ÑпиÑок Ñого, ÑÑо Ñ
оÑим импоÑÑиÑоваÑÑ, в ÑигÑÑнÑÑ
ÑкобкаÑ
import {...}, напÑÐ¸Ð¼ÐµÑ Ð²Ð¾Ñ Ñак:
// ð main.js
import {sayHi, sayBye} from './say.js';
sayHi('John'); // Hello, John!
sayBye('John'); // Bye, John!
Ðо еÑли импоÑÑиÑоваÑÑ Ð½Ñжно много Ñего, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ импоÑÑиÑоваÑÑ Ð²ÑÑ ÑÑÐ°Ð·Ñ Ð² виде обÑекÑа, иÑполÑзÑÑ import * as <obj>. ÐапÑимеÑ:
// ð main.js
import * as say from './say.js';
say.sayHi('John');
say.sayBye('John');
Ðа пеÑвÑй взглÑд «импоÑÑиÑоваÑÑ Ð²ÑÑ» вÑглÑÐ´Ð¸Ñ Ð¾ÑÐµÐ½Ñ Ñдобно, не надо пиÑаÑÑ Ð»Ð¸Ñнего, заÑем нам вообÑе Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ñвно пеÑеÑиÑлÑÑÑ ÑпиÑок Ñого, ÑÑо нÑжно импоÑÑиÑоваÑÑ?
ÐÐ»Ñ ÑÑого еÑÑÑ Ð½ÐµÑколÑко пÑиÑин.
-
СовÑеменнÑе инÑÑÑÑменÑÑ ÑбоÑки (webpack и дÑÑгие) ÑобиÑаÑÑ Ð¼Ð¾Ð´Ñли вмеÑÑе и опÑимизиÑÑÑÑ Ð¸Ñ , ÑÑкоÑÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸ ÑдалÑÑ Ð½ÐµÐ¸ÑполÑзÑемÑй код.
ÐÑедположим, Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ в Ð½Ð°Ñ Ð¿ÑÐ¾ÐµÐºÑ ÑÑоÑоннÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ
say.jsÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом ÑÑнкÑий:// ð say.js export function sayHi() { ... } export function sayBye() { ... } export function becomeSilent() { ... }ТепеÑÑ, еÑли из ÑÑой библиоÑеки в пÑоекÑе Ð¼Ñ Ð¸ÑполÑзÑем ÑолÑко Ð¾Ð´Ð½Ñ ÑÑнкÑиÑ:
// ð main.js import {sayHi} from './say.js';â¦Ð¢Ð¾Ð³Ð´Ð° опÑимизаÑÐ¾Ñ ÑвидиÑ, ÑÑо дÑÑгие ÑÑнкÑии не иÑполÑзÑÑÑÑÑ, и ÑÐ´Ð°Ð»Ð¸Ñ Ð¾ÑÑалÑнÑе из ÑобÑанного кода, Ñем ÑамÑм Ð´ÐµÐ»Ð°Ñ ÐºÐ¾Ð´ менÑÑе. ÐÑо назÑваеÑÑÑ Â«tree-shaking».
-
Явно пеÑеÑиÑлÑÑ Ñо, ÑÑо Ñ Ð¾Ñим импоÑÑиÑоваÑÑ, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем более коÑоÑкие имена ÑÑнкÑий:
sayHi()вмеÑÑоsay.sayHi(). -
Явное пеÑеÑиÑление импоÑÑов Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð´ более понÑÑнÑм, позволÑÐµÑ ÑвидеÑÑ, ÑÑо именно и где иÑполÑзÑеÑÑÑ. ÐÑо ÑпÑоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¸ ÑеÑакÑоÑинг кода.
ÐмпоÑÑ Â«ÐºÐ°ÐºÂ»
ÐÑ Ñакже можем иÑполÑзоваÑÑ as, ÑÑÐ¾Ð±Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ Ð¿Ð¾Ð´ дÑÑгими именами.
ÐапÑимеÑ, Ð´Ð»Ñ ÐºÑаÑкоÑÑи импоÑÑиÑÑем sayHi в локалÑнÑÑ Ð¿ÐµÑеменнÑÑ hi, а sayBye импоÑÑиÑÑем как bye:
// ð main.js
import {sayHi as hi, sayBye as bye} from './say.js';
hi('John'); // Hello, John!
bye('John'); // Bye, John!
ÐкÑпоÑÑиÑоваÑÑ Â«ÐºÐ°ÐºÂ»
ÐналогиÑнÑй ÑинÑакÑÐ¸Ñ ÑÑÑеÑÑвÑÐµÑ Ð¸ Ð´Ð»Ñ export.
ÐавайÑе ÑкÑпоÑÑиÑÑем ÑÑнкÑии, как hi и bye:
// ð say.js
...
export {sayHi as hi, sayBye as bye};
ТепеÑÑ hi и bye â оÑиÑиалÑнÑе имена Ð´Ð»Ñ Ð²Ð½ÐµÑнего кода, иÑ
нÑжно иÑполÑзоваÑÑ Ð¿Ñи импоÑÑе:
// ð main.js
import * as say from './say.js';
say.hi('John'); // Hello, John!
say.bye('John'); // Bye, John!
ÐкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ
Ðа пÑакÑике модÑли вÑÑÑеÑаÑÑÑÑ Ð² оÑновном одного из двÑÑ Ñипов:
- ÐодÑлÑ, ÑодеÑжаÑий библиоÑÐµÐºÑ Ð¸Ð»Ð¸ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, как
say.jsвÑÑе. - ÐодÑлÑ, коÑоÑÑй обÑÑвлÑÐµÑ ÑÑо-Ñо одно, напÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð´ÑлÑ
user.jsÑкÑпоÑÑиÑÑÐµÑ ÑолÑкоclass User.
Ðо болÑÑей ÑаÑÑи, Ñдобнее вÑоÑой Ð¿Ð¾Ð´Ñ Ð¾Ð´, когда ÐºÐ°Ð¶Ð´Ð°Ñ Â«Ð²ÐµÑÑ» Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑвоÑм ÑобÑÑвенном модÑле.
ÐÑÑеÑÑвенно, ÑÑебÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñайлов, еÑли Ð´Ð»Ñ Ð²Ñего делаÑÑ Ð¾ÑделÑнÑй модÑлÑ, но ÑÑо не пÑоблема. Так даже Ñдобнее: навигаÑÐ¸Ñ Ð¿Ð¾ пÑоекÑÑ ÑÑановиÑÑÑ Ð¿ÑоÑе, оÑобенно, еÑли Ñ Ñайлов Ñ Ð¾ÑоÑие имена, и они ÑÑÑÑкÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿Ð¾ папкам.
ÐодÑли пÑедоÑÑавлÑÑÑ ÑпеÑиалÑнÑй ÑинÑакÑÐ¸Ñ export default («ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ») Ð´Ð»Ñ Ð²ÑоÑого подÑ
ода.
СÑавим export default пеÑед Ñем, ÑÑо нÑжно ÑкÑпоÑÑиÑоваÑÑ:
// ð user.js
export default class User { // пÑоÑÑо добавÑÑе "default"
constructor(name) {
this.name = name;
}
}
ÐамеÑим, в Ñайле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ более одного export default.
â¦Ð поÑом импоÑÑиÑÑем без ÑигÑÑнÑÑ Ñкобок:
// ð main.js
import User from './user.js'; // не {User}, пÑоÑÑо User
new User('John');
ÐмпоÑÑÑ Ð±ÐµÐ· ÑигÑÑнÑÑ
Ñкобок вÑглÑдÑÑ ÐºÑаÑивее. ÐбÑÑÐ½Ð°Ñ Ð¾Ñибка наÑинаÑÑиÑ
: забÑваÑÑ Ð¿Ñо ÑигÑÑнÑе Ñкобки. Ðапомним: ÑигÑÑнÑе Ñкобки необÑ
Ð¾Ð´Ð¸Ð¼Ñ Ð² ÑлÑÑае именованнÑÑ
ÑкÑпоÑÑов, Ð´Ð»Ñ export default они не нÑжнÑ.
| ÐменованнÑй ÑкÑпоÑÑ | ÐкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ |
|---|---|
export class User {...} |
export default class User {...} |
import {User} from ... |
import User from ... |
Ð¢ÐµÑ Ð½Ð¸ÑеÑки в одном модÑле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ°Ðº ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ, Ñак и именованнÑе ÑкÑпоÑÑÑ, но на пÑакÑике обÑÑно Ð¸Ñ Ð½Ðµ ÑмеÑиваÑÑ. То еÑÑÑ, в модÑле Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð»Ð¸Ð±Ð¾ именованнÑе ÑкÑпоÑÑÑ, либо один ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ.
Так как в Ñайле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼Ð°ÐºÑимÑм один export default, Ñо ÑкÑпоÑÑиÑÑÐµÐ¼Ð°Ñ ÑÑÑноÑÑÑ Ð½Ðµ обÑзана имеÑÑ Ð¸Ð¼Ñ.
ÐапÑимеÑ, вÑÑ ÑÑо â полноÑÑÑÑ ÐºÐ¾ÑÑекÑнÑе ÑкÑпоÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ:
export default class { // Ñ ÐºÐ»Ð°ÑÑа Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸
constructor() { ... }
}
export default function(user) { // Ñ ÑÑнкÑии Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸
alert(`Hello, ${user}!`);
}
// ÑкÑпоÑÑиÑÑем знаÑение, не ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¿ÐµÑеменнÑÑ
export default ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
ÐÑо ноÑмалÑно, поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один export default на Ñайл, Ñак ÑÑо import без ÑигÑÑнÑÑ
Ñкобок вÑегда знаеÑ, ÑÑо импоÑÑиÑоваÑÑ.
Ðез default Ñакой ÑкÑпоÑÑ Ð²Ñдал Ð±Ñ Ð¾ÑибкÑ:
export class { // ÐÑибка! (необÑ
одимо имÑ, еÑли ÑÑо не ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ)
constructor() {}
}
ÐÐ¼Ñ Â«default»
РнекоÑоÑÑÑ
ÑиÑÑаÑиÑÑ
Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑкÑпоÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð² каÑеÑÑве имени иÑполÑзÑеÑÑÑ default.
ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ ÑкÑпоÑÑиÑоваÑÑ ÑÑнкÑÐ¸Ñ Ð¾ÑделÑно Ð¾Ñ ÐµÑ Ð¾Ð±ÑÑвлениÑ:
function sayHi(user) {
alert(`Hello, ${user}!`);
}
// Ñо же Ñамое, как еÑли Ð±Ñ Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ "export default" пеÑед ÑÑнкÑией
export {sayHi as default};
Ðли, еÑÑ ÑиÑÑаÑиÑ, давайÑе пÑедÑÑавим ÑледÑÑÑее: модÑÐ»Ñ user.js ÑкÑпоÑÑиÑÑÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑноÑÑÑ Â«Ð¿Ð¾ ÑмолÑаниÑ» и неÑколÑко именованнÑÑ
(Ñедкий, но возможнÑй ÑлÑÑай):
// ð user.js
export default class User {
constructor(name) {
this.name = name;
}
}
export function sayHi(user) {
alert(`Hello, ${user}!`);
}
ÐÐ¾Ñ ÐºÐ°Ðº импоÑÑиÑоваÑÑ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¼ÐµÑÑе Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñм ÑкÑпоÑÑом:
// ð main.js
import {default as User, sayHi} from './user.js';
new User('John');
Ð, наконеÑ, еÑли Ð¼Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑем вÑÑ ÐºÐ°Ðº обÑÐµÐºÑ import *, Ñогда его ÑвойÑÑво default â как Ñаз и бÑÐ´ÐµÑ ÑкÑпоÑÑом по ÑмолÑаниÑ:
// ð main.js
import * as user from './user.js';
let User = user.default; // ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ
new User('John');
Ðовод пÑоÑив ÑкÑпоÑÑов по ÑмолÑаниÑ
ÐменованнÑе ÑкÑпоÑÑÑ Â«Ð²ÐºÐ»ÑÑаÑÑ Ð² ÑебÑ» ÑÐ²Ð¾Ñ Ð¸Ð¼Ñ. ÐÑа инÑоÑмаÑÐ¸Ñ ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¼Ð¾Ð´ÑлÑ, говоÑÐ¸Ñ Ð½Ð°Ð¼, ÑÑо именно ÑкÑпоÑÑиÑÑеÑÑÑ.
ÐменованнÑе ÑкÑпоÑÑÑ Ð²ÑнÑждаÑÑ Ð½Ð°Ñ Ð¸ÑполÑзоваÑÑ Ð¿ÑавилÑное Ð¸Ð¼Ñ Ð¿Ñи импоÑÑе:
import {User} from './user.js';
// import {MyUser} не ÑÑабоÑаеÑ, должно бÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ð¸Ð¼Ñ {User}
â¦Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº Ð´Ð»Ñ ÑкÑпоÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ñ Ð²ÑбиÑаем лÑбое Ð¸Ð¼Ñ Ð¿Ñи импоÑÑе:
import User from './user.js'; // ÑÑабоÑаеÑ
import MyUser from './user.js'; // Ñоже ÑÑабоÑаеÑ
// можно импоÑÑиÑоваÑÑ Ñ Ð»ÑбÑм именем, и ÑÑо бÑÐ´ÐµÑ ÑабоÑаÑÑ
Так ÑÑо ÑÐ»ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ ÑазнÑе имена Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа одной и Ñой же веÑи, и ÑÑо не оÑÐµÐ½Ñ Ñ Ð¾ÑоÑо.
ÐбÑÑно, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÑого и ÑоблÑÑÑи единообÑазие кода, еÑÑÑ Ð¿Ñавило: имена импоÑÑиÑÑемÑÑ Ð¿ÐµÑеменнÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð¸Ð¼ÐµÐ½Ð°Ð¼ Ñайлов. ÐÐ¾Ñ Ñак:
import User from './user.js';
import LoginForm from './loginForm.js';
import func from '/path/to/func.js';
...
Тем не менее, в некоÑоÑÑÑ
командаÑ
ÑÑо ÑÑиÑаÑÑ ÑеÑÑÑзнÑм доводом пÑоÑив ÑкÑпоÑÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ пÑедпоÑиÑаÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñе ÑкÑпоÑÑÑ Ð²ÐµÐ·Ð´Ðµ. Ðаже еÑли ÑкÑпоÑÑиÑÑеÑÑÑ ÑолÑко одна веÑÑ, она вÑÑ Ñавно ÑкÑпоÑÑиÑÑеÑÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ default.
ÐÑо Ñакже немного ÑпÑоÑÐ°ÐµÑ ÑеÑкÑпоÑÑ (ÑмоÑÑиÑе ниже).
РеÑкÑпоÑÑ
СинÑакÑÐ¸Ñ Â«ÑеÑкÑпоÑÑа» export ... from ... позволÑÐµÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ ÑÑо-Ñо и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ, возможно под дÑÑгим именем, Ð²Ð¾Ñ Ñак:
export {sayHi} from './say.js'; // ÑеÑкÑпоÑÑиÑоваÑÑ sayHi
export {default as User} from './user.js'; // ÑеÑкÑпоÑÑиÑоваÑÑ default
ÐаÑем ÑÑо нÑжно? РаÑÑмоÑÑим пÑакÑиÑеÑкий пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ.
ÐÑедÑÑавим, ÑÑо Ð¼Ñ Ð¿Ð¸Ñем «пакеÑ»: Ð¿Ð°Ð¿ÐºÑ Ñо множеÑÑвом модÑлей, из коÑоÑой ÑаÑÑÑ ÑÑнкÑионалÑноÑÑи ÑкÑпоÑÑиÑÑеÑÑÑ Ð½Ð°ÑÑÐ¶Ñ (инÑÑÑÑменÑÑ Ð²Ñоде NPM позволÑÑÑ Ð½Ð°Ð¼ пÑбликоваÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑÑÑ Ñакие пакеÑÑ), а многие модÑли â пÑоÑÑо вÑпомогаÑелÑнÑе, Ð´Ð»Ñ Ð²Ð½ÑÑÑеннего иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð´ÑлÑÑ Ð¿Ð°ÐºÐµÑа.
СÑÑÑкÑÑÑа Ñайлов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакой:
auth/
index.js
user.js
helpers.js
tests/
login.js
providers/
github.js
facebook.js
...
ÐÑ Ð±Ñ Ñ
оÑели ÑделаÑÑ ÑÑнкÑионалÑноÑÑÑ Ð½Ð°Ñего пакеÑа доÑÑÑпной ÑеÑез единÑÑ ÑоÑÐºÑ Ð²Ñ
ода: «главнÑй Ñайл» auth/index.js. ЧÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло иÑполÑзоваÑÑ ÐµÑ ÑледÑÑÑим обÑазом:
import {login, logout} from 'auth/index.js'
ÐÐ´ÐµÑ Ð² Ñом, ÑÑо внеÑние ÑазÑабоÑÑики, коÑоÑÑе бÑдÑÑ Ð¸ÑполÑзоваÑÑ Ð½Ð°Ñ Ð¿Ð°ÐºÐµÑ, не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазбиÑаÑÑÑÑ Ñ ÐµÐ³Ð¾ внÑÑÑенней ÑÑÑÑкÑÑÑой, ÑÑÑÑÑÑ Ð² ÑайлаÑ
внÑÑÑи наÑего пакеÑа. ÐÑÑ, ÑÑо нÑжно, Ð¼Ñ ÑкÑпоÑÑиÑÑем в auth/index.js, а оÑÑалÑное ÑкÑÑваем Ð¾Ñ Ð»ÑбопÑÑнÑÑ
взглÑдов.
Так как нÑÐ¶Ð½Ð°Ñ ÑÑнкÑионалÑноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазбÑоÑана по модÑлÑм наÑего пакеÑа, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ импоÑÑиÑоваÑÑ Ð¸Ñ
в auth/index.js и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ Ð½Ð°ÑÑжÑ.
// ð auth/index.js
// импоÑÑиÑоваÑÑ login/logout и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ
import {login, logout} from './helpers.js';
export {login, logout};
// импоÑÑиÑоваÑÑ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ°Ðº User и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ
import User from './user.js';
export {User};
...
ТепеÑÑ Ð¿Ð¾Ð»ÑзоваÑели наÑего пакеÑа могÑÑ Ð¿Ð¸ÑаÑÑ import {login} from "auth/index.js".
ÐапиÑÑ export ... from ...â ÑÑо пÑоÑÑо более коÑоÑкий ваÑÐ¸Ð°Ð½Ñ Ñакого импоÑÑа-ÑкÑпоÑÑа:
// ð auth/index.js
// импоÑÑиÑоваÑÑ login/logout и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ
export {login, logout} from './helpers.js';
// импоÑÑиÑоваÑÑ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ°Ðº User и ÑÑÑ Ð¶Ðµ ÑкÑпоÑÑиÑоваÑÑ
export {default as User} from './user.js';
...
РеÑкÑпоÑÑ ÑкÑпоÑÑа по ÑмолÑаниÑ
ÐÑи ÑеÑкÑпоÑÑе ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ñжно обÑабаÑÑваÑÑ Ð¾ÑобÑм обÑазом.
ÐапÑимеÑ, Ñ Ð½Ð°Ñ ÐµÑÑÑ user.js, из коÑоÑого Ð¼Ñ Ñ
оÑим ÑеÑкÑпоÑÑиÑоваÑÑ ÐºÐ»Ð°ÑÑ User:
// ð user.js
export default class User {
// ...
}
-
export User from './user.js'не бÑÐ´ÐµÑ ÑабоÑаÑÑ. ÐазалоÑÑ Ð±Ñ, ÑÑо Ñакого? Ðо Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка!ЧÑÐ¾Ð±Ñ ÑеÑкÑпоÑÑиÑоваÑÑ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ð¿Ð¸ÑаÑÑ
export {default as User}, как в пÑимеÑе вÑÑе. Ð¢Ð°ÐºÐ°Ñ Ð²Ð¾Ñ Ð¾ÑобенноÑÑÑ ÑинÑакÑиÑа. -
export * from './user.js'ÑеÑкÑпоÑÑиÑÑÐµÑ ÑолÑко именованнÑе ÑкÑпоÑÑÑ, иÑклÑÑÐ°Ñ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ.ÐÑли Ð¼Ñ Ñ Ð¾Ñим ÑеÑкÑпоÑÑиÑоваÑÑ Ð¸ именованнÑе ÑкÑпоÑÑÑ Ð¸ ÑкÑпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ, Ñо понадобÑÑÑÑ Ð´Ð²Ðµ инÑÑÑÑкÑии:
export * from './user.js'; // Ð´Ð»Ñ ÑеÑкÑпоÑÑа именованнÑÑ ÑкÑпоÑÑов export {default} from './user.js'; // Ð´Ð»Ñ ÑеÑкÑпоÑÑа по ÑмолÑаниÑ
Такое оÑобое поведение ÑеÑкÑпоÑÑа Ñ ÑкÑпоÑÑом по ÑмолÑÐ°Ð½Ð¸Ñ â одна из пÑиÑин Ñого, поÑÐµÐ¼Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑазÑабоÑÑики Ð¸Ñ Ð½Ðµ лÑбÑÑ.
ÐÑого
ÐÐ¾Ñ Ð²Ñе ваÑианÑÑ export, коÑоÑÑе Ð¼Ñ ÑазобÑали в ÑÑой и пÑедÑдÑÑей главаÑ
.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ ÑебÑ, ÑиÑÐ°Ñ Ð¸Ñ Ð¸ вÑпоминаÑ, ÑÑо они ознаÑаÑÑ:
- ÐеÑед обÑÑвлением клаÑÑа/ÑÑнкÑии/â¦:
export [default] class/function/variable ...
- ÐÑделÑнÑй ÑкÑпоÑÑ:
export {x [as y], ...}.
- РеÑкÑпоÑÑ:
export {x [as y], ...} from "module"export * from "module"(не ÑеÑкÑпоÑÑиÑÑеÑexport default).export {default [as y]} from "module"(ÑеÑкÑпоÑÑиÑÑÐµÑ ÑолÑкоexport default).
ÐмпоÑÑ:
- ÐменованнÑе ÑкÑпоÑÑÑ Ð¸Ð· модÑлÑ:
import {x [as y], ...} from "module"
- ÐмпоÑÑ Ð¿Ð¾ ÑмолÑаниÑ:
import x from "module"import {default as x} from "module"
- ÐÑÑ ÑÑазÑ:
import * as obj from "module"
- ТолÑко подклÑÑиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ (его код запÑÑÑиÑÑÑ), но не пÑиÑваиваÑÑ ÐµÐ³Ð¾ пеÑеменной:
import "module"
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ поÑÑавиÑÑ import/export в наÑало или в ÐºÐ¾Ð½ÐµÑ ÑкÑипÑа, ÑÑо не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ.
То еÑÑÑ, ÑÐµÑ Ð½Ð¸ÑеÑки, ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ коÑÑекÑна:
sayHi();
// ...
import {sayHi} from './say.js'; // импоÑÑ Ð² конÑе Ñайла
Ðа пÑакÑике импоÑÑÑ, ÑаÑе вÑего, ÑаÑполагаÑÑÑÑ Ð² наÑале Ñайла. Ðо ÑÑо ÑолÑко Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑего ÑдобÑÑва.
ÐбÑаÑиÑе внимание, ÑÑо инÑÑÑÑкÑии import/export не ÑабоÑаÑÑ Ð²Ð½ÑÑÑи {...}.
УÑловнÑй импоÑÑ, Ñакой как ниже, ÑабоÑаÑÑ Ð½Ðµ бÑдеÑ:
if (something) {
import {sayHi} from "./say.js"; // ÐÑибка: импоÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð½Ð° веÑÑ
нем ÑÑовне
}
â¦Ðо ÑÑо, еÑли нам в Ñамом деле нÑжно импоÑÑиÑоваÑÑ ÑÑо-либо в завиÑимоÑÑи Ð¾Ñ ÑÑловий? Ðли в опÑеделÑнное вÑемÑ? ÐапÑимеÑ, загÑÑзиÑÑ Ð¼Ð¾Ð´ÑлÑ, ÑолÑко когда он ÑÑÐ°Ð½ÐµÑ Ð½Ñжен?
ÐÑ ÑаÑÑмоÑÑим динамиÑеÑкие импоÑÑÑ Ð² ÑледÑÑÑей главе.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)