WebPack Как исключить папку из сборки?
WebPack Как исключить папку из сборки?
У меня есть изоморфное React прилжоение. На сервере оно рендерит данные из базы данных напрямую, а на клиенте должно к api запросы давать.
в мной написанной функции useQuery({}) я использую изоморфный код, примерно такой:
function useQuery(){
if(process.isBrowser){
return require('./api')
}
return require('../server/api')
}
Вебпак при сборке клиент-версии всё ровно ../server/api в сборку пытается пихать, вместе со всем сервером, со всеми секретными api методами, их реализацией, базой данных и.т.п.
Как мне ВООБЩЕ НАСИЛЬНО исключить все файлы которые находятся в папке server? чтобы если на клиенте и выполнится (а оно не выполнится) require('../server/api') то чтобы оно undefined возвращало?
То есть как мне вообщее НАМЕРТВО защитить папку server от попадания на клиент?
Ни exclude ни externals не работают, например если я эксплюжу и екстерналю все файлы из папки /server/** то если они внутри себя что-то импортируют из node_modules, то оно всё ровно в сборку пытается пихаться, и бывает ругается что модуль fs отсутствует, или mongodb отсутствует.
Как сделать чтобы вебпак ВООБЩЕ не анализировал папку server и при попытке запросить от туда любой файл возвращал undefined? То есть прям всё, табу, святое, секретные данные. Чтобы вебпак взорвался, но ни одного бита из папки server в клиент не пропустил. Как такое провернуть?
Ответы (1 шт):
Я побыстрому написал решение, кому надо юзайте =) Кто знает лучше - скажите плиз, мне кажется должен быть какой-то более нативный способ.
function excludeDir(excludedDirs = []) {
if (typeof excludedDirs === 'string') {
excludedDirs = [excludedDirs]
}
const nodePath = require('path');
const fileInDir = (filePath, dirPath) => {
if (dirPath === filePath) return true
const relative = nodePath.relative(dirPath, filePath)
return relative && !relative.startsWith('..') && !nodePath.isAbsolute(relative)
}
return (context, request, callback) => {
const filePath = nodePath.resolve(context, request)
const fileInExcludedDir = excludedDirs.some(excludedDir => {
return fileInDir(filePath, excludedDir)
})
if (fileInExcludedDir) {
return callback(null, `commonjs ${ request }`);
}
callback();
}
}
// usage
webpackConfig.externals = [excludeDir('./server')]
Теперь все импорты require('../server/api') заменятся буквально на require('../server/api'), а по скольку у вас функции require в глобальной области видимости в браузере нет, то такие запросы будут бросать ошибку =) что нам и нужно было. Теперь даже если вы случайно импортнете что-то, что случайно импортит что-тот из секретной папки, то это просто выбросит ошибку на клиенте =)! Ура!