解决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 相关文章推荐
禁用Enter键表单自动提交实现代码
May 22 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
javascript实现在线客服效果
Jul 15 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
Dec 17 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
Aug 10 Javascript
对js eval()函数的一些见解
Aug 15 Javascript
微信小程序 登录实例详解
Jan 16 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
jquery学习笔记之无new构建详解
Dec 07 jQuery
深入解析koa之异步回调处理
Jun 17 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 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
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
js opener的使用详解
2014/01/11 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
vue项目实战总结篇
2018/02/11 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Python 互换字典的键值对实例
2019/02/12 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
使用python实现飞机大战游戏
2020/03/23 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
庆祝教师节活动方案
2014/01/31 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
工程售后服务方案
2014/06/08 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript