前端 webpack 面试题

文章目录

    • webpack打包流程
    • webpack声明周期
    • 自开发 webpack 插件
    • loader和plugin的区别
      • Loader(加载器):
      • Plugin(插件):
      • 总结区别:
    • webpack如何热启动及原理
      • HMR(热更新实现的原理)
      • websocket
      • fs.watch
    • 说说一些常用的loader和plugin
      • 常用Loader:
      • 常用Plugin:
    • webpack和vite的区别
      • 1. **构建速度:**
      • 2. **开发服务器:**
      • 3. **构建输出:**
      • 4. **配置方式:**
      • 5. **生态系统:**

在这里插入图片描述

webpack打包流程

  • 解析配置文件:Webpack 会读取并解析配置文件(通常是 webpack.config.js 文件),并根据配置生成一个 Compiler 对象。
  • 读取入口文件:Webpack 根据配置中的入口文件,读取这些文件及其依赖的模块,并将它们组成一个依赖图。
  • 解析模块依赖:Webpack 会根据模块之间的依赖关系,递归地解析它们的依赖,直到所有的依赖都被解析完毕。
  • 加载模块:Webpack 会根据模块的路径,使用相应的 Loader 加载模块的源代码,并将其转换为 Webpack 可以处理的形式。
  • 转换代码:Webpack 会根据配置中的插件,对加载的模块进行一系列的转换操作,比如压缩、合并、优化等。
  • 生成代码:Webpack 会将所有模块转换后的代码合并成一个或多个文件,并输出到指定的输出目录中。

webpack声明周期

在 Webpack 打包的过程中,Webpack 会触发一系列的生命周期事件。这些事件可以被插件所监听,并在相应的时机执行插件的逻辑。

Webpack 生命周期的主要事件包括:

  • beforeRun:Webpack 进入编译前的阶段,此时会初始化 Compiler 对象。
  • run:Webpack 开始编译前的阶段,此时会读取入口文件和依赖,并创建依赖图。
  • compilation:Webpack 进入编译阶段,此时会开始编译入口文件和依赖的模块,并生成输出文件。
  • emit:Webpack 生成输出文件前的阶段,此时可以在插件中处理生成的输出文件。
  • done:Webpack 完成打包后的阶段,此时可以在插件中进行一些清理工作。

自开发 webpack 插件

class MyPlugin {// 构造函数可以接收配置选项constructor(options) {this.options = options || {};}// Webpack 会调用 apply 方法来安装插件apply(compiler) {compiler.hooks.done.tap('FileSizePlugin', stats => {const { compilation } = stats;const assets = compilation.assets;let size = 0;for (let filename in assets) {size += assets[filename].size();}console.log(`Total size of the generated files: ${size} bytes`);});}
}module.exports = MyPlugin;

loader和plugin的区别

在Webpack中,Loader和Plugin是两个不同的概念,它们分别用于处理不同类型的任务,而且在Webpack的构建过程中扮演不同的角色。

Loader(加载器):

  1. 作用:

    • Loader用于在Webpack构建过程中对模块的源代码进行转换,将它们从一种形式转换为另一种形式。主要用于加载和转换文件,如将ES6代码转换为ES5、将SCSS转换为CSS等。
  2. 配置:

    • Loader通过Webpack配置中的module.rules进行配置。每个规则定义了一组条件和对应的Loader,当模块匹配这些条件时,相应的Loader就会被应用。
  3. 示例:

    • 以下是一个使用Babel Loader将ES6代码转换为ES5的Webpack配置示例:
      module.exports = {module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',},},],},
      };
      

Plugin(插件):

  1. 作用:

    • Plugin用于执行在整个构建过程中的特定任务,例如代码优化、资源管理、环境变量注入等。插件可以在Webpack的不同生命周期中执行,提供了更广泛的自定义和扩展能力。
  2. 配置:

    • 插件通过Webpack配置中的plugins数组进行配置。每个插件通常是一个JavaScript对象,配置了插件的行为和选项。
  3. 示例:

    • 以下是一个使用HtmlWebpackPlugin插件自动生成HTML文件的Webpack配置示例:
      const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {plugins: [new HtmlWebpackPlugin({template: 'src/index.html',}),],
      };
      

总结区别:

  • Loader:

    • 处理模块的源代码转换。
    • module.rules中配置。
    • 针对不同类型的文件进行处理。
  • Plugin:

    • 执行整个构建过程中的特定任务。
    • plugins中配置。
    • 提供了更广泛的自定义和扩展能力。

