搭建webpack构建环境(3)-浏览器自动刷新

如果简单的解决浏览器在修改文件后刷新,可以使用webpack --watch 启动监听文件,还有一种方式就是使用webpack-dev-server,它不仅仅支持简单的监听文件修改刷新界面,还支持 Hot Module Replacement (HMR),这个可以使你不再刷新整个页面,例如:在使用React时,你会体会到它的好处

安装webpack-dev-server

npm i webpack-dev-server --save-dev

如果你迫不及待想要使用这个体验一下,自动刷新的新功能,执行 webpack-dev-server --inline

将webpack-dev-server加入项目中

package.json

...
"start": "webpack-dev-server",
...

执行npm start 或者npm run start

 http://localhost:8080/webpack-dev-server/
webpack result is served from /
content is served from /Users/krock/Documents/web/my-project
Hash: 22e371d51a6f1503edf9
Version: webpack 1.13.3
Time: 676ms
     Asset       Size  Chunks             Chunk Names
    app.js    1.78 kB       0  [emitted]  app
index.html  180 bytes          [emitted]  
chunk    {0} app.js (app) 302 bytes [rendered]
    [0] ./app/index.js 120 bytes {0} [built]
    [1] ./app/component.js 182 bytes {0} [built]
Child html-webpack-plugin for "index.html":
    chunk    {0} index.html 540 kB [rendered]
        [0] ./~/html-webpack-plugin/lib/loader.js!./~/html-webpack-plugin/default_index.ejs 540 bytes {0} [built]
        [1] ./~/lodash/lodash.js 539 kB {0} [built]
        [2] (webpack)/buildin/module.js 241 bytes {0} [built]
webpack: bundle is now VALID.

访问:http://localhost:8080/webpack-dev-server/ 就可以看到你的网站页面了,试试修改component.js中的内容,是否没有手动刷新就出现了呢?

如果没有出现界面内容,查看是否8080端口被占用,使用webpack-dev-server --port 3000 修改端口启动网站

配置HMR

如果想要立即体验效果可使用webpack-dev-server --inline --hot

新建libs/parts.js

此文件中包含webpack.config中要使用的各种配置

const webpack = require('webpack');
exports.devServer = function(options) {
    return {
        devServer: {
            historyApiFallback: true,
            hot: true,
            inline: true,
            stats: 'errors-only',
            host: options.host, // 默认 to `localhost`
            port: options.port // 默认 to 8080
        },
        plugins: [
            //开启多通道编译,能获得更好的性能 
           new webpack.HotModuleReplacementPlugin({
                multiStep: true
            })
        ]
    };
};

webpack.config.js

...
const parts = require('./libs/parts');
...
switch(process.env.npm_lifecycle_event) {
  case 'build':
    config = merge(common, {});
    break;
  default:
    config = merge(
      common,
      parts.devServer({
        host: process.env.HOST,
        port: process.env.PORT
      })
    );
}
...

访问localhost:8080,修改文件看看效果

以上设置可能在某些版本windows\ubuntu等中有问题

解决此问题,需增加如下配置/libs/parts.js

const webpack = require('webpack');

exports.devServer = function(options) {
  return {

    watchOptions: {
      // Delay the rebuild after the first change
      aggregateTimeout: 300,
      // Poll using interval (in ms, accepts boolean too)
      poll: 1000
    },

    devServer: {
      ...
    },
    ...
  };
}

事实上你还可以使用express做服务器,使用webpack-dev-server为中间件(我没用过,暂时不多说)

下一章内容

css的自动更新和配置loader
进入下一章-css配置
本系列文章参考自surviceJS

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,220评论 7 35
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,480评论 1 32
  • 构建一个小项目——FlyBird,学习webpack和react。(本文成文于2017/2/25) 从webpac...
    布蕾布蕾阅读 16,854评论 31 98
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,496评论 2 71
  • 前言 WebPack 是什么? WebPack 是什么,WebPack 可以看做是模块打包机:它做的事情是,分析你...
    Promise__阅读 1,150评论 3 12