首先介绍watch选项,参考这里。可实现相关源文件改变后自动更新bundle.js文件的功能。在配置文件中添加 watch:true 或执行 webpack -w,便可开启watch功能;css
测试发现,与(一个或多个)bundle.js有关的全部js、css等模块发生变化,就会自动执行打包,更新硬盘上的bundle.js文件。html
webpack-dev-server默认开启以上的监视功能。但二者监视效果存在差别:node
假如在配置文件中配置了publicPath(没有配置的话默认是是 /):webpack
output: { path: __dirname + "/dist", filename: "bundle.js", publicPath: "/p/" },
则webpack-dev-server 的监视功能只会更新内存中的文件,如 以上就是http://localhost:8080/p/bundle.js(该页面不会自动刷新)。但这个 http://localhost:8080/webpack-dev-server/p/bundle.js 这个路径下的文件也会更新,并且会自动刷新。git
到这里能够理解为:github
对于publicPath,有两个用处:web
根据文档的提示。自动刷新有两种方式:浏览器
iframe模式dom
使用这个模式不须要任何的配置,但须要改变页面的访问路径,好比要访问根目录下的首页,源连接是 http://localhost:8080/index.html 须要换成http://localhost:8080/webpack-dev-server/index.html 。访问这个链接时,查看页面的dom结构,发现页面是嵌入到一个iframe中显示的:webpack-dev-server
修改相关联模块文件时,这个页面会自动刷新。
inline模式
这个模式中有两种使用方式,分别是node和html方式。inline模式下访问页面不须要像iframe模式那样须要改变访问的路径,inline模式下只须要访问源路径便可
html方式:在须要自动刷新的页面中添加以下脚本便可,不须要像文档所说那样须要添加 --inline参数 或者 配置添加 devServer: { inline: true }
<script src="http://localhost:8080/webpack-dev-server.js"></script>
理解就是当webpack-dev-server自带的watch检测到变化时,会经过以上的这个js来使浏览器自动刷新
node方式:
对于这里的理解实际就是,不直接运行webpack-dev-server指令了,而是经过node来启动webpack-dev-server。node代码以下:
var config = require("./webpack.config.js"); var webpack = require("webpack"); var WebpackDevServer = require("Webpack-dev-server"); config.entry.unshift("webpack-dev-server/client?http://localhost:8080/"); var compiler = webpack(config); var server = new WebpackDevServer(compiler, {}); server.listen(8080);
光光运行这段代码是没办法使浏览器自动刷新的,由于这效果仅仅是运行了webpack-dev-server而已,还须要配合以上说的html方式来使浏览器自动刷新。
总结inline模式
就是直接或经过node来间接启动webpack-dev-server来检测文件变化,自动打包,而后再html中添加一个额外js来使浏览器自动刷新。以上代码中容许webpack的动态配置,即在js中配置运行,而不须要去修改配置文件。
回顾一个重点
webpack-dev-server检测到变化自动打包后,新打包后的文件实际上存在于内存中,而硬盘上的bundle.js依然是旧的。因此就算浏览器自动刷新了,读取的是硬盘上的文件,页面刷新后,仍是和刷新前的页面同样。
解决办法有两个:
output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), publicPath:"dist" }, devServer: { contentBase: "." } // 或者 output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, devServer: { contentBase: './dist', hot: true }
由于webpack-dev-server对于文件请求会优先到内存中查找,没有的话再转到硬盘上。因此这样浏览器访问/dist/bundle.js时,能访问到内存中的文件,并且当没有启动server时,访问的恰好就是对应文件在硬盘上的路径。这样一来,在开发的时候,修改和读取的文件都是内存中的文件,能提高开发效率。
并且更重要的是,不这么配置的话,hmr会无效的。