解决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 相关文章推荐
解javascript 混淆加密收藏
Jan 16 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
Nov 23 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
JavaScript的各种常见函数定义方法
Sep 16 Javascript
JS中产生标识符方式的演变
Jun 12 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
使用Node.js给图片加水印的方法
Nov 15 Javascript
基于JavaScript实现Tab选项卡切换效果
Nov 24 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
如何基于JavaScript判断图片是否加载完成
Dec 28 Javascript
jquery实现聊天机器人
Feb 08 jQuery
三种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配置文件php.ini所在路径的二种方法
2014/05/26 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
php实现socket推送技术的示例
2017/12/20 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
Ext 表单布局实例代码
2009/04/30 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
Python CSV文件模块的使用案例分析
2019/12/21 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
学生实习介绍信
2014/01/15 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
cf战队宣传语
2015/07/13 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
浅谈python数据类型及其操作
2021/05/25 Python
JavaScript的Set数据结构详解
2022/02/18 Javascript