#javascript #node.js
#javascript #node.js
Вопрос:
В javascript мы можем использовать module как одноэлементный.
//a.js
export default {str:'aaa'}
//b.js
import singleton from 'a.js'
singleton.str='bbb'
//c.js
import singleton from 'a.js'
singleton.str='ccc'
Я хочу использовать его для настройки моего модуля. Есть ли какой-либо риск? Он всегда будет одноэлементным в каждой модульной системе?
Ответ №1:
Я хочу использовать его для настройки моего модуля. Есть ли какой-либо риск? Он всегда будет одноэлементным в каждой модульной системе?
Да, модуль ESM (и модуль commonjs) гарантированно возвращает один и тот же экземпляр. **
Хотя это плохой дизайн (потому что это изменяемое глобальное состояние, которое любой может импортировать и изменять, и его трудно отслеживать) — он гарантированно всегда будет работать.
Если вас интересуют подробности о том, как Node.js загружает модули — вы можете увидеть ссылку на алгоритм распознавания в наших документах и соответствующие биты для CommonJS здесь.
На это можно положиться. Я попытаюсь объяснить, почему. Представьте, что модули не работают таким образом:
//a.js
export default class Foo { /* some code */ }
//b.js
import Foo from './a';
Если whenever b
и другие файлы импортируют класс Foo
, они могут получить другой экземпляр — такие вещи, как instanceof
не будут работать между модулями, и было бы невозможно полагаться на ссылки.
Как правило, именно поэтому это гарантируется и поддерживается.
В качестве забавной стороны модули node — ES являются живыми ссылками :]
** предостережение заключается в том, что можно «отказаться» — например, удалив модуль из require.cache
и установив require.parent
в commonjs. Однако это никогда не является поведением по умолчанию.
Комментарии:
1. полезный ответ, однако, есть ли какой-либо источник для его резервного копирования?
2. @Pac0 Я добавил источник, хотя, честно говоря, я не знаю этого, прочитав его — я в основном знаю это, работая над модулями в Node.js ядро — это то, на что на практике приложения полагаются довольно часто. Я добавлю больше информации
3. конечно, но некоторые ссылки на документы никогда не помешают. Ссылка на документ nodeja указывает это очень четко, даже для меня, который полностью устал от этой технологии. спасибо, отличный ответ сейчас.
4. @Pac0 во что бы то ни стало — запрос цитат и ссылок в ответах, как правило, является хорошей идеей, и ожидается, что ответы будут подтверждать вещи, которые нелегко доказуемы (например, если что-то гарантировано спецификацией платформы). Вы были правы, попросив ссылки, подтверждающие ответ здесь (и я ценю это).