1.有哪些常见的Loader?
vue-loader:基于webpack的一个的loader,解析和转换 .vue 文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,再分别把它们交给对应的 Loader 去处理,核心的作用,就是提取,划重点
file-loader:把⽂件输出到⼀个⽂件夹中,在代码中通过相对URL去引⽤输出的⽂件
url-loader:和file-loader类似,但是能在⽂件很⼩的情况下以base64的⽅式把⽂件内容注⼊到代码中去
source-map-loader:加载额外的Source Map⽂件,以⽅便断点调试
image-loader:加载并且压缩图⽚⽂件
babel-loader:把ES6转换成ES5
css-loader:加载CSS,支持模块化、压缩、⽂件导⼊等特性
style-loader:把CSS代码注⼊到JavaScript中,通过DOM操作去加载CSS。
eslint-loader:通过ESLint检查JavaScript代码
2.bundle,chunk,module是什么?
bundle:是由webpack打包出来的⽂件;
chunk:代码块,⼀个chunk由多个模块组合⽽成,⽤于代码的合并和分割;
module:是开发中的单个模块,在webpack的世界,⼀切皆模块,⼀个模块对应⼀个⽂件,webpack会从配置的entry中递归开始找出所有依赖的模块。
3.Babel的原理是什么?
babel的转译过程也分为三个阶段,这三步具体是:
解析Parse:将代码解析⽣成抽象语法树(AST),即词法分析与语法分析的过程;
转换Transform:对于AST进⾏变换⼀系列的操作,babel接受得到AST并通过babel-traverse对其进⾏遍历,在此过程中进⾏添加、更新及移除等操作
⽣成Generate:将变换后的AST再转换为JS代码,使⽤到的模块是babel-generator
4.经常使用的git命令?
5.git pull和git fetch的区别
gitfetch只是将远程仓库的变化下载下来,并没有和本地分支合并。
gitpull会将远程仓库的变化下载下来,并和当前分支合并。
6.git rebase和git merge的区别
gitmerge和gitrebase都是用于分支合并,关键在commit记录的处理上不同:
git merge会新建一个新的commit对象,然后两个分支以前的 commit记录都指向这个新commit记录。这种方法会保留之前每个分支的commit历史。
gitrebase会先找到两个分支的第一个共同的commit祖先记录,然后将提取当前分支这之后的所有commit记录,然后将这个commit记录添加到目标分支的最新提交后面。经过这个合并后,两个分支合并后的commit记录就变为了线性的记录了。
7.webpack的构建流程
从启动到结束会依次经历三大流程:
初始化阶段:从配置文件和 Shell 语句中读取与合并参数,并初始化需要使用的插件和配置插件等执行环境所需要的参数。
编译构建阶段:从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容,再找到该 Module 依赖的 Module,递归地进行编译处理。
输出阶段:对编译后的 Module 组合成 Chunk,把 Chunk 转换成文件,输出到文件系统
8.webpack热更新的实现原理?
webpack的热更新(Hot Module Replacement),缩写为HMR。可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用,就可以实现只将修改的模块实时替换至应用中,例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致整个应用的整体刷新,那页面中的状态信息都会丢失
原理:
(1)Webpack监听文件变化:Webpack使用文件系统通知(如Node.js的fs.watch或fs.watchFile)来监视项目文件的更改。
(2)重新编译模块:当Webpack检测到文件发生变化时,它会重新编译受影响的模块。
(3)构建新模块版本:重新编译的模块与先前的版本进行比较,并构建新的模块版本。
(4)通知更新:Webpack通过WebSocket或轮询机制将新的模块版本通知给运行时环境。
(5)应用更新:运行时环境接收到新的模块版本后,将其应用于当前运行的应用程序,保持应用程序状态,并更新显示
在webpack中配置开启热模块也非常的简单,如下代码:
通过上述这种配置,如果我们修改并保存css文件,确实能够以不刷新的形式更新到页面中,但是,当我们修改并保存js文件之后,页面依旧自动刷新了,这里并没有触发热模块
HMR并不像webpack的其他特性一样可以开箱即用,需要有一些额外的操作,需要去指定哪些模块发生更新时进行
实现原理:
- Webpack Compile:将 JS 源代码编译成 bundle.js
- HMR Server:用来将热更新的文件输出给 HMR Runtime
- Bundle Server:静态资源文件服务器,提供文件访问路径
- HMR Runtime:socket服务器,会被注入到浏览器,更新文件的变化
- bundle.js:构建输出的文件
- 在HMR Runtime 和 HMR Server之间建立 websocket,即图上4号线,用于实时更新文件变化
启动阶段为上图 1 - 2 - A - B ,更新阶段为上图 1 - 2 - 3 - 4