当我们通过vue/cli5以下版本搭建Vue项目的时候,npm run serve启动项目之后,在network中会自动持续发送 /sockjs-node/info?t=<当前时间戳> 请求(vue/cli5是目前最新的版本,绝大多数项目都是在vue/cli5版本以下搭建的,通过vue/cli5搭建的项目没有该接口,应该有其他替换),那么这个请求有什么用呢?查了一番资料也算是搞懂了一些:
① sockjs-node 是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。在项目运行之后,会一直调用这个接口。
② SockJS是一个JavaScript库(用于浏览器),提供类似于WevSocket的对象。其作用就是开发环境下,保证我们在改完代码重新编译之后,能够通知浏览器重新加载变更结果。这里理解为这个库使用来让本地与浏览器之间的热模块更新通信的。
有时候也可能该接口会有报错现象:sockjs-node/info?t= net::ERR_CONNECTION_TIMED_OUT
前面说了SockJS库是让本地与浏览器之间的热模块更新通信的,如果两个地址对接不上了,可能就会报该错误。我们可以选择性的关闭该网页请求,那么怎么关闭呢?下面就来介绍下:
1. 首先找到node_modules/sockjs-client/dist/sockjs.js
2. 找到代码的第1603行,将其注释掉
try {
// self.xhr.send(payload);
} catch (e) {
self.emit('finish', 0, '');
self._cleanup(false);
}
上面就是核心,注释掉之后重新运行,网页确实不会再去调用sockjs-node/info 接口了,但是这样存在很大的问题,就是我们改的是自己本地的啊,换个人、或者重新远程拉下代码重新装下依赖,那就又得去重新改,每次都要去重新改,或者说换个人不知道改哪怎么办。所以说这样肯定是行不通的,现在解决方式就是:加个脚本,每当我们npm install 之后就自动替换改掉node_modules/sockjs-client/dist/sockjs.js该文件
1. 首先在根目录下新建 lib/sockjs-client/dist/sockjs.js;如图:
2. 然后把node_modules/sockjs-client/dist/sockjs.js下的js代码全部拷贝到我们新建的sockjs.js文件中,然后在我们的sockjs.js中的第1603行代码注释掉(就是准备将node_modules/sockjs-client/dist/sockjs.js文件替换成我们的文件)
3. 再在根目录下新建installSockJS.js脚本文件
installSockJS.js
const path = require('path')
const fs = require('fs')
const sockModulePath = path.join(__dirname, 'node_modules/sockjs-client/dist/sockjs.js')
const sockLibPath = path.join(__dirname, 'lib/sockjs-client/dist/sockjs.js')
fs.writeFileSync(sockModulePath, fs.readFileSync(sockLibPath))
4. 然后就是在package.json中的scripts中添加"postinstall": "node installSockJS.js" 脚本命令
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"postinstall": "node installSockJS.js"
},
5. 最后npm install或者cnpm install以下即可
但是这样有个弊端就是我们的热更新没有了。。就是修改代码,浏览器不会实时的加载变更结果。所以看大家吧
还看到一些说是不采用上面的方案,通过在vue.config.js中 配置devServer: { host: 'localhost' } ,也可以到达效果并且保留热更新。但是我试了,并不起作用啊,还是一样的会调用sockjs-node/info接口,或许还有其他配置?。
大家知道也可能会有这个方案就好了,具体使用看大家。
今天就这么多,希望帮到有需要的煲仔们