十七、Webpack搭建本地服务器

news2025/1/16 2:05:36

一、为什么要搭建本地服务器?

目前我们开发的代码,为了运行需要有两个操作:

  • 操作一:npm run build,编译相关的代码;
  • 操作二:通过live server或者直接通过浏览器,打开index.html代码,查看效果;
这个过程经常操作会影响我们的开发效率,我们希望可以做到,当文件发生变化时,可以自动的完成 编译 展示

为了完成自动编译,webpack提供了几种可选的方式:

  • webpack watch mode;
  • webpack-dev-server(常用);
  • webpack-dev-middleware;

二、webpack-dev-server

上面的方式可以监听到文件的变化,但是事实上它本身是没有自动刷新浏览器的功能的:

  • 当然,目前我们可以在VSCode中使用live-server来完成这样的功能;
  • 但是,我们希望在不适用live-server的情况下,可以具备live reloading(实时重新加载)的功能; 

安装webpack-dev-server

  • npm install webpack-dev-server -D

修改package.json配置文件,启动时加上serve参数:

webpack-dev-server 在编译之后不会写入到任何输出文件,而是将 bundle 文件保留在内存中:

  • 事实上webpack-dev-server使用了一个库叫memfs(memory-fs webpack自己写的)

但是现在我们发现我们只改了一个模块的代码,但是他会刷新整个页面,我们可不可以做到只替换当前模块?当然可以,就是下面我们要讲的模块热替换(HMR)。

 

三、认识模块热替换(HMR)

什么是HMR呢?

  • HMR的全称是Hot Module Replacement,翻译为模块热替换
  • 模块热替换是指在 应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面
HMR通过如下几种方式,来提高开发的速度:
  • 不重新加载整个页面,这样可以保留某些应用程序的状态不丢失
  • 只更新需要变化的内容,节省开发的时间
  • 修改了css、js源代码,会立即在浏览器更新,相当于直接在浏览器的devtools中直接修改样式;
如何使用HMR呢?
  • 默认情况下,webpack-dev-server已经支持HMR,我们只需要开启即可(默认已经开启);
  • 在不开启HMR的情况下,当我们修改了源代码之后,整个页面会自动刷新,使用的是live reloading;

四、开启HMR

修改webpack的配置:

浏览器能够看到打开后的效果:

但是目前还是整个页面都刷新,所以我还得配置,我们需要去指定哪些模块发生更新时,进行HMR;

但是有同学不是更有疑惑吗,如果我要配多个模块去HMR的话,是不是配起来很麻烦?那就是下面我们要讲的内容 框架的HMR。

五、框架的HMR(了解,框架都默认配置好了)

有一个问题:在开发其他项目时,我们是否需要经常手动去写入 module.hot.accpet相关的API呢?

  • 比如开发Vue、React项目,我们修改了组件,希望进行热更新,这个时候应该如何去操作呢?
事实上社区已经针对这些有很成熟的解决方案了:
  • 比如vue开发中,我们使用vue-loader,此loader支持vue组件的HMR,提供开箱即用的体验;
  • 比如react开发中,有React Hot Loader,实时调整react组件(目前React官方已经弃用了,改成使用react-refresh);

六、host配置(了解)

如果我这里host设置的0.0.0.0,其他小伙伴就可以通过ip:端口号,访问我的主机。

我的主机ip是:192.168.1.90,设置的端口号是8888,本地打开服务后,其他小伙伴就能通过浏览器上192.168.1.90:8888访问。

 

七、port、open、compress

port: 设置监听的端口,默认情况下是8080

open: 是否打开浏览器:

  • 默认值是false,设置为true会打开浏览器;
  • 也可以设置为类似于 Google Chrome等值;
     

compress: 是否为静态文件开启gzip压缩 compression:

  • 默认值是false,可以设置为true;

八、Proxy(Vue项目学习) 

proxy是我们开发中非常常用的一个配置选项,它的目的设置代理来解决跨域访问的问题:

  • 比如我们的一个api请求是 http://localhost:8888,但是本地启动服务器的域名是 http://localhost:8000,这个时候发送网络请求就会出现跨域的问题;
  • 那么我们可以将请求先发送到一个代理服务器,代理服务器和API服务器没有跨域的问题,就可以解决我们的跨域问题了;
我们可以进行如下的设置:
  • target:表示的是代理到的目标地址,比如 /api-hy/moment会被代理到 http://localhost:8888/api-hy/moment;
  • pathRewrite:默认情况下,我们的 /api-hy 也会被写入到URL中,如果希望删除,可以使用pathRewrite;
  • secure:默认情况下不接收转发到https的服务器上,如果希望支持,可以设置为false;
  • changeOrigin:它表示是否更新代理后请求的headers中host地址;

 九、changeOrigin的解析(Vue项目学习)

