[webpack] webpack-dev-server介绍及配置

时间:2022-09-04 21:02:54

webpack-dev-server是webpack官方提供的一个小型Express服务器。使用它可以为webpack打包生成的资源文件提供web服务。webpack-dev-server官方文档

webpack-dev-server 主要提供两个功能:

  • 为静态文件提供服务
  • 自动刷新和热替换(HMR)

文件结构

    |--src
| |--views
| |--index.js
| |--module_a
| |--list.js
| |--module_b
| |--list.js
|--index.html
|--webpack.config.base.js
|--webpack.config.dev.js

文件内容

[/src/.../module_a/list.js]

export function getName() {
console.log("module_a_list");
}

[/src/.../module_a/list.js]

export function getName() {
console.log("module_b_list");
}

[/src/.../index.js]

import * as a_list from "./module_a/list.js"
import * as b_list from "./module_b/list.js" a_list.getName();
b_list.getName();

[/index.html]

<html>

<head>
<meta charset="UTF-8">
</head>
<body>
<h1>RUN WEBPACK_DEMO</h1>
<script src="/dist/app.js"></script>
</body> </html>

[/webpack.config.base.js]

var webpack = require("webpack");
var path = require("path"); module.exports = {
cache: true,
debug: true,
entry: {
"app": "./src/views/index.js"
},
output: {
filename: "[name].js",
path: __dirname + "/dist",
publicPath: "/dist/"
},
module: {
loaders: [
{
test: /.jsx?$/,
loader: "babel",
query: {
presets: ["react", "es2015", "stage-0"],
cacheDirectory: true
},
exclude: /node_modules/
}
]
},
plugins: []
}

[/webpack.config.base.js]

var webpack = require("webpack");
var webpackBase = require("./webpack.config.base.js"); var cfg = Object.assign(webpackBase, {
devtool: "cheap-module-eval-source-map"
}); module.exports = cfg;

webpack-dev-server

  • 首先需要全局安装webpack-dev-server
npm i webpack-dev-server -g
  • package.json配置scripts:
"scripts":{
"start":"webpack-dev-server --config webpack.config.dev.js"
}
  • 执行npm start,输出如下:

    [webpack] webpack-dev-server介绍及配置

命令要求webpack-dev-server执行当前目录下webpack.config.dev.js文件,发布地址默认为localhost:8080

  • 浏览器访问http://localhost:8080,可以看到,项目根目录下的index.html开始运行

    [webpack] webpack-dev-server介绍及配置

  • F12打开浏览器控制台,输出js文件log

    [webpack] webpack-dev-server介绍及配置

以上,一个简单的devServer配置就完成了

自动刷新

在实际开发中,我们往往有以下需求:

1、每次修改代码后,webpack可以自动重新打包

2、浏览器可以响应代码变化并自动刷新

webpack-dev-server提供了两种自动刷新模式:iframe和inline

iframe

页面被嵌套在一个iframe下,代码发生改动后,iframe会重新加载

使用此模式无需额外配置,只需访问http://localhost:8080/webpack-dev-server/index.html即可,显然webpack-dev-server默认的模式就是iframe

  • 浏览器访问http://localhost:8080/webpack-dev-server/index.html

    [webpack] webpack-dev-server介绍及配置

  • 修改js代码后保存,命令行log显示module_a/list.js变化导致app.js重新生成:

    [webpack] webpack-dev-server介绍及配置

  • 同时浏览器自动刷新,控制台输出如下:

    [webpack] webpack-dev-server介绍及配置

inline

此方式会将webpack-dev-server客户端加入到webpack入口文件的配置中。

配置方式有两种:CLI配置和通过Node.js Api手动配置

1)CLI 方式

此方式比较简单,只需在webpack.dev.server启动的命令中加入--inline即可

  • 修改package.json中scripts配置,添加--inline
"scripts":{
"start":"webpack-dev-server --inline --config webpack.config.dev.js"
}
  • 重新运行npm start,浏览器访问http://localhost:8080即可,修改代码后保存,浏览器自动刷新

当然webpack-dev-server类似的命令还有很多,比如,我们就可以规定项目可访问的地址为http://localhost:9093

