Не загружается node.js модуль в main.js файле приложения на electron.js
Я разрабатываю приложение на electron.js и main.js стал слишком большим, я решил разбить его на модули. Но некоторые модули не грузятся и нарушают загрузку следующих после них модулей Мне необходимо установить причину такого поведения Так как нужно передать в модули созданное окно приложения для вызова событий клиента, использую следующую систему загрузки модулей:
const createWindow = () => {
mainWindow = new BrowserWindow({
...options
});
requireModules();
};
app.on('ready', createWindow);
// Загрузить модули после создания окна приложения
const requireModules = () => {
require('./modulesMain/open')(mainWindow);
require('./modulesMain/watchers')(mainWindow);
require('./modulesMain/testModule')(mainWindow);
};
Модули после require('./modulesMain/watchers')(mainWindow); не загружаются
Код модуля watchers:
const electron = require('electron');
const { ipcMain } = electron;
const chokidar = require('chokidar');
const { transfPathForWin } = require('./helpersMain/helpers');
let watchedArray = [];
module.exports = (mainWindow) => {
ipcMain.on('start-watching-dir', (event, dirPath, tabId) => {
const perviouslyThisTab = watchedArray.find((item) => item.id === tabId);
if (perviouslyThisTab) {
perviouslyThisTab.watcher.close();
}
watchedArray = watchedArray.filter((item) => item.id !== tabId);
try {
const winDirPath = transfPathForWin(dirPath);
const watcher = chokidar.watch(winDirPath, {
persistent: true,
ignored: '*.sys',
ignoreInitial: true,
followSymlinks: true,
cwd: '.',
disableGlobbing: false,
usePolling: false,
interval: 100,
binaryInterval: 300,
alwaysStat: false,
depth: 0,
awaitWriteFinish: {
stabilityThreshold: 2000,
pollInterval: 100,
},
ignorePermissionErrors: false,
atomic: true,
});
// Add event listeners.
watcher
.on('add', (path) => {
console.log(`File ${path} has been added`);
mainWindow.webContents.send('refresh-tab', { tabId, dirPath });
})
.on('change', (path) => {
console.log(`File ${path} has been changed`);
mainWindow.webContents.send('refresh-tab', { tabId, dirPath });
})
.on('unlink', (path) => {
console.log(`File ${path} has been removed`);
mainWindow.webContents.send('refresh-tab', { tabId, dirPath });
})
.on('ready', () =>
console.log('Initial scan complete. Ready for changes')
)
.on('addDir', (path) => {
if (path === '..\\..\\..') return;
console.log(`Directory ${path} has been added`);
mainWindow.webContents.send('refresh-tab', { tabId, dirPath });
});
.on('unlinkDir', (path) => {
if (path === '..\\..\\..') return;
console.log(`Directory ${path} has been removed`);
mainWindow.webContents.send('refresh-tab', { tabId, dirPath });
});
watchedArray.push({ id: tabId, path: dirPath, watcher });
} catch (err) {
// error watching - no access or something
}
});
ipcMain.on('stop-watching-dir', (event, dirPath, tabId) => {
const watchedItem = watchedArray.find((item) => item.id === tabId);
try {
watchedItem.watcher.close();
watchedArray = watchedArray.filter((item) => item.id !== tabId);
} catch (err) {
// error watching - no access or something
}
});
ipcMain.on('stop-watching-all', (event) => {
watchedArray.map((item) => item.watcher.close());
watchedArray = [];
});
ipcMain.on('close-tabs', (event, data) => {
const { excludedTabs } = data;
watchedArray = watchedArray.filter((item) => {
if (excludedTabs.includes(item.id)) {
return true;
} else {
item.watcher.close();
return false;
}
});
console.log('watchedArray', watchedArray);
});
};
Ответы (1 шт):
Я нашёл ошибку: она была из-за некорректного импорта const { transfPathForWin } = require('./helpersMain/helpers'); вместо const { transfPathForWin } = require('../helpersMain/helpers');, что вызвало ошибку конвертации путей. В дополнение, я забыл добавить console.log(err) в инструкцию catch(err), так что произошла ошибка chokidar без вывода в консоль. Причиной остановки загрузки модулей после watchers была система загрузки модулей с помощью функций module.exports = (mainWindow) => {...code}. Так если в функции ошибка, то и главная функция для загрузки модулей requireModules прекратит своё выполнение и, следовательно, остальные модули не будут загружены