这个 changeOrigin官方说的非常模糊,通过查看源码我发现其实是要修改代理请求中的headers中的host属性:

  • 因为我们真实的请求,其实是需要通过 http://localhost:8888来请求的;
  • 但是因为使用了代理,默认情况下它的值时 http://localhost:8000;
  • 如果我们需要修改,那么可以将changeOrigin设置为true即可;

 十、historyApiFallback (Vue项目学习)

historyApiFallback是开发中一个非常常见的属性,它主要的作用是解决SPA页面在路由跳转之后,进行页面刷新时,返回404 的错误。

boolean值:默认是false
  • 如果设置为true,那么在刷新时,返回404错误时,会自动返回 index.html 的内容;
object类型的值,可以配置rewrites属性:
  • 可以配置from来匹配路径,决定要跳转到哪一个页面;
事实上devServer中实现historyApiFallback功能是通过connect-history-api-fallback库的:
  • 可以查看connect-history-api-fallback 文档

十一、如何区分开发环境

目前我们所有的webpack配置信息都是放到一个配置文件中的:webpack.config.js

  • 当配置越来越多时,这个文件会变得越来越不容易维护;
  • 并且 某些配置是在开发环境需要使用 的, 某些配置是在生成环境需要使用 的,当然 某些配置是在开发和生成环境都会使用 的;
  • 所以,我们最好 对配置进行划分 ,方便我们维护和管理;
那么,在启动时如何可以区分不同的配置呢?
  • 方案一:编写两个不同的配置文件,开发和生成时,分别加载不同的配置文件即可;
  • 方式二:使用相同的一个入口配置文件,通过设置参数来区分它们;

 

 

十二、入口文件解析

我们之前编写入口文件的规则是这样的:./src/index.js,但是如果我们的配置文件所在的位置变成了 config 目录,我们是否应该变成 ../src/index.js呢?

  • 如果我们这样编写,会发现是报错的,依然要写成 ./src/index.js;
  • 这是因为入口文件其实是和另一个属性时有关的 context;
context的作用是用于解析入口(entry point)和加载器(loader):
  • 官方说法:默认是当前路径(但是经过我测试,默认应该是webpack的启动目录)
  • 另外推荐在配置中传入一个值;

十三、区分开发和生成环境配置

这里我们创建三个文件:

  • webpack.comm.conf.js
  • webpack.dev.conf.js
  • webpack.prod.conf.js

后面文章再说哈 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【业务功能篇106】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【下篇】

四、秒杀活动 1.秒杀活动关注点 秒杀活动的最大特点就是高并发而且是短时间内的高并发,那么对我们的服务要求就非常高,针对这种情况所产生的共性问题,对应的解决方案: 2. 秒杀服务前端 当我们点击 秒杀抢购按钮后,对应…

【C#-1】C#调用matlab生成的dll库

matlab打包dll 1、matlab示例程序: function untitled4(x)z peaks(x);figuresurf(z) end 2、输入deploytool打包matlab程序,具体如下: 3、拷贝 打包成功后,将生成for_redistribution_files_only文件夹中的dll文件拷贝到C#程序…

【设计模式】三、概述分类+单例模式

文章目录 概述设计模式类型 单例模式饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全,同步方法)懒汉式(线程安全,同步代码块)双重检查静态内部类枚举单例模式在 JDK 应用的源码分析 …

Llama2-Chinese项目:1-项目介绍和模型推理

Atom-7B与Llama2间的关系:Atom-7B是基于Llama2进行中文预训练的开源大模型。为什么叫原子呢?因为原子生万物,Llama中文社区希望原子大模型未来可以成为构建AI世界的基础单位。目前社区发布了6个模型,如下所示: FlagAl…

无线振动传感器革新:设备维护的新范式

随着工业界的不断发展和技术的进步,设备维护的方法也在不断演变。过去,维护通常是基于固定的时间表和例行的检查进行的,这种方法往往会导致资源的浪费和不必要的停机时间。然而,现在,随着无线振动传感器的革新&#xf…

【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )

文章目录 一、内联函数总结二、内联函数代码示例1、代码示例 - 普通函数执行分析2、代码示例 - 内联函数执行分析3、代码示例 - 宏代码片段执行分析 一、内联函数总结 回顾下 之前的博客中 介绍的 内联函数 : 内联函数编译 : C 编译器 编译 内联函数 时 , 会直接 将 内联函数 …

前端开发纷繁复杂,是否有更高效的开发方式?

一、前言 此前,我曾跟大家聊到,低代码编程,在现阶段互联网业务疯狂增长的带动之下,被赋予了全新的使命和义务,即帮助开发者在前期以较低成本的方式,快速构建一个可投入市场的应用。 那么,有没有…

腾讯云轻量2核4G5M服务器_CPU内存_流量_带宽_系统盘

腾讯云轻量2核4G5M服务器:CPU内存流量带宽系统盘性能测评:轻量应用服务器2核4G5M带宽,免费500GB月流量,60GB系统盘SSD盘,5M带宽下载速度可达640KB/秒,流量超额按照0.8元每GB支付流量费,轻量2核4…

都2023年了,别再用ifconfig啦! 试试这个吧!

下午好,我的网工朋友。 ifconfig这玩意儿,还有多少人在用?举个手看看 总在说ifconfig即将被淘汰,但其实很多网工还在用吧。 比如说组合使用诸如ifconfig、route、arp和netstat等命令行工具(来源于安装包net-tools&a…

调查称全球多所顶尖高校网站存在网络攻击风险

Cyber News的一项调查研究显示,全球多所顶尖高校的网站未能及时更新安全补丁,存在敏感信息泄露,甚至被攻击者全面接管的风险。 Cyber​​ News 研究团队详细调查了 20 个每月有数百万访问量的高校网站,其中至少有6个是位于全球Top…

Mac清理垃圾软软件CleanMyMac X的软件功能介绍

在我们使用我们的Mac一定的时间后,总是不可避免的出现Mac内存不足的情况,所以清理垃圾软件也就成为了我们电脑里必不可少的软件。苹果软件商店中有很多各有不同的清理垃圾软件,但我们往往很难从这一大堆软件中找到令自己心满意足的。 但是这…

目录操作函数

mkdir函数 rmdir函数 删除空目录 rename函数 换名 chdir函数 修改当前的工作目录 getcwd函数 获取当前工作的路径

X2-VLM: All-In-One Pre-trained Model For Vision-Language Tasks论文笔记

Title:X2-VLM: All-In-One Pre-trained Model For Vision-Language Tasks Code 1. Motivation CLIP这一类方法只能进行图片级别的视觉和文本对齐;也有一些方法利用预训练的目标检测器进行目标级别的视觉和文本对齐,但是只能编码目标内部的特…

WMS仓储-亿发数字化工厂库存管理系统,提升中小企业仓储管理效率

中小企业竞争日益激烈的市场中,仓库管理的重要性不可低估。为了适应不断变化的业务规模和模式,中小企业对仓库管理提出了更高水平的智能化要求。数字化工厂库存管理系统,正是应运而生,助力企业加强仓库智能作业效率,并…

CRM销售管理系统如何提高销售效率

CRM销售管理系统是帮助企业对销售活动进行管理、执行和优化的软件系统。它可以帮助企业提高销售效率,提高客户转化率,实现企业的业绩增长。那么,CRM销售管理系统好用吗? CRM销售管理系统的功能 线索管理: CRM系统可…

​金蝶云星空管理中心反序列化RCE漏洞复现 附POC

文章目录 ​金蝶云星空管理中心反序列化RCE漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.进行ipconfig命令测试 0x06修复建议 ​金蝶云星空管理中心反序列化RCE漏洞复现 0x01 前言 免责声明:请勿利用文…

iframe 实现跨域,两页面之间的通信

一、 背景 一个项目为vue2,一个项目为vue3,两个不同的项目实现iframe嵌入,并实现通信 二、方案 iframe跨域时,iframe组件之间常用的通信,主要是H5的possmessage方法 三、案例代码 父页面-vue2(端口号为…

日常开发小汇总(5)元素跟随鼠标移动(在视口下移动)

<div class"mark"><h1>title</h1><div><p>title 鼠标移动 盒子整体移动</p><p>test</p><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, porro.</p></div></div>cons…

微信商城小程序开发

微信小程序商城制作流程详解 微信小程序商城的出现为商家提供了一个全新的线上销售平台&#xff0c;让商家能够在微信生态系统中直接向用户展示和销售自己的产品。本文将详细介绍微信小程序商城的制作流程&#xff0c;帮助商家和开发者更好地理解和掌握这一新兴技术。 一、注…

python+chdb 向量检索,百万数据秒级查询

随机生成向量数据集 import numpy as np import pandas as pddata_vectors [(i, np.random.random(300)) for i in range(1000000)] df pd.DataFrame(data_vectors) df.columns [idx, vector] df转化成parquet格式&#xff0c;分批转化&#xff0c;一次会爆炸 import pyar…