webpack-dev-server启动了一个使用express的Http服务器,这个服务器与客户端采用websocket通信协议,当原始文件发生改变,webpack-dev-server会实时编译。

这里注意两点:

1.webpack-dev-server伺服的是资源文件,不会对index.html的修改做出反应

2.webpack-dev-server生成的文件在内存中,因此不会呈现于目录中,生成路径由content-base指定,不会输出到output目录中。

3.默认情况下: webpack-dev-server会在content-base路径下寻找index.html作为首页

4.webpack-dev-server不是一个插件,而是一个web服务器,所以不要想当然地将其引入

content-base 用于设定生成的文件所在目录

eg:

const path = require('path');
const HtmlWebpackPlugin= require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin')
var ManifestPlugin = require('webpack-manifest-plugin');
const webpack= require('webpack'); module.exports = {
entry: {
main: './src/main.js'
},
devServer: {
historyApiFallback: true,
noInfo: true,
contentBase: './dist'
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
},{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
'scss': 'vue-style-loader!css-loader!sass-loader',
'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax',
}
}
}
]
},
devtool: 'inline-source-map',
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist')
},
};

这里设定在dist文件夹下生成文件,能够看到dist文件夹下未生成文件(index.html是本人手动创建的),而index.html的引入路径应为<script src="./main.js"></script>

必须注意的是: 如果配置了output的publicPath这个字段的值的话,index.html的路径也得做出相应修改,因为webpack-dev-server伺服的文件时相对于publicPath这个路径的。

那么,如果:

output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/a/'
}

那么,index.html的路径为: <script src="./a/main.js">

内联模式(inline mode)和iframe模式

webpack-dev-server默认采用内联模式,iframe模式与内联模式最大的区别是它的原理是在网页中嵌入一个iframe,

我们可以将devServer的inline设为false切换为iframe模式

devServer: {
historyApiFallback: true,
noInfo: true,
contentBase: './dist',
inline: false
}

可以发现:

可以发现我们的网页被嵌入iframe中。

模块热替换

webpack-dev-server有两种方式开启热替换

1.通过在devServer内将hot设为true并初始化webpack.HotModuleReplacementPlugin

2.命令行加入--hot(如果webpack或者webpack-dev-server开启时追加了--hot, 上述插件能自动初始化,这样就无需加入配置文件中)

然后在入口文件中加入热替换处理代码:

if (module.hot) {
  //当chunk1.js发生改变时热替换
module.hot.accept('./chunk1.js', function() {
console.log('chunk1更新啦');
})
}

默认情况下,由于style-loader的帮助,css的模板热替换很简单,当发生改变时,style-loader会在后台使用module.hot.accept来修补style,同理,有许多loader有类似功能,例如vue-loader、react-hot-loader...

js文件发生改变会触发刷新而不是热替换,因此得加上处理语句,详情可查看:

https://doc.webpack-china.org/guides/hot-module-replacement

webpack-dev-server原理及要点笔记的更多相关文章

  1. 笔记:配置 webpack dev server

    笔记:配置 webpack dev server 安装 webpack-dev-server 组件 配置 webpack.config.js 配置 增加 html-webpack-plugin 组件 ...

  2. [Webpack] Access Webpack Dev Server from Mobile Safari on an iPhone

    Testing your sites on mobile devices is a critical part of the development process. Webpack dev serv ...

  3. 配置Webpack Dev Server 实战操作方法步骤

    本文摘要:配置 Webpack Dev Server 可以解决本地开发前端应用时,手动执行 webpack 命令或 yarn build 命令,再去浏览器中访问 dist/index.html 的麻烦 ...

  4. webpack dev server 和 sublime text 配合时需要注意的地方

    参考:https://webpack.js.org/guides/development/ Adjusting Your Text Editor Some text editors have a &q ...

  5. webpack dev server 配置 启动项目报错Error: listen EADDRINUSE

    Error: listen EADDRINUSE 0.0.0.0:5601 它的意思是,端口5601被其他进程占用. 切换端口即可解决问题

  6. 解决新版本webpack vue-cli生成文件没有dev.server.js问题

    新版本webpack生成的dev.server.js 在webpack.dev.conf.js中 webpack.dev.conf.js const axios = require('axios') ...

  7. webpack 4 & dev server

    webpack 4 & dev server proxy https://webpack.js.org/configuration/dev-server/#devserverproxy htt ...

  8. vue-cli脚手架npm相关文件解读(3)webpack.dev.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  9. vue-cli脚手架之webpack.dev.conf.js

    webpack.dev.conf.js  开发环境模式配置文件: 'use strict'//js按照严格模式执行 const utils = require('./utils')//导入utils. ...

随机推荐

  1. 传输层:UDP 协议

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...

  2. #pragma预处理命令【转】

    原文 : http://www.cnblogs.com/qinfengxiaoyue/archive/2012/06/05/2535524.html #pragma可以说是C++中最复杂的预处理指令了 ...

  3. cart算法

  4. mysql导出导入所有数据库

    导出所有数据库 mysqldump -uroot -p123456 --all-databases > /home/aa.sql 导入所有数据库 mysql -uroot -p123456 &l ...

  5. VueJS自定义全局和局部指令

    除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令. 使用directive自定义全局指令 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面 ...

  6. View的滚动原理简单解析

    一直对View的滚动了解的不深,说明确了吧也能说出个所以然来,所以我就花了点时间做了一个小小的总结,言归正传,view的滑动分为下面三种: 1)View本身不滚动,指滚动View的内容,这也是View ...

  7. Spring Cloud(十三):Spring Cloud Sleuth服务链路追踪(zipkin)(转)

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...

  8. Chrome + Python 抓取动态网页内容

    用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字.如下所示: import urllib2 url="http: ...

  9. 【WPF学习笔记】之如何点登录按钮时判断用户名密码进行登录:动画系列之(二)

    ...... 承接动画系列之(一)的代码: 再添加登录按钮代码进行登录,验证用户名和密码在数据库是否正确. 直接上代码: using System; using System.Collections. ...

  10. 在命令行上启用 64 位 Visual C++ 工具集

    Visual C++ 包含可用于创建 apps 在 32 位上运行,64 位,或基于 ARM 的 windows 操作系统的编译器. 下面的列表描述了 cl.exe(Visual C++ 编译器)的各 ...