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.
webpack 配置如下:
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有关。 我通过在 webpack 配置中使用 nodeExternals 插件解决了这个问题:
const nodeExternals = require('webpack-node-externals')
module.exports = {
...
externals: [nodeExternals()],
target: 'node'
}
nodeExternals 在服务器端捆绑时跳过 node_modules 文件夹中的任何模块。
这是 webpack 的问题。
实际上,这不是 Webpack 的问题。 这是redis-parser
如何使用hiredis
的问题。 这个问题可以通过升级到redis-parser
3.0 来解决,它正好解决了这个问题。
@guidobouman我们如何使用redis-parser
3.0 而不分叉 node_redis 并升级单个依赖项? 几周来我一直在寻找解决这个问题的方法,但没有成功。
@guidobouman任何有效的 JS 代码都应该适用于Webpack
。 情况似乎并非如此,这很可悲。 除此之外:我非常想知道为什么有人会想在 redis 上使用 Webpack。 缩小服务器端代码是一个非常糟糕的主意。
@peterschussheim我目前没有太多能力在 node_redis 上工作,这很可悲。 不过,仅升级 redis-parser 将是一个严重的问题。
@BridgeAR见https://github.com/NodeRedis/node-redis-parser/pull/36
缺少的参考是 Webpack 的根本问题。 删除hiredis 也完全修复了该错误为“附带损害”。
至于为什么要在与服务器相关的代码上运行 webpack:无服务器环境可能会运行旧版本的 Node,而有人希望能够使用诸如导入之类的现代语法。 (https://github.com/serverless-heaven/serverless-webpack)
@peterschussheim除了在node-redis
$ 中增加redis-parser
的版本之外,我还看到了另一种选择:自己安装hiredis
。 即使您可能没有使用hiredis
, redis-parser
确实希望它存在。
实际上, @BridgeAR :这可以作为一个补丁版本,因为它是一个错误修复。 但是,是的,它将 Node 版本降至 4 以下,即使它们已经 EOL 很长一段时间了。
@guidobouman非常感谢您的建议。 虽然这是一个“黑客”,但我会接受它,因为我不能因为这个问题浪费更多的时间。
也许这对我自己或社区中的其他人来说是一个发布“现代”版本的好机会(非常非常遗憾,由于节点 4 的支持,我们推迟了这样的更改)。
👎
有人可以解释如何解决这个问题吗? 我不明白为什么我仍然需要添加hiredis
作为直接依赖项。 其他人建议根本不使用hiredis
,那么我应该如何做到这一点?
文档说默认解析器不是hiredis
。 我正在使用最新版本,仍然需要hiredis
。 捆绑 AWS lambda 运行时时,Webpack 惨遭失败。
经过所有调整(更改为目标:'node'并另外安装'hiredis'),似乎仍然存在
捆绑的问题。 当我尝试将 Redis 与 Webpack 一起使用时,会出现“未捕获的 ReferenceError:require is not defined”。
这个问题仍然存在,因为hiredis 已被取消并且无法在节点12 中安装,redis-parser 在 v3.0.0 上将其删除,但此软件包仍使用 v2.6.0。
尝试通过以下方式与 parceljs 捆绑时也看到了这一点:
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。
抱歉,我的意思显然是hiredis-node。 没想到有人会想到这里的节点环境。
最有用的评论
实际上,这不是 Webpack 的问题。 这是
redis-parser
如何使用hiredis
的问题。 这个问题可以通过升级到redis-parser
3.0 来解决,它正好解决了这个问题。