详解webpack-dev-server使用方法


Posted in Javascript onSeptember 14, 2018

记录下webpack-dev-server的用法.

首先,我们来看看基本的webpack.config.js的写法

module.exports = {
    entry: './src/js/index.js',
    output: {
      path: './dist/js',
      filename: 'bundle.js'
    }
  }

配置文件提供一个入口和一个出口,webpack根据这个来进行js的打包和编译工作。虽然webpack提供了webpack --watch的命令来动态监听文件的改变并实时打包,输出新bundle.js文件,这样文件多了之后打包速度会很慢,此外这样的打包的方式不能做到hot replace,即每次webpack编译之后,你还需要手动刷新浏览器。

webpack-dev-server其中部分功能就能克服上面的2个问题。webpack-dev-server主要是启动了一个使用expressHttp服务器。它的作用主要是用来伺服资源文件。此外这个Http服务器client使用了websocket通讯协议,原始文件作出改动后,webpack-dev-server会实时的编译,但是最后的编译的文件并没有输出到目标文件夹,即上面配置的:

output: {
    path: './dist/js',
    filename: 'bundle.js'
  }

注意:你启动webpack-dev-server后,你在目标文件夹中是看不到编译后的文件的,实时编译后的文件都保存到了内存当中。因此很多同学使用webpack-dev-server进行开发的时候都看不到编译后的文件

下面来结合webpack的文档和webpack-dev-server里部分源码来说明下如何使用:

启动

启动webpack-dev-server有2种方式:

  • 通过cmd line
  • 通过Node.js API

配置

我主要讲解下cmd line的形式,Node.js API形式大家去看下官方文档。可通过npm script进行启动。我的目录结构是:

app
  |__dist
  |  |__styles
  |  |__js
  |    |__bundle.js
  |  |__index.html
  |__src
  |  |__styles
  |  |__js
  |    |__index.js
  |__node_modules
  |__package.json
  |__webpack.config.js

content-base

设定webpack-dev-server伺服的directory。如果不进行设定的话,默认是在当前目录下。

webpack-dev-server --content-base ./dist

这个时候还要注意的一点就是在webpack.config.js文件里面,如果配置了outputpublicPath这个字段的值的话,在index.html文件里面也应该做出调整。因为webpack-dev-server伺服的文件是相对publicPath这个路径的。因此,如果你的webpack.config.js配置成这样的:

module.exports = {
    entry: './src/js/index.js',
    output: {
      path: './dist/js',
      filename: 'bundle.js',
      publicPath: '/assets/'
    }
  }

那么,在index.html文件当中引入的路径也发生相应的变化:

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Demo</title>
  </head>
  <body>
    <script src="assets/bundle.js"></script>
  </body>
  </html>

如果在webpack.config.js里面没有配置outputpublicPath的话,那么index.html最后引入的文件js文件路径应该是下面这样的。

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Demo</title>
  </head>
  <body>
    <script src="bundle.js"></script>
  </body>
  </html>

Automatic Refresh

webpack-dev-server支持2种自动刷新的方式:

  • Iframe mode
  • inline mode

这2种模式配置的方式和访问的路径稍微有点区别,最主要的区别还是Iframe mode是在网页中嵌入了一个iframe,将我们自己的应用注入到这个iframe当中去,因此每次你修改的文件后,都是这个iframe进行了reload

通过查看webpack-dev-server的源码,lib路径下的Server.js文件,第38-48行,分别新建几个流,这几个流保存了client文件夹下的相关文件:

// Prepare live html page
  var livePage = this.livePage = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "live.html")).pipe(livePage);

  // Prepare the live js file
  var liveJs = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "live.bundle.js")).pipe(liveJs);

  // Prepare the inlined js file
  var inlinedJs = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "index.bundle.js")).pipe(inlinedJs);
// Init express server
  var app = this.app = new express();

  // middleware for serving webpack bundle
  this.middleware = webpackDevMiddleware(compiler, options);

  app.get("/__webpack_dev_server__/live.bundle.js", function(req, res) {
    res.setHeader("Content-Type", "application/javascript");
    liveJs.pipe(res);
  });

  app.get("/webpack-dev-server.js", function(req, res) {
    res.setHeader("Content-Type", "application/javascript");
    inlinedJs.pipe(res);
  });

  app.get("/webpack-dev-server/*", function(req, res) {
    res.setHeader("Content-Type", "text/html");
    this.livePage.pipe(res);
  }.bind(this));

