当前位置: 首页 > news >正文

Webpack模式-Resolve-本地服务器

目录

  • Resolve
  • Mode配置
  • 搭本地服务器
  • 区分环境配置

Resolve

前面学习时使用了各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库,Webpack 中,resolve 是用于解析模块依赖的配置项,它决定了 Webpack 如何找到项目中的模块文件

  • resolve 作用:

    • 当你在代码中 importrequire 一个模块时、resolve 配置可以帮助 Webpack 定义如何解析这些模块路径,特别是在处理文件扩展名、路径别名、模块目录等方面

    • webpack 使用 enhanced-resolve 来解析文件路径

  • 解析三种文件路径:

    • 绝对路径:这种情况下,不需要再做进一步解析

    • 相对路径

      在这种情况下,使用 importrequire 的资源文件所处的目录,被认为是上下文目录

      import/require 中给定的相对路径,会拼接此上下文路径,来生成模块的绝对路径

    • 模块路径

      resolve.modules 中指定的所有目录检索模块,默认值目录是 ['node_modules'],所以默认会从node_modules中查找文件

      可以通过设置别名的方式来替换初始模块路径

  • 解析引入文件和文件夹

    • 引入文件:

      如果文件具有扩展名,则直接打包文件

      否则,将使用 resolve.extensions 选项作为文件扩展名解析

    • 引入文件夹:

      在文件夹中根据 resolve.mainFiles 配置选项中指定的文件顺序查找

      resolve.mainFiles的默认值是 ['index']

      再根据 resolve.extensions 来解析扩展名

  • resolve 常用属性:
    在这里插入图片描述

    • extensions

      解析到文件时自动添加扩展名,告诉 Webpack 在导入语句中省略文件扩展名时,它应该查找哪些扩展名

      默认值是 ['.wasm', '.mjs', '.js', '.json']

      如果代码中想添加加载 .vue 或者 jsx 或者 ts 等文件时,必须自己写上扩展名

    • alias用于定义路径别名,可以通过别名缩短路径,可以使用 @ 代替长路径

    • modules用于指定模块查找的目录,默认情况下 Webpack 只会查找 node_modules 文件夹,通过 modules 选项,可以为 Webpack 指定其他的查找目录

    • mainFields:告诉 Webpack 在解析模块的 package.json 时优先使用哪些字段,通常用于库的 package.json 中,常见的字段有 main, modulebrowser

    • mainFiles指定文件查找时的入口文件名,默认是 index

    • symlinks:控制 Webpack 是否遵循符号链接(symlink),默认为 true

Mode配置

前面我们学习webpack打包相关文件时,有个警告我们一直没有看,这就是需要配置mode,接下来学习mode
在这里插入图片描述
Webpack 中,mode 是一个重要的配置项,用于设置构建模式。它影响 Webpack 的行为和输出,决定了构建时是否开启优化(如压缩代码、调试工具等)