在实际的Webpack配置中,Loader和Plugin通常一起使用,以满足对不同类型的文件和构建过程的灵活需求。Loader负责处理文件转换,而Plugin负责执行其他构建任务。

webpack如何热启动及原理

需要安装 webpack-dev-server

npm install webpack webpack-dev-server --save-dev

设置 HotModuleReplacementPlugin,HotModuleReplacementPlugin 是 webpack 是自带的

plugins: {HotModuleReplacementPlugin: new webpack.HotModuleReplacementPlugin()
}

再设置一下devServer

devServer: {contentBase: path.resolve(__dirname, 'dist'),hot: true, // 重点关注historyApiFallback: true,compress: true
}
const webpack = require('webpack');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: '/dist',},devServer: {contentBase: path.resolve(__dirname, 'dist'),hot: true, // 重点关注historyApiFallback: true,compress: true},plugins: [new webpack.HotModuleReplacementPlugin(),],
};

HMR(热更新实现的原理)

  • 变更检测
    Webpack使用 Node.js 中的 fs 模块来实现文件系统的监视。Node.js的 fs 模块提供了一种监听文件和目录变化的方式,即 fs.watch 或 fs.watchFile。
  • 重新打包
    将变更的文件从新执行解析,编译,打包,形成输出文件,并发送给HMR。
  • 通知客户端
    HMR 通过 websocket(在初始打包时就已经建立),向客户端发送要更新文件的信息
  • 浏览器更新
    浏览器拿到新打包好的文件后,会保存当前页面的状态,替换掉旧的模块。

websocket

// 执行上面语句之后,客户端就会与服务器进行连接。
var ws = new WebSocket("wss://echo.websocket.org");// 实例对象的 onopen 属性,用于指定连接成功后的回调函数
ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!");
};// 实例对象的 onmessage 属性,用于指定收到服务器数据后的回调函数。可以接受二进制数据,blob 对象或者 Arraybuffer 对象
ws.onmessage = function(evt) {console.log( "Received Message: " + evt.data);ws.close();
};// 实例对象的 onclose 属性,用于指定连接关闭后的回调函数。
ws.onclose = function(evt) {console.log("Connection closed.");
};      

上面通过 new Websocket 创建一个客户端与服务端通信的实例,并通过 onmessage属性,接受指定服务器返回的数据,并进行相应的处理。

热更新是服务器更新后向客户端发送新的数据并要求客户端更新,而websocket最大的特点就是 服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送信息。这是 HTTP 不具备的,热更新实际上就是服务器端的更新通知到客户端,所以选择了 Websocket。

fs.watch

const fs = require('fs');// 监听文件变化
const watcher = fs.watch('./src', (event, filename) => {console.log(`File ${filename} has been ${event}`);
});// 在程序退出时关闭观察器
process.on('exit', () => {watcher.close();
});

说说一些常用的loader和plugin

Webpack有许多常用的loader和plugin,它们扩展了Webpack的功能,使其能够处理不同类型的文件、优化代码、生成HTML等。以下是一些常用的loader和plugin:

常用Loader:

  1. babel-loader: 用于将新版本的JavaScript代码转译为向后兼容的版本,以便在旧版本浏览器中运行。

    module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',},},],
    }
    
  2. style-loader和css-loader: 用于处理CSS文件,style-loader将CSS注入到DOM中,而css-loader负责解析CSS文件中的@importurl()等语句。

    module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},],
    }
    
  3. file-loader和url-loader: 用于处理文件,包括图片、字体等。file-loader将文件复制到输出目录,并返回文件路径,而url-loader可以将小文件转换成DataURL。

    module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 8192, // 小于8KB的文件转换为DataURL},},],},],
    }
    

常用Plugin:

  1. HtmlWebpackPlugin: 自动生成一个HTML文件,并将打包后的脚本自动添加到HTML文件中。

    const HtmlWebpackPlugin = require('html-webpack-plugin');plugins: [new HtmlWebpackPlugin({template: './src/index.html',// 其他配置...}),
    ]
    
  2. MiniCssExtractPlugin: 将CSS从JS文件中提取出来,生成单独的CSS文件。

    const MiniCssExtractPlugin = require('mini-css-extract-plugin');plugins: [new MiniCssExtractPlugin({filename: '[name].css',chunkFilename: '[id].css',}),
    ]
    
  3. CleanWebpackPlugin: 在每次构建前清理输出目录。

    const { CleanWebpackPlugin } = require('clean-webpack-plugin');plugins: [new CleanWebpackPlugin(),
    ]
    
  4. DefinePlugin: 允许在编译时创建全局常量。

    const webpack = require('webpack');plugins: [new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify('production'),}),
    ]
    
  5. HotModuleReplacementPlugin: 热更新

     plugins: {HotModuleReplacementPlugin: new webpack.HotModuleReplacementPlugin()}
    

