相信你在遇到这个问题的时候,你是在做electron,这个问题不是你的问题,是iconv-lite对electron不怎么适配,iconv也是同样的道理,最佳的解决方法就是从源码上解决,解决方法如下:
在electron工程的node_modules中,找到iconv-lite(前提是你已经安装上了),打开iconv-lite/lib/index.js,在140行~150行之间有这些语句:
// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {
// Load streaming support in Node v0.10+
var nodeVerArr = nodeVer.split(".").map(Number);
if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
require("./streams")(iconv);
}
// Load Node primitive extensions.
require("./extend-node")(iconv);
}
你要做的,就是都注释掉,类似这样:
// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {
// // Load streaming support in Node v0.10+
// var nodeVerArr = nodeVer.split(".").map(Number);
// if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
// require("./streams")(iconv);
// }
// // Load Node primitive extensions.
// require("./extend-node")(iconv);
}
然后引用iconv就没有什么问题了,注释掉这里是什么意思呢?就是关于streams,就是流,浏览器都支持流,但是nodejs并不是,在最初,node刚发布的时候(v0.10),stream最好就是交给浏览器或者用户来实现,你知道,浏览器是前端,node是后端,iconv对前后端的运行在这里是不同的,但是,electron本身,是一种web前端和node后端同时都有的一种状态,这就很有可能让iconv去运行这段旧代码,然而现在的webpack对于解析require(...)(...)这样的代码貌似有一点困难,然后它会把require(...)(...)这样的解析成require()然后就不能被当作是一个函数,这就是__webpack_require__(...) is not a function的由来。