牛客前端刷题(九)—— 打包篇
创始人
2024-01-15 20:32:48
0

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦!

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。
面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。
在这里插入图片描述

文章目录

  • 🍉正文
    • 打包
      • 1 打包,webpack和gulp的区别
      • 2 webpack的打包流程
      • 3 webpack 有哪些阶段
  • 🎃专栏分享:

🍉正文

本文内容来源出自 《牛客网》

打包

1 打包,webpack和gulp的区别

参考答案

Gulp:

Gulp是一个自动化构建工具,强调的是前端开发的流程,通过配置一系列的task,定义task处理的事物,然后定义执行顺序,来让Gulp执行task,从而构建前端项目的流程,说白了就是用来打包项目。

不管做什么功能,都有一个统一的接口进行管理,必须去注册一个任务,然后去执行,这也是它的特点之一,即“任务化”。

WebPack:

WebPack是一个前端模块化方案,侧重模块打包,把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源,Gulp也可以配置seajs、requirejs甚至webpack的插件。

它会分析你的项目结构,找到JS模块以及那些浏览器不能够直接运行的扩展语言(如:TypeScript等),然后将其转换和打包为合适的格式供浏览器使用。它最大的优点就是“模块化”(万物皆模块)。
相同点:

  • 都可以对文件进行合并与压缩(JS、CSS)。

不同点:

  • Gulp是构建工具,可以配合各种插件做css.压缩等,解放了双手,实现了自动化。
  • Gulp严格上讲,它旨在规范前端开发流程,不包括模块化功能。
  • WebPack是文件打包工具,可把各个项目的css.压缩文件等打包合并成一个或多个文件,主要就是应用于模块化操作。
  • WebPack更是明显强调模块化开发,而那些文件压缩合并、预处理等功能,只是他附带的功能。
  • WebPack整合了Gulp的优点,当我们想要一步一步来配置自己的环境时,那么gulp就可以满足我们的需要,但是如果我们想一下就配备大部分我们所需要的环境,那么此时可以选用WebPack,前提是写好package.json。
  • gulp与webpack上是互补的,还是可替换的,取决于你项目的需求,它们可不存在冲突的关系哈。
  • Gulp与WebPack可以组合起来使用,以便快速编译(依靠Gulp丰富的组件可以让JS与HTML实现联动,从而控制WebPack应用程序,达到高自动化)

2 webpack的打包流程

参考答案

Webpack的运行流程是一个串行的过程,从启动到结束依次执行以下流程:

  1. 初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler。
  2. 编译:从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容,再找到该 Module 依赖的 Module,递归地进行编译处理。
  3. 输出:对编译后的 Module 组合成 Chunk,把 Chunk 转换成文件,输出到文件系统。

