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.
Die Webpack-Konfiguration lautet wie folgt:
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'
}
Paket.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"
]
}
}
Das muss mit Webpack zusammenhängen. Ich wurde dieses Problem durch die Verwendung des nodeExternals-Plugins in der Webpack-Konfiguration gelöst:
const nodeExternals = require('webpack-node-externals')
module.exports = {
...
externals: [nodeExternals()],
target: 'node'
}
nodeExternals überspringt alle Module im Ordner node_modules bei der serverseitigen Bündelung.
Dies ist ein Problem mit Webpack.
Eigentlich ist das kein Problem mit Webpack. Das ist ein Problem damit, wie redis-parser
hiredis
verwendet hat. Dieses Problem kann durch ein Upgrade auf redis-parser
3.0 gelöst werden, wodurch genau dieses Problem behoben wird.
@guidobouman wie können wir redis-parser
3.0 verwenden, ohne node_redis zu forken und diese einzelne Abhängigkeit zu aktualisieren? Ich suche seit Wochen erfolglos nach einer Lösung für dieses Problem.
@guidobouman jeder gültige JS-Code sollte für Webpack
in Ordnung sein. Das scheint nicht der Fall zu sein und das ist traurig. Abgesehen davon: Ich frage mich sehr, warum jemand Webpack auf Redis verwenden möchte. Das Minimieren von serverseitigem Code ist eine ziemlich schlechte Idee.
@peterschussheim Ich habe im Moment nicht viel Kapazität, um an node_redis zu arbeiten und das ist ziemlich traurig. Ein Upgrade nur des Redis-Parsers wäre jedoch ein ziemlich großer Fehler.
@BridgeAR Siehe https://github.com/NodeRedis/node-redis-parser/pull/36
Die fehlende Referenz war das zugrunde liegende Problem mit Webpack. Durch das vollständige Entfernen von Hiredis wurde dieser Fehler auch als "Kollateralschaden" behoben.
Warum man Webpack auf serverbezogenem Code ausführen sollte: In serverlosen Umgebungen werden möglicherweise alte Versionen von Node ausgeführt, während jemand in der Lage sein möchte, moderne Syntax wie Importe zu verwenden. (https://github.com/serverless-heaven/serverless-webpack)
@peterschussheim Ich sehe eine andere Möglichkeit, abgesehen davon, die Version für redis-parser
in node-redis
zu pushen: Installieren Sie hiredis
selbst. Auch wenn Sie hiredis
wahrscheinlich nicht verwenden, erwartet redis-parser
, dass es vorhanden ist.
Eigentlich, @BridgeAR : Dies könnte als Patch-Versionsstoß gelten, da es sich um einen Bugfix handelt. Aber ja, es lässt Node-Versionen unter 4 fallen, obwohl sie schon seit geraumer Zeit EOL sind.
@guidobouman Vielen Dank für diesen Vorschlag. Obwohl es sich um einen "Hack" handelt, akzeptiere ich es, da ich aufgrund dieses Problems nicht mehr Zeit verschwenden kann, als ich bereits habe.
Vielleicht ist dies eine gute Gelegenheit für mich oder andere in der Community, eine „moderne“ Version zu veröffentlichen (sehr, sehr traurig, dass wir wegen der Node-4-Unterstützung mit Änderungen wie dieser zurückhalten).
👎
Kann jemand bitte erklären, wie man dieses Problem behebt? Ich verstehe nicht, warum ich noch hiredis
als direkte Abhängigkeit hinzufügen muss. Andere schlagen vor, hiredis
einfach nicht zu verwenden, also wie soll ich das erreichen?
Die Dokumentation sagt, dass der Standard-Parser nicht hiredis
ist. Ich verwende die neueste Version und hiredis
wird noch benötigt. Webpack versagt beim Bündeln für die AWS Lambda-Laufzeit kläglich.
Nach all den Anpassungen (Wechsel auf Ziel: 'node' und zusätzlich 'hiredis' installieren) scheint es immer noch zu geben
ein Problem beim Bündeln. "Uncaught ReferenceError: require is not defined" wird angezeigt, wenn ich versuche, Redis mit Webpack zu verwenden.
Dieses Problem ist immer noch relevant, da Hiredis aufgegeben wurde und nicht in Node 12 installiert werden konnte, Redis-Parser entfernt es auf v3.0.0, aber dieses Paket verwendet immer noch v2.6.0.
Dies wird auch angezeigt, wenn versucht wird, mit packetjs zu bündeln über:
parcel build src/index.ts --bundle-node-modules --target node --no-source-maps --no-minify
Ich bin gespannt, was wir beim Bündeln bekommen (Tree Shaking, Optimierung für Containerisierung usw.). Verkleinerung oder nicht, ich würde gerne die Ergebnisse sehen, wenn es funktioniert hat. Wir bleiben vorerst bei npm install
und dem vollständigen Build.
Hiredis gibt nicht auf (letzter PR war vor 10 Tagen). Ich würde jedoch einen PR @sookoll für ein Update auf 3.0 unterhalten.
Hiredis gibt nicht auf (letzter PR war vor 10 Tagen). Ich würde jedoch einen PR @sookoll für ein Update auf 3.0 unterhalten.
Entschuldigung, ich meine offensichtlich den Hiredis-Knoten. Hätte nicht gedacht, dass hier jemand aus der Node-Umgebung heraus denken könnte.
Hilfreichster Kommentar
Eigentlich ist das kein Problem mit Webpack. Das ist ein Problem damit, wie
redis-parser
hiredis
verwendet hat. Dieses Problem kann durch ein Upgrade aufredis-parser
3.0 gelöst werden, wodurch genau dieses Problem behoben wird.