Как вы указали в своем вопросе и в соответствии с этим проблема Github в пакете nedb
, основная причина вашей проблемы заключается в том, что процесс разрешения файлов в веб-пакете читает ключ package.browser
, чтобы присвоить псевдоним конкретному файлупути к другому местоположению, когда сборка target
равна browser
или другому значению, которое заставит его проверять свойство package.browser
.
electron-vue
, по-видимому, обходит проблему связывания веб-пакетов, обработав все зависимости NPM как externals
, чтобы они не попали в комплект приложения и вместо этого, как ожидается, будут определены в global
другими способами.Аналогичным образом можно указать nedb
в качестве внешнего в конфигурации веб-пакета и вставить версию Node в свое приложение с помощью тега script или определить ссылку на него в global
другим способом.
Другое решение будетсоздайте плагин распознавателя веб-пакетов, чтобы переопределить, как проблематично требуются для разрешения "./lib/customUtils.js"
и "./lib/storage.js"
, минуя этап разрешения, который проверяет package.browser на наличие псевдонимов для этих путей к файлам.
См. Документацию веб-пакета для , как передать пользовательский плагин распознавателя в конфигурацию вашего веб-пакета.См. wepback/enhanced-resolve
документацию для получения дополнительной информации о , как определяются плагины и как они работают.
По сути, плагин - это объект с методом apply
, который принимает экземпляр resolver
и выполняет какой-то этап процесса разрешения файла.В приведенном ниже примере мы проверяем, находится ли текущий разрешаемый файл в пакете nedb
и является ли он одним из двух проблемных псевдонимов браузера.Если это так, мы выходим из процесса разрешения с правильными путями к файлам.В противном случае мы ничего не делаем и откладываем нормальный процесс разрешения.
// Prevents nedb from substituting browser storage when running from the
// Electron renderer thread.
const fixNedbForElectronRenderer = {
apply(resolver) {
resolver
// Plug in after the description file (package.json) has been
// identified for the import, which makes sure we're not getting
// mixed up with a different package.
.getHook("beforeDescribed-relative")
.tapAsync(
"FixNedbForElectronRenderer",
(request, resolveContext, callback) => {
// When a require/import matches the target files, we
// short-circuit the Webpack resolution process by calling the
// callback with the finalized request object -- meaning that
// the `path` is pointing at the file that should be imported.
const isNedbImport = request.descriptionFileData["name"] === "nedb"
if (isNedbImport && /storage(\.js)?/.test(request.path)) {
const newRequest = Object.assign({}, request, {
path: resolver.join(
request.descriptionFileRoot,
"lib/storage.js"
)
})
callback(null, newRequest)
} else if (
isNedbImport &&
/customUtils(\.js)?/.test(request.path)
) {
const newRequest = Object.assign({}, request, {
path: resolver.join(
request.descriptionFileRoot,
"lib/customUtils.js"
)
})
callback(null, newRequest)
} else {
// Calling `callback` with no parameters proceeds with the
// normal resolution process.
return callback()
}
}
)
}
}
// Register the resolver plugin in the webpack config
const config = {
resolve: {
plugins: [fixNedbForElectronRenderer]
}
}