webpack Node git常见面试题

246 阅读9分钟

说说你对webpack的理解?解决了什么问题?

webpack是一个现代的JavaScript应用程序的静态模块打包工具,webpack就是一个打包工具,万物皆可模块能力,帮我们更高效的管理维护项目中的每一个资源
webpack可以帮我们编写一些高级的代码让浏览器执行,会将我们的代码进行压缩,合并以及其他相关的优化,帮助我们检查代码语法错误

说说Loader和Plugin的区别?

loader:加载器 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,,如编译CSS,LESS 压缩等最终一起打包到指定文件
plugin:赋予了 webpack 各种灵活的功能,例如打包优化,资源管理,环境变量注入,目的就是解决loader解决不了的事情
loader能做的事,plugin 都能做
loader:在配置项module中rules数组里面进行配置,loader运行在打包文件之前 loader就是单纯文件转换过程
plugin:是有单独的配置项 plugin整个编译周期都起作用  Webpack运行的生命周期会广播非常多的事件, plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果

webpack 热更新(HMR)

热更新可以理解成模块热替换,指在应用程序过程中,只处理对本次的修改的模块进行更新,不会重新刷新整个应用
开启:hot: true

如何提升 webpack 提升打包构建速度

1.使用热更新 让开发时只重新编译打包更新变化了的代码,不变的代码使用缓存,从而使更新速度更快
2.cache 使用缓存对eslint和babel处理的结果进行缓存,让第二次打包速度更快
3.优化 loader 可以使用OneOF 让资源文件一旦被某个 loader 处理了,就不会继续遍历了,打包速度更快。 可以通过配置include、exclude、test属性来匹配文件,接触include、exclude规定哪些匹配应用loader
4.terser 启动多线程 使用多进程并行运行来提高构建速度

说说如何借助webpack来优化前端性能?

JS代码压缩 可以帮助我们压缩、丑化我们的代码,让bundle更小
CSS代码压缩 压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等
Html文件代码压缩
图片压缩 对项目中图片进行压缩,体积更小,请求速度更快。如果是在线图片就可以不用,对本地项目静态才需要进行压缩
使用 Preload / Prefetch 对代码进行提前加载,等未来需要使用时就能直接使用,从而用户体验更好。
    Preload:告诉浏览器立即加载资源。
    Prefetch:告诉浏览器在空闲时才开始加载资源。
    Preload加载优先级高,Prefetch加载优先级低。
    Preload只能加载当前页面需要使用的资源,Prefetch可以加载当前页面资源,也可以加载下一个页面需要使用的资源。

说说你对Node.js 的理解?优缺点?应用场景?

Nodejs是一个开源与跨平台的JavaScript运行环境,是基于Chrome V8引擎的JavaScript运行环境
可以理解为 Node.js 就是一个服务器端的、非阻塞式I/O的、事件驱动的JavaScript运行环境

说说对中间件概念的理解

在NodeJS中,中间件主要是指封装http请求细节处理的方法 具体来说封装在程序中处理HTTP请求的功能 处理业务流程的中间环节
其实本质就是一个function函数 ,中间件就像在管道中执行 当我们请求发过来的时候,就会经过中间件进行处理,如果没有使用中间的 next ()那么这个请求卡就会到这里
中间件有四个 参数 第一个是 error request response next
在全局使用中间件 可以使用 app.use

app.use的理解

其实就是把中间件加载到特定的请求路径下面
就会有两个知识点
中间件和请求路径
请求路径:比如 query string 解析,post body 解析,cookie 解析,session 处理,而其他逻辑是因请求路径而异的。如果不指定请求路径,这样挂载的中间件就是全局的,所有请求都会走,如果指定了请求路径,匹配这个路径的请求过来,会先走全局的,再走具体的。

Seeion JWT

