Чтобы прочитать больше статей из этой серии, пожалуйста, посетите мойБлог 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 }.
Смысл этого кода следующий:
- module1.js выводит извне файл module.exports, который представляет собой объект, содержащий атрибуты a и b.
- Хотя переменная c определена в module1.js, она существует только в модуле module1.js и недоступна извне.
- Для ссылки на module1.js в require.js необходимо использовать относительный или абсолютный путь.
- Если ссылка сделана без пути, но имя модуля используется непосредственно, модуль в папке 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, чтобы избежать ошибок.