webpack和vite的区别

Webpack和Vite都是现代前端开发中常用的构建工具,但它们在设计和使用上有一些显著的区别。以下是Webpack和Vite之间的一些主要区别:

1. 构建速度:

  • Webpack: Webpack是一个强大的打包工具,但在初次构建时可能会比较慢,特别是在大型项目中。Webpack通过使用多个loader和plugin来处理各种任务,这可能导致构建时间较长。
  • Vite: Vite致力于提供更快的开发和构建速度。它利用了现代浏览器原生支持的ES模块特性,实现了快速的开发服务器和快速的生产构建。Vite在开发过程中使用原生ES模块,无需打包,因此启动速度非常快。

2. 开发服务器:

  • Webpack: Webpack的开发服务器通常需要一些时间来启动,因为它需要构建整个应用程序。它在开发中通常使用HMR(热模块替换)来提高开发体验。
  • Vite: Vite使用了基于ES模块的开发服务器,不需要构建整个应用,因此启动速度非常快。Vite还支持更细粒度的HMR,使得只更新修改的部分而不影响整个应用。

3. 构建输出:

  • Webpack: Webpack在生产构建时生成的代码通常较大,因为它会将所有模块打包成一个或多个文件,包含了一些运行时的代码。
  • Vite: Vite的生产构建输出更为精简,因为它支持按需导入,只生成实际用到的模块,减小了打包文件的体积。

4. 配置方式:

  • Webpack: Webpack的配置相对较复杂,需要详细配置loader、plugin、entry等参数,适用于更灵活的场景。
  • Vite: Vite的配置相对简单,尤其是对于Vue.js项目,因为Vite提供了一套默认配置,无需额外的配置即可快速启动。

5. 生态系统:

  • Webpack: Webpack是一个成熟、强大的工具,有着庞大的生态系统和社区支持,适用于各种类型的项目。
  • Vite: Vite是一个相对较新的项目,因此生态系统相对较小,但它在Vue.js项目中有着良好的集成。

总体来说,选择Webpack还是Vite取决于项目的具体需求。对于大型项目或者对灵活性有更高要求的项目,Webpack可能是更好的选择。而对于中小型项目,尤其是Vue.js项目,Vite可能提供更简单、更快速的开发体验。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构]—栈和队列

💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:到头来,有意义的并不是结果,而是我们度…

TCP/IP

分层模型 TCP 传输控制协议 UDP 用户数据包协议 四层 应用层 负责发送/接收消息 传输层 负责拆分和组装 .期间会有编号 网络层 TCP/UDP 属于网络层, 不会判断和处理编号 数据链路层 以太网 ,网络设备 TCP 连接 TCP连接需要端口,进行通信 Java 通过Socket 接收消息 发送 …

【码神之路】【Golang】博客网站的搭建【学习笔记整理 持续更新...】

介绍 一个用原生GO开发的博客网站,涉及Golang Web开发、Web服务器搭建和HTTP请求处理、模板与静态资源处理等 技术栈 后端:Go、Go并发机制前端:HTML模版链接直达 Golang搭建博客网站的学习视频 注:这里我只记录我实质✅学习到…

PDF Reader Pro 3.0.1.0(pdf阅读器)

PDF Reader Pro是一款功能强大的PDF阅读、注释、填写表单&签名、转换、OCR、合并拆分PDF页面、编辑PDF等软件。 它支持多种颜色的高亮、下划线,可以按需选择,没有空白处可以进行注释,这时候便签是你最佳的选择,不点开时自动隐…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。 本文将带你深入理解容器探测[2],并特别关注相对较…

【iOS】知乎日报

文章目录 前言一、首页1.网络的异步请求2.避免同一网络请求执行多次3.下拉刷新与上拉加载的实现下拉刷新上拉加载 二、网页1.webView的实现2.webView的滑动加载3.网页与首页内容的同步更新 三、评论区Masonory实现行高自适应 四、收藏中心通过FMDB实现数据持久化1.创建或打开数…