"scripts":{
"start":"webpack-dev-server --inline --host localhost --port 9093 --config webpack.config.dev.js"
}

更多配置参考webpack-dev-server CLI文档

2)Node.js Api方式

此方式需要手动将webpack-dev-server客户端配置到webpack打包的入口文件中

  • 修改文件webpack.config.dev.js:
var webpack = require("webpack");
var webpackBase = require("./webpack.config.base.js"); var cfg = Object.assign(webpackBase, {
devtool: "cheap-module-eval-source-map"
}); //entry
Object.getOwnPropertyNames((webpackBase.entry || {})).map(function (name) {
cfg.entry[name] = []
//添加webpack-dev-server客户端
.concat("webpack-dev-server/client?http://localhost:9091")
.concat(webpackBase.entry[name])
}); module.exports = cfg;
  • 根目录添加文件devServer.js,用于创建服务器实例
var path = require("path");
var webpack = require("webpack");
var webpackDevServer = require("webpack-dev-server");
var webpackCfg = require("./webpack.config.dev.js"); var compiler = webpack(webpackCfg); //init server
var app = new webpackDevServer(compiler, {
//注意此处publicPath必填
publicPath: webpackCfg.output.publicPath
}); app.listen(9390, "localhost", function (err) {
if (err) {
console.log(err);
}
}); console.log("listen at http://localhost:9390");
  • 修改package.json中scripts配置,通过执行devServer.js文件启动服务器:
"scripts":{
"start":"node devServer.js"
}
  • 重新运行npm start,浏览器访问http://localhost:9390即可,修改代码后保存,浏览器自动刷新

热替换(HMR)

当我们使用webpack-dev-server的自动刷新功能时,浏览器会整页刷新。

而热替换的区别就在于,当前端代码变动时,无需刷新整个页面,只把变化的部分替换掉。

配置的关键在于将webpack/hot/dev-server文件加入到webpack所有入口文件中。

使用HMR同样同样有两种方式:CLI和Node.js Api

CLI方式

命令行配置比较简单,只需在自动刷新的基础上,加上--hot配置即可。

此配置会自动将webpack/hot/dev-server添加到webpack所有入口点中。

  • 修改package.json中scripts配置,添加--hot
"scripts":{
"start":"webpack-dev-server --inline --hot --config webpack.config.dev.js"
}
  • 执行npm start,浏览器访问http://localhost:8080即可,当控制台出现如下信息,说明HMR配置成功

    [webpack] webpack-dev-server介绍及配置

Node.js Api方式

此方式需要手动将webpack/hot/dev-server配置到所有webpack入口文件中

  • 修改文件webpack.config.dev.js,添加webpack/hot/dev-server,添加插件HotModuleReplacementPlugin
var webpack = require("webpack");
var webpackBase = require("./webpack.config.base.js"); var cfg = Object.assign(webpackBase, {
devtool: "cheap-module-eval-source-map"
}); //entry
Object.getOwnPropertyNames((webpackBase.entry || {})).map(function (name) {
cfg.entry[name] = []
//添加HMR文件
.concat("webpack/hot/dev-server")
.concat("webpack-dev-server/client?http://localhost:9390")
.concat(webpackBase.entry[name])
}); //plugins
cfg.plugins = (webpackBase.plugins || []).concat(
new webpack.optimize.OccurrenceOrderPlugin(),
//添加HMR插件
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
) module.exports = cfg;
  • 根目录添加文件devServer.js,用于创建服务器实例,添加hot:true
var path = require("path");
var webpack = require("webpack");
var webpackDevServer = require("webpack-dev-server");
var webpackCfg = require("./webpack.config.dev.js"); var compiler = webpack(webpackCfg); //init server
var app = new webpackDevServer(compiler, {
//注意此处publicPath必填
publicPath: webpackCfg.output.publicPath,
//HMR配置
hot:true
}); app.listen(9390, "localhost", function (err) {
if (err) {
console.log(err);
}
}); console.log("listen at http://localhost:9390");
  • 修改package.json中scripts配置,通过执行devServer.js文件启动服务器:
"scripts":{
"start":"node devServer.js"
}
  • 重新运行npm start,浏览器访问http://localhost:9390即可,当控制台出现如下信息,说明HMR配置成功

    [webpack] webpack-dev-server介绍及配置

