Очередная задачка с собеседования

Представим такую ситуацию, вы разрабатываете приложение на Node.js. Ваша рабочая ОС — Mac OS или Windows. Вы пишите что-то типа:

company.js:
----------
module.exports = {
name: 'GeekJOB.ru'
};
----------
main.js:
----------
const Company_1 = require('./company');
const Company_2 = require('./company');
Company_1.name = 'New.HR';

console.log(Company_1) // ???
console.log(Company_2) // ???
console.log(Company_1 === Company_2) // ???

Итак вопросы:

  • Что будет в объектах?
  • Будут ли равны эти два объекта?
  • Будут ли ошибки?

Слушаем ответы и продолжаем задавать вопросы. Теперь напишем еще пару строчек:

const Company_3 = require('./Company');

console.log(Company_3) // ???
console.log(Company_3 === Company_1) // ???
console.log(Company_3 === Company_2) // ???

И что теперь?

Далее вы деплоите все это на Linux сервер (CentOS, Ubuntu, etc) и вопрос:

  • Изменится ли что-либо?

Спойлеры

console.log(Company_1) // New.HR
console.log(Company_2) // New.HR
console.log(Company_1 === Company_2) // TRUE
console.log(Company_3) // GeekJOB.ru
console.log(Company_3 === Company_1) // FALSE
console.log(Company_3 === Company_2) // FALSE

И когда вы задеплоите все это на Linux сервер, то результаты будут такими:

console.log(Company_1) // New.HR
console.log(Company_2) // New.HR
console.log(Company_1 === Company_2) // TRUE
internal/modules/cjs/loader.js:638
throw err;
^
Error: Cannot find module './Company'

Объяснение

Все очень просто. Mac OS и Windows имеют регистронезависимую файловую систему, отсюда нет разницы между Company.js и company.js

Но вот Linux, как правило, используют регистрозависимые файловые системы, а посему можно создать в одной директории два файла сразу Company.js и company.js и это будут два разных файла.

Но(!), хоть файловые системы регистронезависимы, тем не менее кеш модульной системы различает регистры, поэтому файл company.js будет прочтен дважды и закеширован как два разных модуля на Mac OS и Windows системах.

Ну вот и все, никакой магии, но часы отладки, если не знать таких нюансов.