都是为了实现登陆认证 
HTTP是无状态的所以不知道用户有没有登陆过,所以就可以Session 
Session,是一种有状态的会话管理机制,其目的就是为了解决HTTP无状态请求带来的问题。
Session是存储在服务器中,Session依赖于SessionID,id会以cookie的形式发给服务器,然后服务器端再根据这个Session Id来检查该用户有没有登录过:
1.当有多个服务器集群时候,session信息需要在多个服务器之间共享,无疑加大服务器的压力。2.许多浏览器会禁用cookie。
JWT是目前最流行的跨域认证解决方案 
    客户端请求服务器,服务器会返回一个 JWT字符串(也就是Token),这个字符串会存储在 localstorage SessionStorage JWT字符串是被加密过的 分为三部分 头部 有效荷载 签名 ,只有中间才是
    用户信息 当用户下次登录会把把JWT 放在HTTP 请求头的 Authorization字段中发送给服务器进行验证 
    JWT签名的长度远比一个 Session Id长很多,增加额外网络开销 秘钥或Token一旦泄露,攻击者便可以肆无忌惮操作我们的系统

说说你对版本管理的理解?常用的版本管理工具有哪些?

版本控制就像一台时光机器,可以让我们回到任何一个时间点,一个程序开发出来肯定不会一直是这个样子一直是这些功能,当我们需要进行版本更新的时候,会在原来的代码进行开发,但是为了不破坏以前的代码,
我们就复制一份,这种也是一种版本管理,只是现在我们使用版本控制系统来实现版本管理
常见的版本管理系统
    本地版本控制系统 --- 不支持远程操作,不支持多人开发
    集中式版本控制系统 --- 必须联网,宕机无法工作
    分布式版本控制系统

说说Git常用的命令有哪些?

git init 初始化仓库,默认为 master 分支
git add . 提交全部文件修改到缓存区
git add <具体某个文件路径+全名> 提交某些文件到缓存区
git diff 查看当前代码 add后,会 add 哪些内容
git diff --staged查看现在 commit 提交后,会提交哪些内容
git status 查看当前分支状态
git pull <远程仓库名> <远程分支名> 拉取远程仓库的分支与本地当前分支合并
git pull <远程仓库名> <远程分支名>:<本地分支名> 拉取远程仓库的分支与本地某个分支合并
git commit -m "<注释>" 提交代码到本地仓库,并写提交注释
git commit -v 提交时显示所有diff信息
git commit --amend [file1] [file2] 重做上一次commit,并包括指定文件的新变化
git branch 查看本地所有分支
git merge <分支名> 合并分支
git checkout <分支名> 切换到本地某个分支
git push <远程库名> :<分支名> 删除远程某个分支
git fetch [remote] 下载远程仓库的所有变动
git pull [remote] [branch] 拉取远程仓库的分支与本地当前分支合并

说说对git pull 和 git fetch 的理解?有什么区别?

pull fetch作用上他们的功能是大致相同的,都是起到更新代码的作用
在我们本地的git文件中有本地仓库的 commit ID 和 远程库的 commit ID 
使用fetch 只会改变本地git文件里面的远程库的代码  ,不会更新本地仓库的代码,需要手动 merge
使用 pull 的话就直接帮我们更新 本地的代码更新到 远程库里最新的代码,相当于 fetch +  merge,两个 ID也会更新
相比起来,git fetch 更安全也更符合实际要求,在 merge 前,我们可以查看更新情况,根据实际情况再决定是否合并

说说 git 发生冲突的场景?

出现冲突可能就是多个分支修改了同一个的文件的任何地方,或者多个分支修改了同一个文件的名称
出现冲突的话 git会提醒我们手动修改,并且给我们标注当前更改和传入的更改 用 《 》来标注,git也跟我们提供快捷按钮,保留双方更改,采用当前更改 采用传入的更改
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交

说说什么是进程?什么是线程?区别?

进程:是cpu分配资源的最小单位 进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位 打开一个应用程序就是一个进程
线程:是cpu调度的最小单位 线程(thread)是操作系统能够进行运算调度的最小单位,其是进程中的一个执行任务(控制单元),负责当前进程中程序的执行
一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存,线程之间可以共享对象、资源,如果有冲突或需要协同,还可以随时沟通以解决冲突或保持同步
进程间不会相互影响,一个线程挂掉将导致整个进程挂掉 同一进程下不同线程间数据很易共享