深入 webpack,直接使用 webpack-dev-server 轻松创建一个可以热加载的本地服务器

简介: 深入 webpack,直接使用 webpack-dev-server 轻松创建一个可以热加载的本地服务器

在使用webpack的过程中,令我们拍案叫绝的就是它的热加载功能,可以让我们在开发过程中,实时的看到修改后的效果,而不需要手动的刷新浏览器。


这个功能是通过webpack-dev-server来实现的,它是一个基于node.jsexpress服务器,它使用webpack-dev-middleware来服务于webpack的包。


使用 webpack-dev-server


通常webpack会给我们一个开箱即用的webpack-dev-server,更多的情况是我们通过webpack的配置来自定义webpack-dev-server

// webpack.config.js
module.exports = {
  // ...
  devServer: {
      host: '0.0.0.0',
      port: 8080,
      // ...
  }
}

通常我们使用如上的配置,然后webpack就自动给我们启动了一个服务,我们可以通过http://localhost:8080来访问我们的页面。


这种方式可以满足我们基本的需求,但是我们还可以通过webpack-dev-server提供的API来更加灵活的配置我们的服务。


这样可以更加方便的和自由的配置我们的服务,例如有时候一些静态资源访问需要代理到其他的服务器,例如有些静态资源必须要通过https来访问,这时候我们就可以通过webpack-dev-server提供的API来实现。


使用 webpack-dev-server API 来启动服务


其实webpack一些额外的功能都是可以独立使用的,配置只是一个集成的入口;


例如webpack-dev-server,它提供了一系列的API,我们可以直接使用这些API来启动服务。

const Webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
// webpack 配置
const compiler = Webpack({});
// devServer 配置
const devServerOptions = {
    open: true, // 自动打开浏览器
    static: './', // 静态资源目录
};
// 创建一个服务
const server = new WebpackDevServer(devServerOptions, compiler);
// 启动服务
const runServer = async () => {
    console.log('Starting server...');
    // 启动服务
    await server.start();
};
runServer();

只需要上面这么一点点代码,我们就可以启动一个拥有热更新的服务了。


当然这里因为使用的是webpack,所以还是需要安装webpack的依赖的:

npm install webpack webpack-cli webpack-dev-server -D


而它的API也很简单,关于启动服务和停止服务的API一共有四个:


  • server.start():启动服务
  • server.stop():停止服务
  • server.startCallback():启动服务,并提供一个回调,在服务启动后执行
  • server.stopCallback():停止服务,并提供一个回调,在服务停止后执行


前面两个APIPromise风格的,后面两个是callback风格的。


可以参考我上面写的例子,这里就不需要写实例代码了吧,就是这么简单。


除了上面的APIwebpack-dev-server还提供了一些额外的API,用于获取启动服务的ip地址:


  • internalIP():异步获取内网ip地址,会有一个参数family,用于指定获取ipv4还是ipv6地址,值为v4/v6,默认为v4
  • internalIPSync:同步获取内网ip地址,参数同上


使用方法也很简单,例如:

const { internalIP, internalIPSync } = require('webpack-dev-server');
const ipv4 = await internalIP('v4');
const ipv6 = await internalIP('v6');
console.log(ipv4, ipv6);
const ipv4Sync = internalIPSync('v4');
const ipv6Sync = internalIPSync('v6');
console.log(ipv4Sync, ipv6Sync);

使用 webpack-dev-server API 来配置服务


上面的例子中,我们只是简单的启动了一个服务,但是我们需要这个服务有啥用呢?


这里的用途还是非常之广的,任何需要一个本地服务的场景都可以使用,当然这里的所有的情况应该都是在开发环境下的。


例如现在很多功能都需要需要运行在https环境下的,这个时候我们如果自己去配置一个https服务器是非常麻烦的,但是我们可以通过webpack-dev-server来实现。

// ... 同上示例的代码
const devServerOptions = {
    open: true,
    static: './',
    https: true, // 启用 https
};

我们只需要在devServerOptions中添加一个https的配置项,就可以启用https了。


除了这个之外,我们还可以通过devServerOptions来配置很多其他的功能,例如我们开发很常用的代理功能,也可以通过devServerOptions来实现。

// ... 同上示例的代码
const devServerOptions = {
    open: true,
    static: './',
    proxy: {
        '/api': {
            target: 'http://localhost:3000',
            pathRewrite: {
                '^/api': '',
            },
        },
    },
};

而这些配置都是我们在webpack的配置中相同的,里面的配置项是非常丰富的,可以满足我们的绝大部分需求,详细配置可以参考官方文档


更自由一点的 webpack-dev-middleware


webpack-dev-server是一个非常好用的工具,但是它也有一些缺点,例如它只能在webpack的配置中使用,而且它的配置项也是有限的。


