引用抖音哲玄前端
二、基于webpack5完成工程化建设
Webpack对项目工程化设计
(一)项目使用webpack5的工程化设计请大致描述一下。
Webpack5对/app/pages下的业务文件进行解析,解析引擎分为三层,第一层解析编译,找到业务文件中所有entry.xx.js文件进行依赖分析,随后挂载的.vue -> vue-loader,.less -> less-loader,.css->css-loader,.js -> bebel-loader,.png ->file-loader进行编译,输出js、css、png、tpl等文件
进行第二层模块分包,根据拆分规则将模块进行abc.js -> a.js、b.js、c.js等文件,输出若干js、css、png、tpl等文件。
进行第三层模块压缩优化,分两种情况
生产环境:
压缩混合js、压缩css、输出文件产物
开发环境:
资源注入内存、本地服务热更新
无论是哪种最后都会生成产物文件,只不过产物文件不同,产物文件存放在app/public下
当Koa的全局中间件(app/middleware)进行时,koa-nunjucks-2则会对app/public下.tpl模板文件进行解析从而输出页面
前端工程化搭建
(一)webpack是什么?
Webpack 是一个流行的前端模块打包工具,可将多个模块打包成一个或多个文件,优化资源加载。
(二)Less是什么?
Less 是一种 CSS 预处理器,它扩展了 CSS 语法,提供变量、嵌套、混合(Mixins)、函数等功能,让 CSS 更易维护和扩展。
(三)基础知识
1.v-model是什么?
在 Vue 3 中,v-model 是一个语法糖,用于在表单控件或自定义组件上创建双向数据绑定。它本质上是 :value 和 @input 事件的组合,让数据的更新更加简洁。
2.{{}}是什么?
在 Vue 3 中,{{ }} 是插值语法(Mustache 语法),用于在模板中动态渲染 JavaScript 表达式的值。它是 Vue 最基本的数据绑定方式,可将组件实例中的数据实时显示在 DOM 中。
3.ref是什么?
在 Vue 3 中,ref 是一个核心 API,用于创建响应式数据引用。它允许你在组件中定义响应式变量,并在模板或方法中使用。ref 在组合式 API 中扮演着至关重要的角色。
4.process.stdout.write() 是什么?
process.stdout.write() 是 Node.js 中用于向标准输出流(stdout)发送数据的核心方法。它允许你在终端中打印内容,类似于 console.log(),但更加底层和灵活。
5.throw是什么?
在 JavaScript 中,throw 是一个关键字,用于手动抛出异常(错误)。当程序遇到异常情况时,可以使用 throw 中断正常流程,并将错误信息传递给调用者。
6.path.baseName是什么?
在 Node.js 中,path.basename() 是 path 模块提供的一个核心方法,用于从路径中提取文件名部分
7....HTMLWebpackPluginList是什么语法?
...HTMLWebpackPluginList 是 JavaScript 中的展开语法(Spread Syntax),用于将一个数组或可迭代对象展开为多个独立元素
8.pageEntries[entryName] = file是什么语法?
pageEntries[entryName] = file 是 JavaScript 中的对象属性赋值语法,用于动态地向对象添加属性或修改现有属性的值。
9.Object.key的作用?
Object.keys() 是 JavaScript 中用于获取对象自身可枚举属性的方法。它返回一个由对象的键名组成的数组,顺序与使用 for...in 循环遍历对象时相同
10.__dirname是什么?
__dirname 是 Node.js 中的一个全局变量,用于表示当前执行脚本所在的目录的绝对路径。它在模块化开发和文件路径处理中非常有用。
11.filePath.endsWith('.tpl') 是什么?
filePath.endsWith('.tpl') 是一个 JavaScript 字符串方法调用,用于判断文件路径是否以 .tpl 结尾。
12.message.match(/timeout/) 是什么?
message.match(/timeout/) 是一个 JavaScript 正则表达式匹配操作,用于检查字符串 message 中是否包含子字符串 "timeout"
13.Promise.resolve是什么?
Promise.resolve() 是 JavaScript 中 Promise 对象的一个静态方法,用于快速创建一个已解决(resolved)的 Promise。
14.Async和await的作用?
async 和 await 是 JavaScript 中用于处理异步操作的语法糖,它们基于 Promise 构建,旨在让异步代码看起来更像传统的同步代码,从而提高可读性和可维护性。await 会暂停当前函数的执行
(四)style标签中的scoped是什么?
在 Vue 中,scoped 是一个用于限制 CSS 作用域的特殊属性,主要在单文件组件(.vue 文件)中使用。当你在 标签上添加 scoped 属性后,该样式只会应用到当前组件的元素上,不会影响其他组件。
(五)Webpack的基础配置以及作用?
entry(入口文件)
Module(模块解析配置)
Output(产物输出路径)
Resolve(配置模块解析的具体行为)
Plugins(配置webpack插件)
Optimization(配置打包输出优化)
(六)vue-leader是什么?
vue-loader 将 Vue 组件转换为 JavaScript 模块,提取模板、样式和脚本。
(七)Babel-loader是什么?
将 ES6+ 代码转换为向后兼容的 JavaScript。
(八)url-loader是什么?
处理图片资源,小文件转为 base64 内联,大文件单独输出。
(九)Css-loader是什么?
css-loader:解析 CSS 中的 @import 和 url() 等引用。
(十)Style-loader是什么?
style-loader:将 CSS 插入到 HTML 的 标签中。
(十一)Less-loader是什么?
less-loader:将 Less 转换为 CSS。
(十二)File-loader是什么?
file-loader:将文件复制到输出目录,并返回引用路径。
(十三)什么是水合?
水合是指在服务端渲染生成 HTML 后,客户端 Vue 实例会将这些 HTML 与 JavaScript 逻辑进行结合,使静态的 HTML 变得可交互,这个过程就叫水合。而 VUE_PROD_HYDRATION_MISMATCH_DETAILS 是用于控制在生产环境下,是否显示水合不匹配的详细信息。
(十四)html-webpack-plugin 是什么?
html-webpack-plugin 是一个 Webpack 插件,用于自动生成 HTML 文件并注入打包后的资源(如 JS、CSS)。它在前端构建流程中扮演着模板管理和资源注入的核心角色,尤其适用于单页应用(SPA)或多页应用(MPA)的场景。
(十五)在自定义配置wenpack启动命令时--max_old_space_size=4090是做什么的?
--max_old_space_size=4090 是 Node.js 的一个命令行标志,用于设置 Node.js 进程可用的最大堆内存(heap memory)大小,单位是兆字节(MB)。
(十六)webpack-merge 是什么?
webpack-merge 是一个用于合并 Webpack 配置对象的工具库,它能帮助你将多个 Webpack 配置文件合并为一个,使配置更模块化、可维护。尤其适用于开发环境和生产环境需要不同配置的场景。
(十七)os库是什么?
在 Node.js 中,os 是一个内置核心模块,提供了与操作系统交互的实用工具。它允许你获取系统信息(如 CPU、内存、网络)、用户信息和路径分隔符等,无需额外安装依赖。
(十八)happypack是什么?
happypack 是一个用于加速 Webpack 构建过程的插件,通过将耗时的任务分配给多个子进程并发执行,充分利用多核 CPU 资源,显著提升打包速度。尤其适用于大型项目或依赖众多的应用。
(十九)mini-css-extract-plugin是什么 ?
mini-css-extract-plugin 是一个用于 Webpack 的 CSS 提取插件,它能将 CSS 代码从 JavaScript 打包文件中分离出来,生成独立的 CSS 文件。这一优化显著提升了应用加载速度和缓存效率,尤其适用于生产环境。
(二十)clean-webpack-plugin 是什么?
clean-webpack-plugin 是一个用于 自动清理 Webpack 构建目录 的插件。在每次构建前,它会删除(或清理)指定目录中的旧文件,确保输出目录只包含最新生成的资源,避免旧文件残留导致的缓存问题或部署混淆。
(二十一)css-minimizer-webpack-plugin 是 什么?
css-minimizer-webpack-plugin 是一个用于 压缩和优化 CSS 文件 的 Webpack 插件,通过移除冗余代码、缩短选择器名称和应用高级压缩算法,显著减小 CSS 文件体积,提升加载速度。它是 Webpack 5 官方推荐的 CSS 压缩解决方案,常与 mini-css-extract-plugin 配合使用。
(二十二)html-webpack-inject-attributes-plugin 是什么?
html-webpack-inject-attributes-plugin 是一个用于 自动向 HTML 文件注入自定义属性 的 Webpack 插件。****
(二十三)terser-webpack-plugin 是什么?
terser-webpack-plugin 是一个用于 Webpack 的 JavaScript 压缩插件,基于 Terser 实现。它主要用于在生产环境中减小 JavaScript 代码体积,提高加载速度。
(二十四)开发环境的热更新打包的设计流程?
用户在开发保存的时候,保存完之后,被服务器监听
监听到了开始解析编译、模块分包、压缩优化
落地成具体文件到产物文件
其他内容放在服务器内存中
内存内容会被服务器监听到,通知浏览器这边更新了
浏览器再将服务器内存的东西重新请求过来
(二十五)Express是什么?
Express 是一个基于 Node.js 的轻量级 Web 应用框架,用于快速构建服务器端应用、API 和网站。它提供了简洁的路由系统、中间件机制和模板引擎支持,被广泛应用于前后端分离的项目中。
(二十六) webpack-dev-middleware是什么 ?
webpack-dev-middleware 是一个中间件,用于在 Node.js 服务器(如 Express) 中集成 Webpack 的打包功能,使打包后的文件直接在内存中生成并 serving,无需写入磁盘。它是 Webpack 开发环境的核心组件之一,常用于自定义开发服务器或与框架(如 Express、Koa)集成。
(二十七)webpack-hot-middleware 是什么?
webpack-hot-middleware 是一个用于实现 Webpack 热模块替换(Hot Module Replacement, HMR) 的中间件,它允许在运行时更新模块而无需完全刷新整个页面。结合 webpack-dev-middleware 或自定义服务器(如 Express),可提供更流畅的开发体验。
(二十八)consoler是什么?
一个轻量级日志工具,支持颜色、级别和格式化输出(但使用较少)
(二十九)WebSocket是什么 ?
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许客户端(如浏览器)和服务器之间实时交换数据。
(三十)EventSource 是 什么?
EventSource 是浏览器提供的一种单向实时通信机制,允许客户端(浏览器)自动接收来自服务器的更新。它基于 HTTP 协议,实现了服务器向客户端的单向数据推送,特别适合需要实时获取数据更新的场景(如新闻推送、实时通知、状态监控等)。
(三十一)页面路由是怎么样设计的?
浏览器搜索路径,发起页面请求,通过bff层去寻找对应模板路径,进入到单页面应用通过router路由进行页面路径分发从而访问页面
(三十二)CSR和SSR的区别?
CSR浏览器渲染页面,SSR服务端渲染页面
(三十三)Vue-router是什么?
Vue Router 是 Vue.js 官方的路由管理器,用于实现单页面应用(SPA)的路由功能。它通过组件化的方式管理路由,支持动态路由、嵌套路由、导航守卫、路由懒加载等特性,是构建大型 Vue 应用的核心工具。
(三十四)Pinia是什么?
Pinia 是 Vue.js 的官方状态管理库,作为 Vuex 的继任者,提供更简洁的 API、TypeScript 支持和更好的性能。它采用组合式 API 的设计思想,支持模块化存储,并与 Vue 3 的响应式系统深度集成。
(三十五)element-plus是什么?
Element-plus 是基于 Vue 3 和 TypeScript 开发的 UI 组件库,是 Element UI 的升级版。它提供了丰富的高质量组件(如按钮、表单、表格、弹窗等),遵循统一的设计语言,支持国际化和按需加载,广泛用于企业级后台管理系统。
(三十六)lodash是什么 ?
Lodash 是一个功能强大、性能优化的 JavaScript 工具库,提供了丰富的实用函数,用于简化数组、对象、字符串等数据类型的操作。它被广泛应用于前端开发(如 React、Vue 项目)和 Node.js 后端,旨在提高代码效率和可读性。
(三十七)完整的讲述webpack工程化的流程。
当使用生产命令启动时,首先会看配置中entry拿到app/pages下所有入口文件(entry.xx.js)
再看配置中的module、resolve、plugin,进行对各个业务文件通过happypack进行多线程处理进行解析。
再通过optimization配置,进行对模块分包,分成第三方依赖与公共模块进行缓存,使用TerserWebpackPlugin的并发和缓存,提升压缩阶段的性能
多线程打包完成将产物文件根据output配置来进行输出
当使用开发命令启动时,首先获取devServer热更新的配置
指定静态文件目录挂载到express上
拿到配置中entry下的所有入口文件
看module、resolve、plugin中配置进行模块解析
再通过optimization配置,进行对模块分包,分成第三方依赖与公共模块进行缓存,使用TerserWebpackPlugin的并发和缓存,提升压缩阶段的性能
最后在根据output的配置进行输出
随后将devMiddleware(监听文件改动,将资源暂存到内存中) 中间件挂载到express上,控制tpl文件写入磁盘,配置外部资源的公共路径
将hotMiddleware(实现热更新通讯,告诉浏览器内部资源更新要重新请求)中间件挂载到express上,允许客户端接收服务器端单项通信实时更新
最终启动express服务器,即可完成热更新webpack配置
(三十八)具体描述一下webpack的热更新时的流程
当业务文件改动时devMiddleware中间件监听到改动,则触发webpack配置内容,输出文件时资源暂存内存,模板页输出到磁盘,而core流程进行解析注册路由到浏览器上,随后hotMiddlware中间件向浏览器进行通知,浏览器接收后随即让模板页通过暴露的外部资源进行资源的请求,即可做到业务进行修改时,浏览器也进行变化。