Меню

Модули в nodejs

30.06.2018 - Back-end, NodeJS

Modules (Модули)

Когда мы просто объявляем переменную или функцию, то она попадает в глобальную область видимости. Например, когда мы объявляем функцию, например var function = sayHello() {}, то эта функция попадает в глобальную область видимости и она доступна через объект windowwindow.sayHello().

Но есть проблема с таким поведением. В реальном приложении, мы часто разделяем код на несколько файлов. Допустим у нас несколько файлов, и в каждом из них определена функция с одним и тем же названием — например sayHello. Т.к. эта функция объявлена в глобальной области видимости, когда мы определяем функцию с таким же названием в другом файле, новая имплементация переписывает старую. Эта проблема глобальной области видимости. Что бы построить надежное и расширяемое приложение, мы должны избегать объявления функций и переменных в глобальной области видимости. Вместо этого нам нужны — МОДУЛИ.

Нам нужно создать маленькие строительные блоки — или модули, где мы будем определять наши переменные и функции. Теперь две одинаковые функции или переменные, не перепишут друг друга. Инкапсуляция в модуле.

В ядре NodeJS есть концепция — MODULE. Каждый файл в nodejs рассматривается как модуль. Все функции и переменные объявленные в файле, остаются в его области видимости. В объектно-ориентированном программировании мы бы сказали, что они приватные (private). Они не доступны вне контейнера, или модуля. Для того чтобы сделать их доступными из вне, вам нужно явно их экспортировать и сделать публичными.

Каждое приложение nodejs имеет как минимум один файл, или один модуль, который мы называем главный модуль.

Давайте посмотрим на module.

console.log(module);

Мы можем подумать, что этот объект (module), который мы указали в console.log — глобальный. Т.е. мы можем подумать что можно получить к нему доступ через global.module. Но на самом деле — это не глобальный объект. Позже мы разберемся почему.

Давайте посмотрим на содержимое module через вывод в консоли.

Module {
  id: '<repl>',
  exports: {},
  parent: undefined,
  filename: null,
  loaded: false,
  children: [],
  paths:
   [ '/home/user/first-app/repl/node_modules',
     '/home/user/first-app/node_modules',
     '/home/user/node_modules',
     '/node_modules',
     '/home/user/.node_modules',
     '/home/user/.node_libraries',
     '/home/user/.nvm/versions/node/v10.5.0/lib/node' ] }

Как вы видите у нас есть объект — Module.
У каждого модуля есть id. Есть свойство exports, parent, filename — с полным путём до текущего модуля, loaded — булеан, который говорит загрузился модуль или нет, есть свойство children и path. Позже мы разберемся со всеми этими свойствами.

Метки: , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *