ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² ΠΌΠΎΠ΄ΡΠ»ΡΡ ?
ΠΠΎΠ»Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ Π΄Π²ΠΈΠΆΠΎΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΈΠΊΠ» Π² ESM:
// a.js
import { b } from "./b.js";
console.log("a.js Π·Π°Π³ΡΡΠΆΠ΅Π½, b =", b);
export const a = "A";
// b.js
import { a } from "./a.js";
console.log("b.js Π·Π°Π³ΡΡΠΆΠ΅Π½, a =", a);
export const b = "B";
ΠΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π΅ΡΠ»ΠΈ ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° β a.js):
- ΠΠ²ΠΈΠΆΠΎΠΊ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠ°ΡΡΠΈΡΡ
a.js, Π²ΠΈΠ΄ΠΈΡimportΠΈΠ·b.js - ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠ°ΡΡΠΈΠ½Π³Ρ
b.js b.jsΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΡaΠΈΠ·a.js, Π½ΠΎa.jsΠ΅ΡΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΡΡaΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°, Π½ΠΎ Π΅ΡΡ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°b.jsΠ²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ:console.log("b.js Π·Π°Π³ΡΡΠΆΠ΅Π½, a =", undefined)bΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ"B"- ΠΠΎΠ·Π²ΡΠ°Ρ ΠΊ
a.js:console.log("a.js Π·Π°Π³ΡΡΠΆΠ΅Π½, b =", "B") aΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ"A"
Π CommonJS ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠ°, Π½ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄ΡΡΠ³ΠΎΠΉ:
// a.js (CJS)
const { b } = require("./b");
console.log("a.js Π·Π°Π³ΡΡΠΆΠ΅Π½, b =", b);
module.exports = { a: "A" };
// b.js (CJS)
const { a } = require("./a");
console.log("b.js Π·Π°Π³ΡΡΠΆΠ΅Π½, a =", a); // undefined β a.js Π΅ΡΡ Π½Π΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»
module.exports = { b: "B" };
ΠΠΎΡΠ΅ΠΌΡ ESM ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π»ΡΡΡΠ΅ β live bindings:
// counter.js (ESM)
import { increment as incFromB } from "./b-counter.js";
export let count = 0;
export function increment() {
count++;
}
// b-counter.js (ESM)
import { count } from "./counter.js";
export function increment() {
// count β ΠΆΠΈΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ°, Π²ΠΈΠ΄ΠΈΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
console.log("b Π²ΠΈΠ΄ΠΈΡ count =", count);
}
// ΠΠ°ΠΆΠ΅ ΠΏΡΠΈ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ
live binding ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ
Π Π΅Π°Π»ΡΠ½ΡΠ΅ ΠΊΠ΅ΠΉΡΡ
ΠΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΈΠΊΠ» Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅:
// β Π’ΠΈΠΏΠΈΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
// user.js
import { Order } from "./order.js";
export class User {
getOrders() {
return Order.findByUser(this.id);
}
}
// order.js
import { User } from "./user.js";
export class Order {
getUser() {
return User.findById(this.userId);
}
}
// User ΠΈ Order ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° β ΡΠΈΠΊΠ»!
ΠΠ°ΠΊ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ β Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΠ΅Π΅ Π² ΡΡΠ΅ΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ:
// β
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 1: ΡΡΠ΅ΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ-ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ
// repository.js
import { User } from "./user.js";
import { Order } from "./order.js";
export function getOrdersForUser(userId) {
return Order.findByUser(userId);
}
export function getUserForOrder(order) {
return User.findById(order.userId);
}
// β
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 2: Π»Π΅Π½ΠΈΠ²ΡΠΉ ΠΈΠΌΠΏΠΎΡΡ
// user.js
export class User {
async getOrders() {
const { Order } = await import("./order.js");
return Order.findByUser(this.id);
}
}
Π Π΅Π·ΡΠΌΠ΅
Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΎΠ±Π΅ΠΈΡ
ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
, Π½ΠΎ ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΌ undefined. ESM ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π»ΡΡΡΠ΅ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ live bindings, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ²ΠΎΠ΄ ΠΌΠΈΡΠΈΡΡΡΡ Ρ ΡΠΈΠΊΠ»Π°ΠΌΠΈ. ΠΡΡΡΠΈΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ β ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³: Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»Π΅Π½ΠΈΠ²ΡΠΉ import().