mode 有三个值:
在这里插入图片描述

  • development(开发模式):用于开发环境,提供调试支持和快速构建
    在这里插入图片描述

    • 特点:

      开启调试功能

      输出的代码不会被压缩,以便于调试

      启用 eval 作为 devtool,生成代码映射(source maps),方便调试源码

      开启了增量编译,构建速度较快

    • 内置优化:

      devtool: 'eval' (快速生成 source maps)

      启用更有利于调试的错误提示

  • production(生产模式):用于生产环境,进行代码压缩和各种优化,生成小体积的高效代码
    在这里插入图片描述

    • 特点:

      启用各种优化功能,以减少输出的文件体积和提高性能

      代码会被压缩(通过 TerserPlugin

      自动去除未引用的代码(Tree Shaking

      生成优化的 source maps(可选,通常关闭)

    • 内置优化:
      TerserPlugin(用于压缩 JavaScript 代码)

      mode: 'production' 会自动将 devtool 设为 false,取消 source map 以减少文件体积

      通过 Tree Shaking 去除未引用代码

      通过 DefinePluginprocess.env.NODE_ENV 设置为 "production"

  • none(无模式):禁用所有内置的优化,用于完全自定义配置的场景
    在这里插入图片描述

    • 特点:

      禁用所有默认优化

      适用于自定义优化的场景

更多的mode配置:
在这里插入图片描述

搭本地服务器

目前开发的代码,为了运行需要有两个操作:npm run build编译相关的代码,通过live server或者直接通过浏览器,打开index.html代码查看效果。这个操作会影响开发效率,希望做到当文件发生变化时,可以自动的完成编译和展示

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

  • webpack watch mode

  • webpack-dev-server(常用)

  • webpack-dev-middleware

Webpack 中搭建本地服务器通常通过使用 webpack-dev-server 来实现。webpack-dev-server 是一个方便的开发工具,它为你提供一个轻量级的 HTTP 服务器,并能实时监控文件的变化,自动重新加载页面

  • npm install webpack-dev-server -D:安装

  • 修改配置文件,启动时加上serve参数在这里插入图片描述

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

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

  • 都配置完可以执行npm run serve,但如果你前面配置loaderplugins都是看我前面的文章练习的,这时会打包成功,但是访问http://localhost:8080/是空白的
    在这里插入图片描述

配置选项说明:

  • devServer:打包后不会生成打包文件
    • static.directory:本地服务器所提供服务的文件目录

    • compress:是否是否为静态文件启用 gzip 压缩,默认false,提高页面的加载性能
      在这里插入图片描述

    • host:设置主机地址,默认值是localhost,如果希望其他地方也可以访问,可以设置为 0.0.0.0

      localhost0.0.0.0 的区别:

      1. localhost 本质上是一个域名,通常情况下会被解析成127.0.0.1

      2. 127.0.0.1 回环地址(Loop Back Address),表达的意思其实是我们主机自己发出去的包,直接被自己接收

      3. 正常的数据库包经过 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层,而回环地址是在网络层直接就被获取到了,是不会经过数据链路层和物理层的

      4. 比如我们监听 127.0.0.1 时,在同一个网段下的主机中,通过ip地址是不能访问的

      5. 0.0.0.0 监听IPV4上所有的地址,再根据端口找到不同的应用程序,比如我们监听 0.0.0.0时,在同一个网段下的主机中,通过ip地址是可以访问的

    • port:指定服务器监听的端口号(例如 9000),不指定默认为 8080

    • open:启动服务器时自动打开浏览器,自动导航到 localhost:port

    • openPage:自动打开配置的页面

    • hot:开启模块热替换(HMR),默认已经开启,实现页面的局部更新而不重新加载整个页面,开启后浏览器中可以看到如下效果,修改入口文件还是会全局刷新的
      在这里插入图片描述

      HMR的全称是Hot Module Replacement,翻译为模块热替换,它是指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面

      HMR通过如下几种方式,来提高开发的速度:

      1. 不重新加载整个页面,这样可以保留某些应用程序的状态不丢失

      2. 只更新需要变化的内容,节省开发的时间

      3. 修改了css、js源代码,会立即在浏览器更新,相当于直接在浏览器的devtools中直接修改样式

      如果发现当修改了某一个模块的代码时,依然是刷新的整个页面,这是因为需要去指定哪些模块发生更新时进行HMR,在实际项目中我们不需要自己设置的

      vue开发中,使用vue-loader,此loader支持vue组件的HMR,提供开箱即用的体验

      react开发中,有React Hot Loader,实时调整react组件(目前React官方已经弃用了,改成使用react-refresh
      在这里插入图片描述

    • historyApiFallback:如果启用了 HTML5History API(用于单页应用),需要该配置项来重定向所有 404 到首页。否则,在子页面刷新时可能找不到对应资源

配置整体代码参考:

const path = require("path");
const { VueLoaderPlugin } = require("vue-loader/dist/index");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { DefinePlugin } = require("webpack");module.exports = {mode: "development",entry: "./src/index.js",output: {clean: true,filename: "index.js",path: path.resolve(__dirname, "build"),}, resolve: {alias: {'@components': path.resolve(__dirname, 'src/components'),'@utils': path.resolve(__dirname, 'src/utils'),},extensions: ['.js', '.vue', '.json'],},devServer: {static: {directory: path.resolve(__dirname, 'build'), // 服务器内容的目录},compress: true, // 启用 gzip 压缩port: 9000, // 指定服务器端口号open: true, // 自动打开浏览器open: ['main.html'], // 自动打开浏览器并定向到http://localhost:9000/main.htmlhot: true, // 热更新historyApiFallback: true, // 支持HTML5的历史API(单页应用中很有用)},plugins: [new VueLoaderPlugin(),new CleanWebpackPlugin(),new HtmlWebpackPlugin({title: "haahha",template: "./public/index.html",filename: "main.html",minify: {collapseWhitespace: true, // 移除空白removeComments: true, // 移除注释removeAttributeQuotes: true, // 移除属性的引号},}),new DefinePlugin({BASE_URL: '"./"',}),],module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},{test: /\.m?js$/,use: [{loader: "babel-loader",options: {presets: ["@babel/preset-env"],},},],},{test: /\.vue$/,loader: "vue-loader",},],},
};

区分环境配置

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

  • 但某些配置是在开发环境需要使用的,某些配置是在生成环境需要使用的,当然某些配置是在开发和生成环境都会使用的

  • 当配置越来越多时这个文件会变得越来越不容易维护,最好对配置进行划分,方便我们维护和管理

如何区分不同的配置:

  • 建立config文件夹编写开发和生产配置文件

  • 抽取公共的配置,并与开发和生产配置合并

  • 添加不同的打包脚本
    在这里插入图片描述

// wk.comm.config.js
const path = require("path");
const { VueLoaderPlugin } = require("vue-loader/dist/index");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { DefinePlugin } = require("webpack");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),}, resolve: {alias: {'@components': path.resolve(__dirname, 'src/components'),'@utils': path.resolve(__dirname, 'src/utils'),},extensions: ['.js', '.vue', '.json'],},plugins: [new VueLoaderPlugin(),new HtmlWebpackPlugin({title: "haahha",template: "./public/index.html",filename: "main.html",minify: {collapseWhitespace: true, // 移除空白removeComments: true, // 移除注释removeAttributeQuotes: true, // 移除属性的引号},}),new DefinePlugin({BASE_URL: '"./"',}),],module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},{test: /\.m?js$/,use: [{loader: "babel-loader",options: {presets: ["@babel/preset-env"],},},],},{test: /\.vue$/,loader: "vue-loader",},],},
};// wk.dev.config.js
const path = require("path");
const { merge } = require('webpack-merge')
const commonConfig = require('./wk.comm.config')module.exports = merge(commonConfig, {mode: "development",devServer: {static: {directory: path.resolve(__dirname, 'build'), // 服务器内容的目录},compress: true, // 启用 gzip 压缩port: 9000, // 指定服务器端口号open: true, // 自动打开浏览器open: ['main.html'], // 自动打开浏览器并定向到http://localhost:9000/main.htmlhot: true, // 热更新historyApiFallback: true, // 支持HTML5的历史API(单页应用中很有用)},
});// wk.prod.config.js
const { merge } = require('webpack-merge')
const commonConfig = require('./wk.comm.config')module.exports = merge(commonConfig, {mode: "production",output: {clean: true,}, 
});

相关文章:

Webpack模式-Resolve-本地服务器

目录 ResolveMode配置搭本地服务器区分环境配置 Resolve 前面学习时使用了各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库,在 Webpack 中,resolve 是用于解析模块依赖的配置项,它决定了 We…...

【LLM论文日更】| 通过指令调整进行零样本稠密检索的无监督文本表示学习

论文:https://arxiv.org/pdf/2409.16497代码:暂未开源机构:Amazon AGI、宾夕法尼亚州立大学领域:Dense Retrieval发表:Accepted at DCAI24 workshopCIKM2024 研究背景 研究问题:这篇文章要解决的问题是如…...

02.01、移除重复节点

02.01、[简单] 移除重复节点 1、题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 2、解题思路 为了实现这一目标,我们可以使用一个哈希表(或集合)来记录已经遇到的节点值,逐步遍历链表并删…...

旅游推荐|旅游推荐系统|基于Springboot+VUE的旅游推荐系统设计与实现(源码+数据库+文档)

旅游推荐系统 目录 基于java的旅游推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#xf…...

github项目--crawl4ai

github项目--crawl4ai 输出html输出markdown格式输出结构化数据与BeautifulSoup的对比 crawl4ai github上这个项目,没记错的话,昨天涨了3000多的star,今天又新增2000star。一款抓取和解析工具,简单写个demo感受下 这里我们使用cra…...

仅有N卡独显的情况下安装ubuntu是遇到的黑屏,加载卡顿等问题

Ubuntu安装的两个阶段都要进行一定的设置来临时禁用掉独显或者ubuntu的通用显卡驱动。 U盘启动阶段 U盘启动阶段要对U盘启动项进行设置,通过BIOS设置第一boot为USB hard disk后可以进到U盘引导项,第一项为 “try or install ubuntu”,倒计时10s后自动进入。 这个时候不要…...

Vite:为什么选 Vite

一、现实问题 在浏览器支持 ES 模块之前,JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们对 “打包” 这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运行的文件。 时过境迁,我…...

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书,由受信任的证书颁发机构(CA)颁发,用于在互联网通信中建立加密链接。SSL代表“安全套接层”,是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…...

Rust 函数

Rust 函数 Rust 是一种系统编程语言,以其安全性、并发性和性能而闻名。函数是 Rust 编程语言中的基本构建块,用于封装可重用的代码块。本文将深入探讨 Rust 中的函数,包括其定义、特性、参数、返回值以及高级概念。 函数定义 在 Rust 中&a…...

微信小程序中的 `<block>` 元素:高效渲染与结构清晰的利器

微信小程序中的 <block> 元素&#xff1a;高效渲染与结构清晰的利器 在微信小程序的开发中&#xff0c;<block> 元素扮演着举足轻重的角色。尽管它不会在页面中渲染任何可见的节点&#xff0c;但作为一个逻辑上的容器&#xff0c;<block> 在条件渲染和循环渲…...

选读算法导论5.2 指示器随机变量

为了分析包括包括雇佣分析在内的许多算法&#xff0c;我们将使用指示器随机变量&#xff0c;它为概率和期望之间的转换提供了一个便利的方法&#xff0c;给定一个样本空间S和事件A&#xff0c;那么事件A对应的指示器随机变量&#xff1a; Xa 1 如果A发生    0 如果…...

大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

centos9 nginx 版本

centos9 安装 ssh -V OpenSSH_8.7p1, OpenSSL 3.2.2 4 Jun 2024 openssl version OpenSSL 3.2.2 4 Jun 2024 (Library: OpenSSL 3.2.2 4 Jun 2024) sudo yum install nginx Installing:nginx x86_64 2:1.20.1…...

https访问报错:net::ERR_CERT_DATE_INVALLD

目录 简介异常排查原因解决补充 简介 访问https资源出现报错 异常 排查 将地址拿到浏览器进行访问&#xff0c;可以很清晰的看到出现该问题的原因 原因 1、SSL证书已过期 2、服务器日期不准&#xff0c;不在证书有效期 解决 1、重新申请SSL证书&#xff0c;并配置 2、校正…...

cat用来查看文件内容、合并文件,或者将文件内容输出到终端

cat 是 Unix 和 Linux 系统中的一个命令&#xff0c;它的名称来源于 “concatenate”&#xff08;连接&#xff09;&#xff0c;主要用来查看文件内容、合并文件&#xff0c;或者将文件内容输出到终端。 常用用法 查看文件内容 cat filename输出 filename 的内容到终端中。 例…...

基于ssm大学生自主学习网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1、毕业论文&#xff08;设计&#xff09;的背景及意义&#xff1a; &#xff08;1&#xff09;研究背景 目前&#xff0c;因特网是世界上最大的计算机互联网络&#xff0c;它通过网络设备将世界各地互相独立的不同规模的局域…...

C++基础补充(01)C++11基于范围的for循环

文章目录 1. 基本语法1.1 decalaration默认获取值引用&自动类型推导&#xff08;auto&#xff09; 1.2 container数组STL容器初始化列表自定义类型返回容器的函数 2. 其他示例2.1 遍历数组2.2 遍历vector&#xff0c;并修改元素2.3 使用常量引用遍历&#xff0c;防止容器中…...

qt6 使用QPSQL

检查可用的数据库驱动&#xff1a; // iteator all database driverQStringList drivers QSqlDatabase::drivers();QStringList::iterator it;for (it drivers.begin(); it ! drivers.end(); it){qDebug() << *it;} qt6 自带pg数据库驱动&#xff1a; pro文件加个说明&…...

【PostgreSQL】提高篇——公用表表达式(CTE)和窗口函数

在这篇文章中&#xff0c;我将详细介绍 PostgreSQL 中的公用表表达式&#xff08;CTE&#xff09;和窗口函数&#xff0c;帮助你理解如何使用它们进行复杂的数据分析。我将通过具体的示例来演示这些概念的实际应用&#xff0c;并在每个示例中提供详细的解释和注释。 1. 公用表…...

【min25筛】【CF2020F】Count Leaves

题目 定义 f ( n , 0 ) 1 f(n,0)1 f(n,0)1&#xff0c; f ( n , d ) ∑ k ∣ n f ( k , d − 1 ) f(n,d)\sum_{k|n}f(k,d-1) f(n,d)∑k∣n​f(k,d−1) 给出 n , k , d n,k,d n,k,d&#xff0c;你需要求出: ∑ i 1 n f ( i k , d ) m o d ( 1 0 9 7 ) \sum_{i1}^n f(i^k…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...