В 13-й версии ноды ESM уже доступны и без флага "--experimental-modules". Мы готовися к полноценному переходу на mjs в наших бэкендах. Многие преимущества ESM и так очевидны, но есть некоторые, про которые не так много говорят. Одна из классных фич - это нормальная отработка циклических зависимостей. Обычно циклических зависимостей стоит избегать, но иногда они полезны. В нашем случае они полезны при работе с Sequelize. Для описания моделей Sequelize мы используем ES6. Допустим, у нас есть пользователь и его сообщения, описание моделей может выглядеть так:
Класс User:
import Message from './Message';Класс Message:
class User extends Base {
static schema = {
id : {
type: DT.UUID,
defaultValue: DT.UUIDV4,
primaryKey: true
}
};
static initRelations() {
this.hasMany( Message,{
foreignKey: 'userId',
as: 'messages'
});
}
}
export default User;
import User from './User';Мы видим, что у нас есть циклический импорт, но зависимости нам нужны уже в рантайме. Метод initRelations вызывается во время инициализации. Вот такая схема отлично работает в ES6, но не будет работать в CommonsJs.
class Message extends Base {
static schema = {
id : {
type: DT.UUID,
defaultValue: DT.UUIDV4,
primaryKey: true
},
userId : {
type: DT.UUID,
references: {
model: 'User',
key: 'id'
}
}
};
static initRelations() {
this.belongsTo(User, {
foreignKey: 'userId',
targetKey: 'id',
as: 'user'
});
}
}
export default Message;
Набросал пару отдельных примеров для теста: https://github.com/koorchik/node-import-vs-require