而且它只能提供一个静态资源服务,虽然我们可以通过一些配置来实现一些高度自定义的功能,但是基本上都是和静态资源相关的;


虽然说有一个代理的配置,但是代理处理的结果终究不是在自己这里的,而webpack-dev-middleware就可以解决这些问题。


webpack-dev-server的背后就是webpack-dev-middleware,它是通过启动一个express服务来实现的,而webpack-dev-server只是对webpack-dev-middleware的封装。

const webpack = require("webpack");
const middleware = require("webpack-dev-middleware");
const compiler = webpack({});
const express = require("express");
const app = express();
app.use(
  middleware(compiler, {
    // webpack-dev-middleware 的配置
  })
);
app.listen(8080, () => {
    console.log("Listening on port 8080!");
});

熟悉nodeexpress的小伙伴对上面的代码一定不陌生,webpack-dev-middleware是一个express的中间件,而这个中间件的作用就是启动一个webpack的编译服务。


webpack-dev-middleware并没有什么API,只有一堆配置;


可以看上面的代码,这里的高度自由指的是这里webpack的编译服务提供了一系列的功能,而我们可以通过配置来实现这些功能。


除此之外,我们还可以操作express来实现我们需要的功能,例如拦截请求,修改请求,修改响应等等。

// ... 同上面的代码
// 新增代码
app.use((req, res, next) => {
    // 添加一个token 
    req.headers['token'] = 'xxx';
    next();
});

当然直接操作express的话,就需要我们对express有一定的了解,所以webpack-dev-middleware也提供了可以修改请求和响应的配置:

app.use(
  middleware(compiler, {
      headers: (req, res, context) => {
          res.setHeader("token", 'xxx');
      },
  })
);

webpack-dev-middleware的配置项都集中在拦截请求和响应上,这里就不一一介绍了,可以参考官方文档


总结


webpack-dev-server是基于webpack-dev-middleware的,但是要明白它们的作用并不相同;


webpack-dev-server是一个webpack的开发服务器,它提供了一些开发中常用的功能,例如热更新,代理等等;


webpack-dev-middleware是一个express的中间件,它提供了一些基于http的请求和响应的拦截配置,可以实现一些高度自定义的功能。


webpack-dev-serverwebpack-dev-middleware都是非常好用的工具,它们都是基于webpack的;


webpack是打包构建工具,所以这两个工具都是在开发环境下使用的,请勿在生产环境下使用。


参考



目录
相关文章
|
8月前
|
Web App开发 JavaScript 前端开发
Node | Node.js Webpack搭建本地服务器
Node | Node.js Webpack搭建本地服务器
Node | Node.js Webpack搭建本地服务器
|
Shell API 前端开发
【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!
[前言]:因为最近在搞百度地图API的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的“收尾工作”——即打包,而没有把它纳入到项目开发的“主体过程”中来,真是“物不尽其用”。
1458 0
|
5天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
102 0
|
22小时前
|
存储 弹性计算 监控
【阿里云弹性计算】深入阿里云ECS配置选择:CPU、内存与存储的最优搭配策略
【5月更文挑战第20天】阿里云ECS提供多种实例类型满足不同需求,如通用型、计算型、内存型等。选择CPU时,通用应用可选1-2核,计算密集型应用推荐4核以上。内存选择要考虑应用类型,内存密集型至少4GB起。存储方面,系统盘和数据盘容量依据应用和数据量决定,高性能应用可选SSD或高效云盘。结合业务特点和预算制定配置方案,并通过监控应用性能适时调整,确保资源最优利用。示例代码展示了使用阿里云CLI创建ECS实例的过程。
23 5
|
22小时前
|
存储 弹性计算 监控
【阿里云弹性计算】阿里云ECS全面解析:弹性计算服务的核心优势与应用场景
【5月更文挑战第20天】阿里云ECS是提供可伸缩计算能力的云服务,支持多种规格实例,满足不同需求。其核心优势包括灵活性、高性能、高可用性、安全性和易用性。适用场景包括网站托管、大数据处理、游戏多媒体应用及测试开发环境。通过Python示例代码展示了如何创建ECS实例,助力企业专注业务发展,简化基础设施管理。
23 5
|
23小时前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
3天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
5天前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
5天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
5天前
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理
阿里云服务器租用价格参考,本文更新了阿里云服务器最新的租赁费用,包括云服务器实时的活动价格与云服务器收费标准。经济型e实例云服务器4核16G10M带宽配置30.00元/1个月、90.00元/3个月,独享型通用算力型u1实例2核4G服务器仅需199元1年,轻量云服务器2核2G新用户专享价格61元/1年,计算型c7a实例2核4G配置特惠价625.68元/1年。更多阿里云服务器热门配置活动价格及云服务器租赁费用及活动价格见下文。
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理