当使用Iframe mode时,请求/webpack-dev-server/index.html路径时,会返回client/index.html文件,这个文件的内容就是:

<!DOCTYPE html><html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/>
<script type="text/javascript" charset="utf-8" src="/__webpack_dev_server__/live.bundle.js">
</script>
</head>
<body></body>
</html>

这个页面会请求live.bundle.js,其中里面会新建一个Iframe,你的应用就被注入到了这个Iframe当中。同时live.bundle.js中含有socket.ioclient代码,这样它就能和webpack-dev-server建立的http server进行websocket通讯了。并根据返回的信息完成相应的动作。

Inline-mode,是webpack-dev-server会在你的webpack.config.js的入口配置文件中再添加一个入口,

module.exports = {
    entry: {
      app: [
        'webpack-dev-server/client?http://localhost:8080/',
        './src/js/index.js'
      ]
    },
    output: {
      path: './dist/js',
      filename: 'bundle.js'
    }
  }

这样就完成了将inlinedJS打包进bundle.js里的功能,同时inlinedJS里面也包含了socket.ioclient代码,可以和webpack-dev-server进行websocket通讯。

当然你也可以直接在你index.html引入这部分代码:

<script src="http://localhost:8080/webpack-dev-server.js"></script>

不过Iframe modeInline mode最后达到的效果都是一样的,都是监听文件的变化,然后再将编译后的文件推送到前端,完成页面的reload的。

Iframe mode

Iframe modecmd line不需要添加其他的内容,浏览器访问的路径是:localhost:8080/webpack-dev-server/index.html。

这个时候这个页面的header部分会出现整个reload消息的状态。当时改变源文件的时候,即可以完成自动编译打包,页面自动刷新的功能。

详解webpack-dev-server使用方法

Inline mode

使用inline mode的时候,cmd line需要写成:

webpack-dev-server --inline --content-base ./dist

这个时候访问的路径是:localhost:8080/index.html

也能完成自动编译打包,页面自动刷新的功能。但是没有的header部分的reload消息的显示,不过在控制台中会显示reload的状态。

详解webpack-dev-server使用方法

Hot Module Replacement

开启Hot Module Replacement功能,在cmd line里面添加--hot

webpack-dev-server --hot --inline --content-base ./dist

其他配置选项

  • --quiet 控制台中不输出打包的信息
  • --compress 开启gzip压缩
  • --progress 显示打包的进度

还有一切其他的配置信息可以查阅官方文档:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
5个最佳的Javascript日期处理类库分享
Apr 15 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
jquery垂直公告滚动实现代码
Dec 08 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
Oct 15 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
Jan 24 Javascript
vue项目中导入swiper插件的方法
Jan 30 Javascript
JS高级技巧(简洁版)
Jul 29 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
Feb 18 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
node.JS事件机制与events事件模块的使用方法详解
Feb 06 Javascript
浅谈JS的原型和原型链
Jun 04 Javascript
JS 实现微信扫一扫功能
Sep 14 #Javascript
详解webpack2异步加载套路
Sep 14 #Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
Sep 14 #Javascript
react项目实践之webpack-dev-serve
Sep 14 #Javascript
javacript replace 正则取字符串中的值并替换【推荐】
Sep 13 #Javascript
vue删除html内容的标签样式实例
Sep 13 #Javascript
如何解决vue2.0下IE浏览器白屏问题
Sep 13 #Javascript
You might like
一个用php3编写的简单计数器
2006/10/09 PHP
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
python实现计算器功能
2019/10/31 Python
Python新手学习raise用法
2020/06/03 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
大学生创业计划书的用途
2014/01/08 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
2014年财政所工作总结
2014/11/22 职场文书
见义勇为事迹材料
2014/12/24 职场文书
检讨书范文大全
2015/05/07 职场文书
毕业证明模板
2015/06/19 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers