前端工程化部分

60 阅读5分钟

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

image.png

4.经常使用的git命令?

image.png

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中配置开启热模块也非常的简单,如下代码:

image.png

通过上述这种配置,如果我们修改并保存css文件,确实能够以不刷新的形式更新到页面中,但是,当我们修改并保存js文件之后,页面依旧自动刷新了,这里并没有触发热模块

HMR并不像webpack的其他特性一样可以开箱即用,需要有一些额外的操作,需要去指定哪些模块发生更新时进行

image.png

实现原理:

image.png

  • 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