内存可见性与指令重排序

文章目录 内存可见性内存可见性问题代码演示JMM(Java Memory Model) 指令重排序指令重排序问题代码演示指令重排序分析 volatile关键字volatile 保证内存可见性 & 禁止指令重排序volatile 不保证原子性 在上一节介绍线程安全问题的过程中&#xff0c…

分享一篇很就以前的文档-VMware Vsphere菜鸟篇

PS:由于内容是很久以前做的记录,在整理过程中发现了一些问题,简单修改后分享给大家。首先ESXI节点和win7均运行在VMware Workstation上面,属于是最底层,而新创建的CentOS则是嵌套后创建的操作系统,这点希望…

Dubbo从入门到上天系列第十八篇:Dubbo引入注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

一:Dubbo注册中心引言 1:什么是Dubbo的注册中心? Dubbo注册中心是Dubbo服务治理中极其重要的一个概念。它主要是用于对Rpc集群应用实例进行管理。 对于我们的Dubbo服务来讲,至少有两部分构成,一部分是Provider一部分是…

看不惯AI版权作品被白嫖!Stability AI副总裁选择了辞职,曾领导开发Stable Audio

近日,OpenAI的各种大瓜真是让人吃麻了。 而就在Sam Altmam被开除前两天,可能没太多人注意到Stability AI副总裁Newton—Rex因看不惯StabilityAI在版权保护上的行为选择辞职一事。 大模型研究测试传送门 GPT-4传送门(免墙,可直接…

基于VM虚拟机下Ubuntu18.04系统,Hadoop的安装与详细配置

参考博客: https://blog.csdn.net/duchenlong/article/details/114597944 与上面这个博客几乎差不多,就是java环境配置以及后面的hadoop的hdfs-site.xml文件有一些不同的地方。 准备工作 1.更新 # 更新 sudo apt update sudo apt upgrade2.关闭防火…

【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式

一、面向对象设计原则 重新认识面向对象 理解隔离变化 • 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小 各司其职 • 从微观层面来看,面向对象的方式更强调各个类的“责任” • 由于需求变化导…

NFC:应用场景广泛的短距离通信技术

NFC:应用场景广泛的短距离通信技术 一、NFC 技术介绍1.1 NFC 技术应用场景1.2 NFC 技术优点1.3 NFC 工作原理 二、NFC 开发2.1 NFC 应用开发流程2.2 NFC 读取和写入2.3 NFC 读写功能示例 三、总结 一、NFC 技术介绍 NFC (Near-field communication&…

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于向量加权平均优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

SpringBoot——》配置logback日志文件

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

关于一些bug的解决1、el-input的输入无效2、搜索之后发现数据不对3、el多选框、单选框点击无用4、

el-input输入无效 原来的代码是 var test null 但是我发现不能输入任何值 反倒修改test的初始值为123是可以的 于是我确定绑定没问题 就是修改的问题 于是改成 var test ref() v-model绑定的值改成test.value就可以了 因为ref是相应式的 可以通过输入…

有依次对应关系的数组X、Y、Z,如何排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应(C语言实现)

1. 目的 有依次对应关系的数组X、Y、Z,排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应,并打印出排序完成后的X、Y、Z数组。 2. 具体实现 以下面的这个对应关系为例,进行相应编程实现。 X [3.7,7.7,-6.6,1.5,-4.5…

深度学习环境配置(Anaconda+pytorch+pycharm+cuda)

NVIDIA驱动安装 首先查看电脑的显卡版本,步骤为:此电脑右击-->管理-->设备管理器-->显示适配器。就可以看到电脑显卡的版本了。 然后按照电脑信息,到地址 去安装相应的驱动,Notebooks是笔记本的意思,然后下…

[SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

pdf | proj | code 本文提出一种新的3D数据表达形式3D Gaussians。每个Gaussian由以下参数组成:中心点位置、协方差矩阵、可见性、颜色。通过世界坐标系到相机坐标系,再到图像坐标系的仿射关系,可将3D Gaussian映射到相机坐标系,通…

【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会。

复合查询 前言正式开始一些开胃菜多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字多列子查询在from中使用子查询 合并查询union 和 union all 前言 我前面博客讲的所有的查询都是在单表中进行的,从这里开始就要专门针对查询这个话题进行进一步…