解决vue热替换失效的根本原因


Posted in Javascript onSeptember 19, 2018

新手刚开始使用vue时,常会遇见一个坑,那就是热替换失效。

什么?你跟我说使用官方的vue-cli去构建,我就是使用vue-cli后突然失效。

什么?你跟我说重新npm run dev一下,好嘛,已经run了N次了依然没回到大路上。

经过在网上一番查找,发现基本没有这个问题的详解,可能是这个问题太低级了?

讲解一下热替换的原理:热替换是在执行npm run dev后,会启动一个本地服务器(webpack-dev-server),这个服务器会观察源代码编译出来的文件。一旦修改了源代码,就会立刻编译源代码,然后观察新编译后的文件,接下来替换。

为什么会有编译这个以过程,就是因为使用.vue开发时,浏览器不认识这种类型的文件,需要编译成js文件。

所以整个过程可以这样描述:

源代码 ---> 编译为目标代码(浏览器可以识别运行的代码) ---> 本地服务器观察目标代码 ----> 本地服务器接收到目标代码改变[事件] ----> 刷新浏览器

常见热替换失效导致的原因:

1.观察文件位置错误

{

env: require('./dev.env'),
 port: 8080,
 autoOpenBrowser: true,
 assetsSubDirectory: 'static',//必须
 assetsPublicPath: '/',

失效是为什么?是因为修改了源代码后,依然会立刻编译,但是通常被观察的新编译的文件位置错了。也就是说浏览器显示的东西与服务器观察的东西是一个位置,而编译出来文件是另外的位置。

解决办法是:config/index.js中 dev的这个参数必须为static

2.项目目录包含特殊字符

像这样的路径 D:\(myworkspace)\vue-answer-project

这种目录中有一个括号!!!就有可能在浏览器中打开后,发现console报错

http://localhost:8080/__webpack_hmr net::ERR_INCOMPLETE_CHUNKED_ENCODING

这是什么意思呢?就是热替换模块报错,中断了观察页面与热替换模块的链接,无法收到事件。

解决办法就是:去掉这样的路径

3.npm run build后,打开浏览器一片空白

这个位置是根据文件webpack.config.js中的publicPath进行指定的。也就是服务器观察位置是 publicPath: "XX/build.js"这里面的 /XX/build.js这个文件,这个文件需要你在文件 index.html中 正确引入。

// webpack编译输出的发布路径
// => 将 build 的路径前缀修改为 ' ./ '(原本为 ' / '),是因为打包(npm run build)之后,
// 外部引入 js 和 css 文件时,如果路径以 ' / ' 开头,在本地是无法找到对应文件的(服务器上没问题)
module.exports = {
 build: {
 env: require('./prod.env'),
 index: path.resolve(__dirname, '../dist/index.html'),
 assetsRoot: path.resolve(__dirname, '../dist'),
 assetsSubDirectory: 'static',
 assetsPublicPath: './',
 productionSourceMap: true,
 // Gzip off by default as many popular static hosts such as
 // Surge or Netlify already gzip all static assets for you.
 // Before setting to `true`, make sure to:
 // npm install --save-dev compression-webpack-plugin
 productionGzip: false,
 productionGzipExtensions: ['js', 'css'],
 // Run the build command with an extra argument to
 // View the bundle analyzer report after build finishes:
 // `npm run build --report`
 // Set to `true` or `false` to always turn it on or off
 bundleAnalyzerReport: process.env.npm_config_report
 },
 dev: {
 env: require('./dev.env'),
 port: 8081,
 autoOpenBrowser: true,
 assetsSubDirectory: 'static',
 assetsPublicPath: '/',
 proxyTable: {},
 // CSS Sourcemaps off by default because relative paths are "buggy"
 // with this option, according to the CSS-Loader README
 // (https://github.com/webpack/css-loader#sourcemaps)
 // In our experience, they generally work as expected,
 // just be aware of this issue when enabling this option.
 cssSourceMap: true
 }

解决办法是:在上图中的build.assetsPublicPath的值 改为 "./"

以上这篇解决vue热替换失效的根本原因就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 实现表单验证功能代码(简洁)
Jul 03 Javascript
javascript+xml实现简单图片轮换(只支持IE)
Dec 23 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
不要使用jQuery触发原生事件的方法
Mar 03 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
jquery中each遍历对象和数组示例
Aug 05 Javascript
JQuery入门基础小实例(1)
Sep 17 Javascript
jQuery实现简易的天天爱消除小游戏
Oct 16 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 Javascript
三种Webpack打包方式(小结)
Sep 19 #Javascript
Vue.js更改调试地址端口号的实例
Sep 19 #Javascript
vue添加axios,并且指定baseurl的方法
Sep 19 #Javascript
vue中的计算属性实例详解
Sep 19 #Javascript
Vue axios设置访问基础路径方法
Sep 19 #Javascript
json前后端数据交互相关代码
Sep 19 #Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 #Javascript
You might like
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python functools模块学习总结
2015/05/09 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Python 字符串池化的前提
2020/07/03 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
《石榴》教学反思
2014/03/02 职场文书
医德考评自我评价
2014/09/14 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书