Webpack build and dirname
Проект в котором много папок, файлов внутри папок, собираю в один файл и при запуске все фрагменты кода где есть чтение через path.dirname(__dirname) возвращают корневую папку, соответственно все пути в коде сбитые.
Например есть модуль админ в котором __dirname = Admin Но после сборки и запуске __dirname = Server Потому что папки админ не существует уже, а вебпак собрал все в один файл который я запускаю в папке Server
webpack.config.js
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const path = require('path')
const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
target: 'node',
mode: isProduction ? 'production' : 'development',
devtool: 'source-map',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, '../../serverstart/packages/server'),
filename: 'index.js'
},
resolve: {
extensions: ['*', '.ts', '.tsx', '.js', '.json']
},
plugins: [new CleanWebpackPlugin()],
externalsPresets: { node: true },
node: {
__dirname: true,
},
externals: [
nodeExternals({
allowlist: ['crypto-random-string', 'rage-rpc']
})
],
}
Далее в коде я пытаюсь открыть файл
fs.readdirSync(path.resolve(__dirname)).forEach(dir => {
console.log(dir)
}
На что получаю ошибку
Error: ENOENT: no such file or directory, scandir 'F:\gambit\serverstart\src\database'
А все из-за того что __dirname показывает фактический путь, вебпак собрал все в один файл, а в исходном проекте у меня куча модулей, папок и файлов, везде прописан путь к ним
Источник: Stack Overflow на русском