modules.exports - это то же самое, что «this» в Common Js? - PullRequest
1 голос
/ 16 января 2020

Я случайно использовал require() на модуле javascript, предназначенном для использования с браузером. Модуль установлен this['libraryName'] = .... Я заметил, что это на самом деле работает .

Итак, я создал 2 файла:

test1.js

console.log( require('./test2.js'))

test2.js

console.log(this === module.exports)
this.SOMETHING = 10

Результат?

$ node ./test1.js 
true
{ SOMETHING: 10 }
$

Я этого не ожидал! Это true означает, что module.exports - это ЖЕ, как this в глобальном контексте.

  • Это новое?
  • Это часть спецификации?
  • Разве это не облегчает создание файлов, которые будут работать, если они будут импортированы ИЛИ требуются?
  • Если это работает, почему мы все еще выполняем всю проверку typeof require === 'undefined'?
    • Я не замечал чего-то такого важного в течение лет ?

1 Ответ

0 голосов
/ 26 февраля 2020
  1. Это не ново:
    1. Что такое «глобальный» объект в NodeJS
    2. Значение «this» в node.js модули и функции
    3. Почему оператор возврата уровня модуля работает в Node.js?
    4. et c.
  2. Это не является частью спецификации https://nodejs.org/api/globals.html#globals_global

    Это означает, что в браузерах, если вы находитесь в глобальной области видимости, что-то будет определить глобальную переменную. В Node.js это отличается .

    Когда некоторые вещи отличаются, они определенно не являются частью каких-либо спецэффектов c.

  3. Разве это не упрощает создание файлов, которые будут работать, если они будут импортированы ИЛИ требуются?

    Не видите как. В node.js this.SOMETHING = 10 меняется только одно имя (module.exports) на другое (this). Ничего больше.
    И если вы попытаетесь импортировать test2.js в браузер с помощью веб-пакета или <script type="module" src="..."></script>, вы получите TypeError: undefined has no properties в обоих случаях.

  4. typeof require === 'undefined'

    Может быть, вам будет лучше с browser-require, browserify или чем-то подобным.

...