ERROR in ./node_modules/redis-parser/lib/hiredis.js
Module not found: Error: Can't resolve 'hiredis' in
error Command failed with exit code 2.
Конфиг вебпака следующий:
var path = require('path')
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: ['babel-loader']
}
]
},
target: 'node'
}
пакет.json
{
"version": "1.0.0",
"main": "src/index.js",
"license": "MIT",
"dependencies": {
"dotenv": "^4.0.0",
"koa": "^2.3.0",
"koa-bodyparser": "^4.2.0",
"koa-router": "^7.2.1",
"node-fetch": "^1.7.1",
"redis": "^2.7.1"
},
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-loader": "^7.1.1",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.23.0",
"babel-preset-env": "^1.5.2",
"webpack": "^3.0.0"
},
"scripts": {
"start": "node dist/bundle",
"build": "webpack"
},
"babel": {
"presets": [
[
"env",
{
"targets": {
"node": "current"
}
}
]
],
"plugins": [
"transform-object-rest-spread",
"transform-class-properties"
]
}
}
Это должно быть связано с webpack. Я решил эту проблему с помощью плагина nodeExternals в конфигурации веб-пакета:
const nodeExternals = require('webpack-node-externals')
module.exports = {
...
externals: [nodeExternals()],
target: 'node'
}
nodeExternals пропускает любой модуль в папке node_modules при связывании на стороне сервера.
Это проблема с вебпаком.
На самом деле, это не проблема с Webpack. Это проблема с тем, как redis-parser
использовал hiredis
. Эту проблему можно решить путем обновления до redis-parser
3.0, которая решает именно эту проблему.
@guidobouman , как мы можем использовать redis-parser
3.0 без разветвления node_redis и обновления этой единственной зависимости? Я искал решение этой проблемы в течение нескольких недель без успеха.
@guidobouman любой действительный код JS должен подойти для Webpack
. Кажется, что это не так, и это печально. Кроме того: мне очень интересно, почему кто-то захочет использовать Webpack на Redis. Минимизация кода на стороне сервера — довольно плохая идея.
@peterschussheim Сейчас у меня мало возможностей для работы с node_redis, и это очень печально. Однако обновление только redis-parser было бы серьезной проблемой.
@BridgeAR См. https://github.com/NodeRedis/node-redis-parser/pull/36
Отсутствующая ссылка была основной проблемой Webpack. Полное удаление найма также исправило эту ошибку как «сопутствующий ущерб».
Что касается того, почему нужно запускать веб-пакет на коде, связанном с сервером: в бессерверных средах могут работать старые версии Node, в то время как кто-то хочет иметь возможность использовать современный синтаксис, такой как импорт. (https://github.com/serverless-heaven/serverless-webpack)
@peterschussheim Я вижу еще один вариант, кроме повышения версии за redis-parser
в node-redis
: установите hiredis
самостоятельно. Даже если вы, вероятно, не используете hiredis
, redis-parser
ожидает его присутствия.
На самом деле, @BridgeAR : это может стать исправлением версии патча, поскольку это исправление ошибки. Но да, он сбрасывает версии Node ниже 4, даже несмотря на то, что они были EOL в течение достаточно долгого времени.
@guidobouman Большое спасибо за это предложение. Хотя это «взлом», я соглашусь с ним, так как не могу тратить больше времени, чем у меня уже есть, из-за этой проблемы.
Возможно, это хорошая возможность для меня или других членов сообщества выпустить «современную» версию (очень, очень грустно, что мы воздерживаемся от подобных изменений из-за поддержки Node 4).
👎
Может кто-нибудь объяснить, как решить эту проблему? Я не понимаю, почему мне все еще нужно добавлять hiredis
в качестве прямой зависимости. Другие предлагают просто не использовать hiredis
, так как мне это сделать?
В документации сказано, что парсер по умолчанию не hiredis
. Я использую последнюю версию, и hiredis
все еще требуется. Webpack с треском терпит неудачу при связывании со средой выполнения AWS lambda.
После всех настроек (изменить на target: 'node' и дополнительно установить 'hiredis') все еще кажется, что
проблема в комплектации. «Uncaught ReferenceError: требование не определено» появляется, когда я пытаюсь использовать Redis с Webpack.
Эта проблема по-прежнему актуальна, так как арендован и не может быть установлен в Node 12, redis-parser удаляет его в версии 3.0.0, но этот пакет по-прежнему использует версию 2.6.0.
Также вижу это при попытке связать с парцеллами через:
parcel build src/index.ts --bundle-node-modules --target node --no-source-maps --no-minify
Мне любопытно посмотреть, что мы получим при объединении (сотрясение дерева, оптимизация для контейнеризации и т. д.). Минификация или нет, я хотел бы увидеть результаты этого, если это сработает. Мы пока будем придерживаться npm install
и полной сборки.
Hiredis не бросает (последний PR был 10 дней назад). Тем не менее, я бы развлекал PR @sookoll для обновления до 3.0.
Hiredis не бросает (последний PR был 10 дней назад). Тем не менее, я бы развлекал PR @sookoll для обновления до 3.0.
Извините, я имею в виду наемный узел, очевидно. Не думал, что здесь кто-то может думать вне среды узла.
Самый полезный комментарий
На самом деле, это не проблема с Webpack. Это проблема с тем, как
redis-parser
использовалhiredis
. Эту проблему можно решить путем обновления доredis-parser
3.0, которая решает именно эту проблему.