热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Webpack4配置DevServer本地服务器

前面的已经介绍过如何用webpack打包一个项目,细心的人会发现,打包后想要项目运行起来必须要把打包后的项目上传到服务器中,或者静态的项目

前面的已经介绍过如何用webpack 打包一个项目,细心的人会发现,打包后想要项目运行起来必须要把打包后的项目上传到服务器中,或者静态的项目也可以在本地直接用浏览器打开。但在实际开发中可能会需要实时预览界面效果,那么这个时候就需要创建一个本地的HTTP服务器来实现实时预览项目。

然而官方提供的开发工具 DevServer 也可以很方便地做到项目的实时预览, 修改文件后自动刷新,Source Map 和 反向代理等功能。DevServer会启动一个HTTP 服务器用于服务网页请求,同时会帮助启动 Webpack ,并接收 Webpack 发出的文件更变信号,通过 WebSocket 协议自动刷新网页做到实时预览。

DevServer 服务器功能:

  1. 提供 HTTP 服务而不是使用本地文件预览
  2. 支持开发环境http的反向代理

Webpack 原生的功能:

  1. 监听文件的变化并自动刷新网页,做到实时预览
  2. 支持 Source Map,以方便调试。

简单的使用案例:

webpack.config.js

const path = require('path');module.exports = {entry: './src/main.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, './dist'),},// 这个配置项是属于:DevServer 工具的配置项devServer: {// 1.指定服务的iphost: "localhost",// 2.指定服务的端口port: 9000,// 3.开发环境进行http的代理proxy: {// 匹配 url 路径的开头'/api': {// 1.路劲只要是/api开头的url都代理到下面这个网站。// 例如:fetch('/api/xxxx') 会代理到 https://news-at.zhihu.com/api/xxxx// 例如:fetch('http://localhost:9000/api/xxxx') 这种写法会代理失败target: 'https://news-at.zhihu.com',ws: true, // 2.允许代理 websockets 协议changeOrigin: true //3.需要虚拟托管的站点要设计为true。建议设为 true,开发时大部分情况都是虚拟托管的站点}}}
};

1.安装 DevServer 服务器


DevServer 开发工具的全称是:webpack-dev-server

1.新建一个项目

|-- index.html
|-- node_modules
|-- package-lock.json
|-- package.json
|-- src
| |-- common.js
| `-- main.js
`
-- webpack.config.js

package.json

{"name": "testdevserver","version": "1.0.0","description": "","main": "webpack.config.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack-dev-server","build": "webpack --mode production"},"author": "liujun","license": "ISC","devDependencies": {"webpack": "^4.35.3","webpack-cli": "^3.3.6","webpack-dev-server": "^3.7.2"}
}

1.安装HTTP服务器开发工具:npm install webpack-dev-server@3.7.2 --save-dev

2.编写启动服务器脚本:

"dev": "webpack-dev-server" 或者 "dev": "webpack-dev-server --hot --devtool source-map"

3.编写项目打包脚本:"build": "webpack --mode production"

webpack.config.js

const path = require('path');module.exports = {entry: './src/main.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, './dist'),},devServer: {}
};

common.js

function get(content) {console.log('111')
}// 通过 CommonJS 规范导出 get 函数
module.exports = get;

main.js

// 1.通过 CommonJS 规范导入 get 函数
const get = require('./common.js');
// 2.执行 get 函数
get();

index.html

<html>
<head><meta charset&#61;"UTF-8">
head>
<body>
<div id&#61;"app">div>


<script src&#61;"bundle.js">script>
body>
html>

2.启动本地HTTP服务

打开终端&#xff0c;在项目的根目录执行&#xff1a;npm run dev 命令, DevServer 就启动了&#xff0c;这时你会看到控制台有一串日志输出&#xff1a;

PS F:\blog\webpack-study\webpackCode\08-配置-devServer> npm run dev> testdevserver&#64;1.0.0 dev F:\blog\webpack-study\webpackCode\08-配置-devServer
> webpack-dev-serveri &#xff62;wds&#xff63;: Project is running at http://localhost:8080/
i &#xff62;wds&#xff63;: webpack output is served from /
i &#xff62;wds&#xff63;: Content not from webpack is served from F:\blog\webpack-study\webpackCode\08-
[./src/main.js] 89 bytes {main} [built]&#43; 19 hidden modules........
i &#xff62;wdm&#xff63;: Compiled successfully.

这意味着 DevServer 启动的 HTTP 服务器监听在 http://localhost:8080/ &#xff0c;DevServer 启动后会一直驻留在后台保持运行&#xff0c;访问这个http://localhost:8080/网址你就能获取项目根目录下的 index.html。 用浏览器打开这个地址你会发现页面引用的 bundle.js文件自动输出到了项目的根目录&#xff0c;原因是 DevServer 会把 Webpack 构建出的文件保存在内存中&#xff0c;在要访问输出的文件时&#xff0c;必须通过 HTTP 服务访问。 由于 DevServer 不会理会 webpack.config.js 里配置的 output.path 属性&#xff0c;所以要获取 bundle.js的正确 URL 是 http://localhost:8080/bundle.js&#xff0c;对应的 index.html 应该为&#xff1a;

2.配置-port和host

