Eksport va import direktivalari bir nechta chaqiruv variantlariga ega.
Oldingi bobda biz oddiy foydalanishni koârdik, endi koâproq misollarni koârib chiqaylik.
Deklaratsiyadan oldin eksport qilish
Biz har qanday deklaratsiyani oâzgaruvchan, funktsiya yoki klass boâlishidan oldin export ni qoâyib eksport qilingan deb belgilashimiz mumkin.
Masalan, bu yerda barcha eksportlar yaroqli:
// massivni eksport qilish
export let months = ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
// konstantani eksport qilish
export const MODULES_BECAME_STANDARD_YEAR = 2015;
// klassni eksport qilish
export class User {
constructor(name) {
this.name = name;
}
}
Iltimos, export klass yoki funktsiyadan oldin uni "function-expressions-arrows" maqolasi topilmadi ga aylantirmasligini unutmang. Hali eksport qilingan boâlsa ham bu funktsiya deklaratsiyasi.
Koâpgina JavaScript uslubidagi qoâllanmalar ifodalardan soâng nuqta-vergulni tavsiya qiladi, lekin funktsiyalar va klass deklaratsiyalaridan keyin emas.
Shuning uchun export class va export function ning oxirida nuqta-vergul boâlmasligi kerak.
export function sayHi(user) {
alert(`Hello, ${user}!`);
} // ; oxirida yo'q
Deklaratsiyadan tashqari eksport qilish
Bundan tashqari, biz export ni alohida-alohida qoâyishimiz mumkin.
Bu yerda biz avval eâlon qilamiz, keyin eksport qilamiz:
// ð say.js
function sayHi(user) {
alert(`Salom, ${user}!`);
}
function sayBye(user) {
alert(`Hayir, ${user}!`);
}
export {sayHi, sayBye}; // eksport qilingan o'zgaruvchanlar ro'yxati
â¦Yoki texnik jihatdan biz export funktsiyalarini ham yuqoriga qoâyishimiz mumkin.
Import*
Odatda, import {...} ga nimani import qilish kerakligi roâyxatini qoâyamiz:
// ð main.js
import {sayHi, sayBye} from './say.js';
sayHi('John'); // Salom, John!
sayBye('John'); // Hayir, John!
Ammo agar roâyxat uzun boâlsa, biz hamma narsani import * as <obj> yordamida obyekt sifatida import qilishimiz mumkin, masalan:
// ð main.js
import * as say from './say.js';
say.sayHi('John');
say.sayBye('John');
Bir qarashda âhamma narsani import qilishâ juda ajoyib narsa boâlib tuyuladi, qisqasi, nima uchun biz import qilishimiz kerak boâlgan narsalarni aniq roâyxatlashimiz kerak?
Xoâsh, ozgina sabablar bor.
-
Zamonaviy qurilish vositalari (webpack va boshqalar) modullarni birlashtiradilar va yuklashni tezlashtirish va foydalanilmayotgan narsalarni olib tashlash uchun ularni optimallashtirish.
Aytaylik, biz oâz loyihamizga uchinchi tomon kutubxonasini qoâshdik
lib.jskoâplab funktsiyalar bilan:// ð say.js export function sayHi() { ... } export function sayBye() { ... } export function becomeSilent() { ... }Endi bizning loyihamizda ulardan faqat bittasi kerak boâlsa:
// ð main.js import {sayHi} from './say.js';â¦Keyin optimallashtiruvchi uni avtomatik ravishda aniqlaydi va toâplamdagi koddan boshqa funktsiyalarni butunlay olib tashlaydi va shu bilan tuzilishini kichiklashtiradi. Bu âtree-shakingâ deyiladi.
-
Import qilinadigan narsalarning aniq roâyxati qisqartirilgan ismlarni beradi:
lib.sayHi()oârnigasayHi(). -
Aniq import kod tuzilishi haqida yaxshiroq maâlumot beradi: nima ishlatiladi va qayerda. Bu kodni qoâllab-quvvatlash va qayta ishlashni osonlashtiradi.
Import âqanday qilibâ
Shuningdek, biz turli xil nomlar ostida import qilish uchun as dan foydalanishimiz mumkin.
Masalan, qisqacha uchun sayHi ni mahalliy hi oâzgaruvchaniga, sayBye uchun ham import qilaylik:
// ð main.js
import {sayHi as hi, sayBye as bye} from './say.js';
hi('John'); // Salom, John!
bye('John'); // Hayir, John!
Eksport âqanday qilibâ
Shunga oâxshash sintaksis export uchun mavjud.
Keling, funktsiyalarni hi va bye sifatida eksport qilaylik:
// ð say.js
...
export {sayHi as hi, sayBye as bye};
Endi hi va bye â bu begonalarning rasmiy ismlari:
// ð main.js
import * as say from './say.js';
say.hi('John'); // Salom, John!
say.bye('John'); // Hayir, John!
Standart eksport
Hozirgacha biz bir nechta narsalarni qanday qilib import/eksport qilishni koârdik, ixtiyoriy ravishda boshqa ismlar âsifatidaâ.
Amalda, modullar quyidagilarni oâz ichiga oladi:
lib.jskabi kutubxona, funktsiyalar toâplami.- Yoki
user.jsdaclass Usersingari obyekt, butun modulda faqat shu klass mavjud.
Har bir ânarsaâ oâz modulida joylashgan boâlishi uchun, asosan, ikkinchi yondashuvga ustunlik beriladi.
Tabiiyki, bu juda koâp fayllarni talab qiladi, chunki hamma narsa oâz modulini xohlaydi, ammo bu umuman muammo emas. Aslida, fayllar yaxshi nomlangan va papkalarga tuzilgan boâlsa, kodni boshqarish osonroq boâladi.
âModulda bitta narsaâ koârinishini yaxshilash uchun modullar standart eksport sintaksisini taqdim etadi.
Buning uchun export va import soâzlari kerak:
- Modulning âasosiy eksportiâ oldidan
standart eksportiqoâying. - Jingalak qavslarsiz
importni chaqirish.
Masalan, bu yerda user.js class User ni eksport qiladi:
// ð user.js
export default class User { // faqat qo'shing "default"
constructor(name) {
this.name = name;
}
}
Va main.js uni import qiladi:
// ð main.js
import User from './user.js'; // {User} emas, balki User
new User('John');
Jingalak qavssiz import yanada chiroyli koârinishga ega. Modullardan foydalanishni boshlashda keng tarqalgan xato bu jingalak qavslarni umuman unutishdir. Esda tutingki, import nomlangan import uchun jingalak qavslarga muhtoj va ularni asl qiymati uchun kerak emas.
| Nomlangan eksport | Standart eksport |
|---|---|
export class User {...} |
export default class User {...} |
import {User} from ... |
import User from ... |
Tabiiyki, bitta faylga bitta âstandartâ eksport boâlishi mumkin.
Biz bitta modulda ham standart, ham nomlangan eksportga ega boâlishimiz mumkin, ammo amalda odamlar odatda ularni aralashtirmaydilar. Modulda nomlangan yoki standart eksport bor.
Shuni taâkidlash kerakki, nomlangan eksportlar (tabiiy ravishda) nomga ega boâlishi kerak, standart eksport esa nomaâlum boâlishi mumkin.
Masalan, bularning barchasi toâliq amal qiladigan standart eksport:
export default class { // klass nomi yo'q
constructor() { ... }
}
export default function(user) { // funktsiya nomi yoâq
alert(Salom, ${user}!);
}
// o'zgarmaydigan holda bitta qiymatni eksport qilish
export default ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
Bu juda yaxshi, chunki standart eksport har bir fayl uchun bittadan, shuning uchun import har doim nimani import qilishni biladi.
Buning aksincha, nomlangan import uchun nomni tashlab qoâyish xato boâladi:
export class { // Xato! (standart bo'lmagan eksport uchun nom kerak)
constructor() {}
}
âStandartâ taxallus
âDefaultâ soâzi sukut boâyicha eksport qilish uchun biron bir âtaxallusâ dir, biz unga qandaydir murojaat qilishimiz kerak boâlganda ishlatamiz.
Masalan, agar bizda allaqachon eâlon qilingan funktsiya mavjud boâlsa, uni qanday qilib standart eksport qilish mumkin:
function sayHi(user) {
alert(`Salom, ${user}!`);
}
export {sayHi as default}; // xuddi biz funktsiyadan oldin "standart eksportni" qo'shganimiz bilan bir xil
Yoki, deylik user.js moduli bitta asosiy âstandartâ narsani va bir nechta nomlangan narsalarni eksport qiladi (kamdan-kam hollarda boâladi, lekin shunday):
// ð user.js
export default class User {
constructor(name) {
this.name = name;
}
}
export function sayHi(user) {
alert(`Salom, ${user}!`);
}
Standart eksportni nomi bilan birga qanday import qilish mumkin:
// ð main.js
import {default as User, sayHi} from './user.js';
new User('John');
Yoki * ni obyekt sifatida import qilishni koârib chiqsak, u holda default xususiyati asl eksport hisoblanadi:
// ð main.js
import * as user from './user.js';
let User = user.default; // the default export
new User('John');
A word against default exports
Standart eksportdan foydalanishimiz kerakmi?
Standart eksportdan foydalanishda ehtiyot boâlish kerak, chunki ularni saqlab qolish biroz boshqacha.
Nomlangan eksport aniq. Ular import qilgan narsalarini aniq nomlashadi, shuning uchun bizda ulardan maâlumot bor, bu yaxshi narsa.
Shuningdek, nomlangan eksport bizni import qilish uchun toâgâri nomdan foydalanishga majbur qiladi:
import {User} from './user.js';
// import {MyUser} won't work, the name must be {User}
Standart eksport uchun biz oâzimiz nom yaratishimiz kerak:
import MyUser from './user.js'; // import Anywhere ... bo'lishi mumkin va u ishlaydi
Shunday qilib, jamoa aâzolari bitta narsa uchun turli xil nomlarni ishlatishlari uchun biroz koâproq erkinlik ishlatilishi mumkin.
Odatda, bunga yoâl qoâymaslik va kodni izchil saqlash uchun import qilinadigan oâzgaruvchanlar fayl nomlariga mos kelishi kerak boâlgan qoida mavjud, masalan:
import User from './user.js';
import LoginForm from './loginForm.js';
import func from '/path/to/func.js';
...
Boshqa bir yechim â hamma joyda nomlangan eksportlardan foydalanish. Faqat bitta narsa eksport qilingan boâlsa ham, u default holda nom ostida eksport qilinadi.
Bu shuningdek qayta eksportni (pastga qarang) biroz osonlashtiradi.
Qayta eksport
âQayta eksportâ sintaksisini export ... from ... narsalarni import qilish va ularni darhol eksport qilishga imkon beradi (ehtimol boshqa nom ostida), masalan:
export {sayHi} from './say.js'; // re-export sayHi
export {default as User} from './user.js'; // re-export default
Buning maânosi nima, nima uchun bunga ehtiyoj bor? Keling, amaliy foydalanish misolini koârib chiqaylik.
Tasavvur qiling, biz âpaketâ yozmoqdamiz: koâpgina modullarga ega papka, asosan ichki qismga kerak, baâzi funktsiyalari tashqariga eksport qilinadi (NPM kabi vositalar paketlarni nashr etish va tarqatishga imkon beradi, ammo bu yerda bu muhim emas).
Direkrora tuzilishi shunday boâlishi mumkin:
auth/
index.js
user.js
helpers.js
tests/
login.js
providers/
github.js
facebook.js
...
Paketning ishlashini bitta kirish nuqtasi, yaâni auth/index.js âasosiy faylâ orqali quyidagi tarzda ishlatishni istaymiz:
import {login, logout} from 'auth/index.js'
Gâoya shundan iboratki, bizning paketimizdan foydalanadigan begonalar, ishlab chiquvchilar uning ichki tuzilishiga aralashmasliklari kerak. Ular bizning paket papkamizdagi fayllarni qidirmasliklari kerak. Biz faqat auth/index.js da kerakli narsalarni eksport qilamiz va qolganlarini qiziquvchan koâzlardan yashiramiz.
Endi, haqiqiy eksport qilingan funktsiyalar paket orasida tarqalib ketganligi sababli, biz uni auth/index.js da toâplashimiz va âqayta eksportâ qilishimiz mumkin:
// ð auth/index.js
// import login/logout and immediately export them
import {login, logout} from './helpers.js';
export {login, logout};
// import default as User and export it
import User from './user.js';
export {User};
...
âQayta eksportâ bu shunchaki qisqartirilgan belgi:
// ð auth/index.js
// re-export login/logout
export {login, logout} from './helpers.js';
// yoki barcha yordamchilarni qayta eksport qilish uchun foydalanishimiz mumkin:
// export * from './helpers.js';
// re-export the default export as User
export {default as User} from './user.js';
...
Iltimos, diqqat qiling: export User from './user.js' ishlamaydi. Bu aslida sintaksis xatosi. Standart eksportni qayta eksport qilish uchun uni yuqoridagi misolda boâlgani kabi {default as ...} deb aniq aytib oâtishimiz kerak.
Bundan tashqari, yana bir gâalati narsa bor: export * from './user.js' standart eksportdan tashqari faqat nomlangan eksportni qayta eksport qiladi. Yana bir bor buni aniq aytib oâtishimiz kerak.
Masalan, hamma narsani qayta eksport qilish uchun ikkita ifoda kerak boâladi:
export * from './module.js'; // nomlangan eksportni qayta eksport qilish
export {default} from './module.js'; // standart qayta eksport qilish
Sukut boâyicha faqat qayta eksport qilishda aniq koârsatilishi kerak: import * as obj yaxshi ishlaydi. Standart eksportni obj.default sifatida import qiladi. Shunday qilib, bu yerda import va eksport konstruktsiyalari oârtasida bir oz assimetriya mavjud.
Xulosa
Eksportning quyidagi turlari mavjud:
- Deklaratsiyadan oldin:
export [default] class/function/variable ...
- Mustaqil:
export {x [as y], ...}.
- Qayta eksport:
export {x [as y], ...} from "mod"export * from "mod"(sukut boâyicha qayta eksport qilmaydi).export {default [as y]} from "mod"(standart qayta eksport qilish).
Import:
- Moduldan nomlangan eksport:
import {x [as y], ...} from "mod"
- Standart eksport:
import x from "mod"import {default as x} from "mod"
- Hammasi:
import * as obj from "mod"
- Faqat modulni olib keling/baholang, import qilmang:
import "mod"
Import/eksport ifodalarini boshqa kodning ostiga yoki undan keyin qoâyishimiz mumkin, bu muhim emas.
Shunday qilib, bu texnik jihatdan yaxshi:
sayHi();
import {sayHi} from './say.js'; // fayl oxirida import qilish
Amalda import odatda faylning boshida boâladi, lekin bu faqat qulaylik uchun.
{...} ichida import/eksport ifodalari ishlamayotganligini unutmang.
Shunga oâxshash shartli import ishlamaydi:
if (something) {
import {sayHi} from "./say.js"; // Xato: import yuqori darajada bo'lishi kerak
}
â¦Ammo, albatta, biror narsani shartli ravishda import qilishimiz kerak boâlsachi? Yoki oâz vaqtida? Shunga oâxshab, modulni iltimosiga binoan yuklang, qachon kerak boâlsa.
Dinamik importni keyingi bobda koârib chiqamiz.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)