可见,使用webpack-dev-server辅助开发,可以极大的方便前端调试。特别是在前后端分离的场景下,使前端可以更加灵活的构建自己的开发环境。

[webpack] webpack-dev-server介绍及配置的更多相关文章

  1. webpack 4 &amp&semi; dev server

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

  2. 笔记:配置 webpack dev server

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

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

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

  4. &lbrack;Webpack&rsqb; 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 ...

  5. Webpack的详细配置,&lbrack;Webpack中各种loader的安装配置&rsqb;

    在使用webpack的时候,你是不是被以下这种报错所困扰: 注意看 黄色框中标注的 You may need an appropriate loader to handle this file typ ...

  6. webpack run dev后并没有生成dist目录,但是浏览器里却读取了dist里的build&period;js?

    最近想看看现在做的React项目用的脚手架,看了下webpack的配置,尝试修改一些东西看看输出结果,结果允许npm run dev发现没有输出目录,怎么回事呢.又安装了vue官方提供的webpack ...

  7. webpack基础&plus;webpack配置文件常用配置项介绍&plus;webpack-dev-server

    一.webpack基础 1.在项目中生成package.json:在项目根目录中输入npm init,根据提示输入相应信息.(也可以不生成package.json文件,但是package.json是很 ...

  8. webpack常用配置项配置文件介绍

    一.webpack基础 1.在项目中生成package.json:在项目根目录中输入npm init,根据提示输入相应信息.(也可以不生成package.json文件,但是package.json是很 ...

  9. 【webpack系列】webpack4&period;x入门配置基础(一)

    一.前言 webpack在不断的迭代优化,目前已经到了4.29.6.在webpack4这个版本中,做了很多优化,引入了很多特性,将获得更多模块类型,.mjs支持,更好的默认值,更为简洁的模式设置,更加 ...

随机推荐

  1. Android MultiDex

    出现的原因: 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生 ...

  2. nginx配合modsecurity实现WAF功能

    一.准备工作 系统:centos 7.2 64位.nginx1.10.2, modsecurity2.9.1 owasp3.0 1.nginx:http://nginx.org/download/ng ...

  3. HDU 1520Anniversary party(树型DP)

    HDU 1520   Anniversary party 题目是说有N个人参加party,每个人有一个rating值(可以理解为权值)和一个up(上司的编号),为了保证party的趣味性,每一个人不可 ...

  4. 使用Spring Cloud搭建高可用服务注册中心

    我们需要的,不仅仅是一个服务注册中心而已,而是一个高可用服务注册中心. 上篇博客[使用Spring Cloud搭建服务注册中心]中我们介绍了如何使用Spring Cloud搭建一个服务注册中心,但是搭 ...

  5. Win10系列:C&num;应用控件进阶5

    多线形 多线形和多边形类似,不同点在于多线形中最后一个点和第一个点不会默认被连接.在多线形的点集中,可以存在同一个开始点和终结点因而会定义成闭合图形.下面将演示如何使用Polyline控件绘制一个多线 ...

  6. java返回值是list的时候获取list的参数类型

    Type[] resultArgType = null; Type resultType = method.getGenericReturnType(); if (resultType instanc ...

  7. python标准库中socket模块详解

    包含原理就是tcp的三次握手 http://www.lybbn.cn/data/datas.php?yw=71 这篇讲到了socket和django的联系 https://www.cnblogs.co ...

  8. RX库中的IDisposable对象

    IDisposable是.net中的主动资源释放接口,它是在编程过程中经常使用到的一个接口,本文介绍一下微软在Rx.NET中提供的一系列常用的Disposable类,通过它们可以简化我们的程序代码,提 ...

  9. string&period;Format字符串格式说明&lpar;转)

    转自:http://blog.csdn.net/dl020840504/article/details/8921875   先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默认格式 ...

  10. java程序运行一段时间之后停止

    原创文章,未经作者允许,禁止转载!!!!!!! 如何用java是一段代码运行一段时间之后自动停止运行? 就拿打印随机函数的代码来做例子吧,让程序随机打印1-10的数字,打印十秒钟后停止打印: publ ...