Nodejs Tutorial 10: Модульность Nodejs

Node.js

Чтобы прочитать больше статей из этой серии, пожалуйста, посетите мойБлог GitHub, пример кода, пожалуйста, посетитездесь.

Nodejs определяет модули

Модульность Nodejs появляется раньше, поэтому она следует спецификации CommonJS, а не модульности ES6.

В модуляризации Nodejs наиболее часто используемыми модулями являются объект модуля, объект экспорта и метод require.

Где module и exports используются для экспорта модулей, а require используется для ссылки на модули.

Простой пример модуля

Пример кода: /lesson10/module1.js, /lesson10/require.js

Сначала создайте новый файл module1.js со следующим кодом:

module.exports.a = 1
module.exports.b = 2

let c = 3

В require.js импортируйте модуль и распечатайте:

const module1 = require('./module1')

console.log(module1)

Вы можете увидеть результат печати: { a: 1, b: 2 }.

Смысл этого кода следующий:

  1. module1.js выводит извне файл module.exports, который представляет собой объект, содержащий атрибуты a и b.
  2. Хотя переменная c определена в module1.js, она существует только в модуле module1.js и недоступна извне.
  3. Для ссылки на module1.js в require.js необходимо использовать относительный или абсолютный путь.
  4. Если ссылка сделана без пути, но имя модуля используется непосредственно, модуль в папке Node_Modules в каталоге проекта будет ссылаться по умолчанию, например:
const module2 = require('module2')

console.log(module2)  // { a: 1, b: 2 }

Если файл module2.js существует в папке node_modules в каталоге проекта в это время, на этот файл будет сделана ссылка.

Если его нет, он будет искать наличие module2 в папке node_modules системы, то есть глобально установленных модулей.

Если модуль еще не существует, будет сообщено об ошибке.

Модули, импортированные через require, могут называться произвольно, поэтому также можно написать const a = require('module2').

module.exports

Для экспорта модуля в приведенном выше примере вы также можете опустить модуль и написать его напрямую как exports.a = 1; exports.b = 1; ....

Но при использовании экспорта непосредственно для экспорта поддерживается только этот способ написания, если он написан как:

exports = {
  a: 1,
  b: 2
}

При ссылке на модуль можно получить только {}, что означает, что экспорт поддерживает только синтаксис exports.a = 1;.

Если вы хотите определить весь модуль напрямую как объект, функцию, переменную, класс, вам нужно использовать module.exports = 123.

следующим образом:

Пример кода: /lesson10/module3.js

module.exports = {
  a: 1,
  b: 2
}

module.exports = 123

module.exports = {
  a: 1,
  b: 2,
  c: 3
}

module.exports = function () {
  console.log('test')
}

module.exports = class {
  constructor(name) {
    this.name = name
  }

  show() {
    console.log(`Show ${this.name}`)
  }
}

module.exports позволяет присваивать модулям любой тип, но следует отметить, что в настоящее время module.exports похож на глобальную переменную в модуле.

При повторных присвоениях ему допустимо только последнее значение, а предыдущее значение будет перезаписано напрямую.

В этом примере модуль module3.js, наконец, экспортируется как класс.

Поэтому обычно рекомендуется использовать module.exports, чтобы избежать ошибок.