如果只执行一次构建,以上阶段将会按照顺序各执行一次。但在开启监听模式下,流程将变为如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxA7tSp1-1666530254287)(https://uploadfiles.nowcoder.com/images/20220301/4107856_1646129282955/9B823AC99AF889118D34D0CB72E7A28E)]

下面具体介绍一下webpack的三个大阶段具体的小步。

初始化阶段

初始化阶段大致分为:

  • 合并shell和配置文件文件的参数并且实例化Complier对象
  • 加载插件
  • 处理入口
事件名解释
初始化参数从配置文件和 Shell 语句中读取与合并参数,得出最终的参数。 这个过程中还会执行配置文件中的插件实例化语句 new Plugin()。
实例化 Compiler用上一步得到的参数初始化Compiler实例,Compiler负责文件监听和启动编译。Compiler实例中包含了完整的Webpack配置,全局只有一个Compiler实例。
加载插件依次调用插件的apply方法,让插件可以监听后续的所有事件节点。同时给插件传入compiler实例的引用,以方便插件通过compiler调用Webpack提供的API。
environment开始应用Node.js风格的文件系统到compiler对象,以方便后续的文件寻找和读取。
entry-option读取配置的Entrys,为每个Entry实例化一个对应的EntryPlugin,为后面该Entry的递归解析工作做准备。
after-plugins调用完所有内置的和配置的插件的apply方法。
after-resolvers根据配置初始化完resolver,resolver负责在文件系统中寻找指定路径的文件。

编译阶段

事件名解释
before-run清除缓存
run启动一次新的编译。
watch-run和run类似,区别在于它是在监听模式下启动的编译,在这个事件中可以获取到是哪些文件发生了变化导致重新启动一次新的编译。
compile该事件是为了告诉插件一次新的编译将要启动,同时会给插件带上compiler对象。
compilation当Webpack以开发模式运行时,每当检测到文件变化,一次新的Compilation将被创建。一个Compilation对象包含了当前的模块资源、编译生成资源、变化的文件等。Compilation对象也提供了很多事件回调供插件做扩展。
make一个新的Compilation创建完毕,即将从Entry开始读取文件,根据文件类型和配置的Loader对文件进行编译,编译完后再找出该文件依赖的文件,递归的编译和解析。
after-compile一次Compilation执行完成。这里会根据编译结果 合并出我们最终生成的文件名和文件内容。
invalid当遇到文件不存在、文件编译错误等异常时会触发该事件,该事件不会导致Webpack退出。

这里主要最重要的就是compilation过程,compilation实际上就是调用相应的loader处理文件生成chunks并对这些chunks做优化的过程。几个关键的事件(Compilation对象this.hooks中):

事件名解释
build-module使用对应的Loader去转换一个模块。
normal-module-loader在用Loader对一个模块转换完后,使用acorn解析转换后的内容,输出对应的抽象语法树(AST),以方便Webpack后面对代码的分析。
program从配置的入口模块开始,分析其AST,当遇到require等导入其它模块语句时,便将其加入到依赖的模块列表,同时对新找出的依赖模块递归分析,最终搞清所有模块的依赖关系
seal所有模块及其依赖的模块都通过Loader转换完成后,根据依赖关系开始生成Chunk。

输出阶段

事件名解释
should-emit所有需要输出的文件已经生成好,询问插件哪些文件需要输出,哪些不需要。
emit确定好要输出哪些文件后,执行文件输出,可以在这里获取和修改输出内容。
after-emit文件输出完毕。
done成功完成一次完成的编译和输出流程。
failed如果在编译和输出流程中遇到异常导致Webpack退出时,就会直接跳转到本步骤,插件可以在本事件中获取到具体的错误原因。

3 webpack 有哪些阶段

参考答案

  1. webpack的准备阶段
  2. modules和chunks的生成阶段
  3. 文件生成阶段

🎃专栏分享:

JavaScript相关面试题就更新到这里啦,相关 Web前端面试题 可以订阅专栏哦🥰
专栏地址:《面试必看》
面试刷题神器:牛客网


⏳ 名言警句:说能做的,做说过的!\textcolor{red} {名言警句:说能做的,做说过的!}名言警句:说能做的,做说过的!

✨ 原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!

相关内容

热门资讯

深笑林徽因赏析 深笑林徽因赏析  深笑是林徽因写的一片散文,以下是小编为大家收集的深笑林徽因赏析,仅供参考,希望能够...
爱情相思的古诗句 关于爱情相思的古诗句  爱情总是让我们期望太多,从远远地注视到想全身心地占有,追逐让我们疲惫,与其纠...
于描写心情失落的诗句 于描写心情失落的诗句  多情自古空余恨,好梦由来最易醒。  冠盖满京华,斯人独憔悴------唐.杜...
形容烦躁的诗句+解读 形容烦躁的诗句+赏析  北风吹雁雪纷纷。莫愁前路无知己, 天下谁人不识君。  薄雾浓云愁永昼,瑞脑消...
春节祝福诗句 春节祝福诗句  导语:新年的钟声提前为你敲响,下面就由小编来为大家带来春节祝福诗句,欢迎参考借鉴! ...
描写人生的诗句 关于描写人生的诗句精选  无论是身处学校还是步入社会,大家都对那些朗朗上口的诗句很是熟悉吧,诗句饱含...
赞美祖国古诗 赞美祖国古诗  在学习、工作、生活中,许多人对一些广为流传的古诗都不陌生吧,狭义的古诗,是指产生于唐...
含蓄的表达暗恋女生的诗句 含蓄的表达暗恋女生的诗句  暗恋太累了,为了一个喜欢的'人默默的付出,哪怕没有回报,知道她爱的是别人...
反映儿童生活情趣的诗句 反映儿童生活情趣的诗句  反映儿童生活情趣的诗句,这类诗词流传下来的.为数不少,先摘抄部分作品如下以...
咏鸡诗词 咏鸡诗词  鸡有五德:首戴冠,文也;足搏距,武也;敌敢斗,勇也;见食相呼,仁也;守夜不失,信也。下面...
桃的诗句 桃的诗句  1、桃李待日开,荣华照当年。——李白《长歌行》  2、桃李务青春,谁能贯白日。——李白《...
心情散文 心情散文2篇  导语:在唇齿留香之际从口中送出诗句:“浊酒一杯天过午,木香花湿雨沉沉。”以下是小编分...
形容夏天大雨的诗句 形容夏天大雨的诗句  夏天的雨是凉爽的.,但是夏季的雨常常是瓢泼大雨,今天小编给大家找了一些描写夏天...
苏轼的代表作品及古诗 苏轼的代表作品及古诗  在平时的学习、工作或生活中,大家都收藏过令自己印象深刻的古诗吧,古诗可分为古...
如何解释秦观和陆游的姓名 《文化的解释》的读后感推荐度:如何报考志愿和选专业推荐度:变更姓名申请书推荐度:如何做好团队的梯队建...
互相暗恋诗句 互相暗恋诗句  有谁不曾为那暗恋而受苦,我们以为那份痴情很重很重,是世界上最重的重量,有一天,蓦然回...
周邦彦千古诗词 周邦彦千古诗词  在日常学习、工作或生活中,大家一定都接触过一些使用较为普遍的古诗吧,广义的古诗,泛...
刘禹锡插田歌原文翻译以及赏析 刘禹锡插田歌原文翻译以及赏析  刘禹锡所写的作品《插田歌》描绘了插秧时节春光明媚,以及田野间生机盎然...
王安石咏竹的诗句解析 王安石咏竹的诗句解析  《咏竹》是王安石的一首七言绝句,竹子是古人创作诗歌的风云参照物,文人骚客钟爱...
荷花的诗句和图画 荷花的诗句和图画  引导语:翠绿的荷叶丛中,亭亭玉立的.荷花,像一个个披着轻沙在湖上沐浴的仙女,含笑...