Невозможно найти модули, требуемые в Реагировании

Я проходил через кодовую базу React, и я заметил, как React require работает не так, как в Nodejs. Я не понимаю, что здесь происходит.

Например, посмотрите на строку 19 на ReactClass.js, там require('emptyObject'), но emptyObject не указан в package.json, и он не говорит нигде, откуда приходит этот модуль.

https://github.com/facebook/react/blob/master/src/isomorphic/classic/class/ReactClass.js#L19

Я нашел "emptyObject" на npmjs, но API там отличается от используемого в React; .isEmpty grepped in React не связан с emptyObject.

Итак, где emptyObject загружается и как React require делает то, что он делает? Это неинтуитивно. На всех.

Ответ 1

Местоположение модуля emptyObject, к которому относится React, относится к https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/emptyObject.js#L9 Обратите внимание, что он не соответствует системе модулей CommonJS.

Чтобы Facebook стал делиться и потреблять наш собственный JavaScript. В первую очередь это позволит нам отправлять код, не беспокоясь о том, где он живет, и поддерживает дух @providesModule, но работает в более широкой экосистеме JavaScript.

От https://github.com/facebook/fbjs#purpose

Способ определения модуля путем добавления @providesModule в заголовок лицензии и загрузки этих модулей с помощью require в Node называется Haste - настраиваемой системой модулей, созданной для проектов с открытым исходным кодом для Facebook.

На самом деле, если вы не хотите понять внутреннюю работу React или внести вклад в проекты с открытым исходным кодом Facebook, вам не нужно это знать. Другими словами, не рекомендуется использовать Haste для написания собственного проекта.

В то же время модуль invariant, загружаемый по строке 10 ReactClass.js, объявляется в https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/__forks__/invariant.js#L9

Насколько я знаю, оба Eclipse и WebStorm не поддерживают Haste, поэтому среда IDE не может помочь. Но с Haste имя файла и модуля должно быть одинаковым, поэтому вы можете найти модуль, выполнив поиск имени файла, то есть двойной сдвиг в Webstorm и Ctrl + Shift + r в Eclipse. Тем не менее, emptyObject, о котором вы спрашивали, или invariant, не являются частью React, поэтому он все еще громоздко обнаруживает их происхождение.

В противном случае есть команда, которая делится и организует то, что они узнают, от взлома React, который я иногда вношу, и они связали те require, следуя Haste в соответствующий файл происхождения, например. https://annot.io/github.com/facebook/react/blob/cc3dc21/src/isomorphic/classic/class/ReactClass.js?l=19 Вы можете увидеть это.

Ответ 2

Я заметил, как React require работает не так, как в Nodejs.

Right. У Facebook есть собственный модуль-загрузчик. Все модули имеют уникальные идентификаторы, предоставляемые директивой @providesModule в каждом модуле. Это позволяет использовать идентификатор для загрузки модуля вместо пути к файлу.

Конечно, это не работает в среде Node.js. Поэтому, когда React или любой другой проект Facebook публикуется до npm, все вызовы require автоматически переписываются на то, что понимает Node.

Эта функция предоставляется fbjs, которая содержит общие зависимости и создает помощники для всех проектов Facebook. Здесь вы найдете модуль emptyObject.

Если вы посмотрите React gulp file, вы увидите, как построены карты модулей, и что пользовательский плагин Babel используется для конвертировать все вызовы require.