https://www.webpackjs.com/configuration/dev-server/#devserver-host

webpack.config.js

const path &#61; require(&#39;path&#39;);module.exports &#61; {// entry 和 output 是webpack原生配置项entry: &#39;./src/main.js&#39;,output: {filename: &#39;bundle.js&#39;,path: path.resolve(__dirname, &#39;./dist&#39;),},// devServer 这个是webpack-dev-server的配置项 devServer: {// 1.指定服务的iphost: "localhost",// 2.指定服务的端口port: 9000,}
};

打开终端&#xff0c;在项目的根目录执行&#xff1a;npm run dev 命令, DevServer 就启动了&#xff0c;这时你会看到控制台有一串日志输出&#xff1a;

PS F:\blog\webpack-study\webpackCode\08-配置-devServer> npm run dev> testdevserver&#64;1.0.0 dev F:\blog\webpack-study\webpackCode\08-配置-devServer
> webpack-dev-serveri &#xff62;wds&#xff63;: Project is running at http://localhost:9000/
i &#xff62;wds&#xff63;: webpack output is served from /
i &#xff62;wds&#xff63;: Content not from webpack is served from F:\blog\webpack-study\webpackCode\08-
[./src/main.js] 89 bytes {main} [built]&#43; 19 hidden modules........
i &#xff62;wdm&#xff63;: Compiled successfully.

2.配置-hot

除了通过重新刷新整个网页来实现实时预览&#xff0c;DevServer 还有一种被称作模块热替换的刷新技术。 模块热替换能做到在不重新加载整个网页的情况下&#xff0c;通过将被更新过的模块替换老的模块&#xff0c;再重新执行一次来实现实时预览。

webpack.config.js

const path &#61; require(&#39;path&#39;);module.exports &#61; {// entry 和 output 是webpack原生配置项entry: &#39;./src/main.js&#39;,output: {filename: &#39;bundle.js&#39;,path: path.resolve(__dirname, &#39;./dist&#39;),},// devServer 这个是webpack-dev-server的配置项 devServer: {// 1.指定服务的iphost: "localhost",// 2.指定服务的端口port: 9000,// 3.模块热替换特性hot: true}
};

3.配置-proxy

下面的案例是发起一个ajax请求&#xff1a;https://news-at.zhihu.com/api/4/news/latest 这个接口。如果没有使用代理会出现跨越的问题。那么如何配置开发环境HTTP服务器的代理呢&#xff1f;看下面案例代码&#xff1a;

common.js

function get(content) {// 1.这个写法会devServer代理会失败。&#xff08;路径不能包含&#xff1a;协议&#xff0c;ip和端口&#xff09;// 注意&#xff1a;在使用 axios 时&#xff0c;如果开发环境 baseURL 属性的值包含&#xff1a;协议&#xff0c;ip 和 端口&#xff0c;将会代理失败// fetch(&#39;http://localhost:9000/api/4/news/latest&#39;)// .then((r)&#61;>{// console.log(&#39;r&#61;&#39;,r)// return r.json()// })// .then((res)&#61;>{// console.log(res)// })// 2.正确的写法fetch(&#39;/api/4/news/latest&#39;).then((r)&#61;>{console.log(&#39;r&#61;&#39;,r)// 从结果提取body中的内容&#xff0c;并转成json格式return r.json()}).then((res)&#61;>{console.log(&#39;res&#61;&#39; ,res)})}// 通过 CommonJS 规范导出 get 函数
module.exports &#61; get;

webpack.config.js

const path &#61; require(&#39;path&#39;);module.exports &#61; {entry: &#39;./src/main.js&#39;,output: {filename: &#39;bundle.js&#39;,path: path.resolve(__dirname, &#39;./dist&#39;),},devServer: {// 1.指定服务的iphost: "localhost",// 2.指定服务的端口port: 9000,// 3.开发环境进行http的代理proxy: {// 匹配 url 路径的开头&#xff08;注意&#xff1a;如果url开头包含http协议和端口会匹配失败&#xff0c;导致代理失败&#xff09;&#39;/api&#39;: {// 1.路劲只要是/api开头的url都代理到下面这个网站。// 例如&#xff1a;fetch(&#39;/api/xxxx&#39;) 会代理到 https://news-at.zhihu.com/api/xxxx// 例如&#xff1a;fetch(&#39;http://localhost:9000/api/xxxx&#39;) 这种写法会代理失败target: &#39;https://news-at.zhihu.com&#39;,ws: true, // 2.允许代理 websockets 协议&#xff0c;devserver使用的就是websockets协议changeOrigin: true //3.需要虚拟托管的站点要设计为true。建议设为 true&#xff0c;开发时大部分情况都是虚拟托管的站点}}}
};

注意&#xff1a;如果url开头包含http协议和端口会匹配失败&#xff0c;导致代理失败

结论&#xff1a;

当在webpack.config.js中配置devServer 项时&#xff0c;先要安装webpack-dev-server, DevServer 会启动一个 HTTP 服务器用于服务网页请求&#xff0c;同时会帮助启动 Webpack&#xff0c;并接收 Webpack 发出的文件更变信号&#96;&#xff0c;通过 WebSocket 协议自动刷新网页做到实时预览。

源码下载


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
author-avatar
九橙seven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有