你真的熟练使用webpack吗?
当自己在简历中写着熟练使用webpack的时候,殊不知自己只是在vue脚手架,react脚手架的路上走着比较轻松而已。
当面试官问你这几个问题的时候,你还能从容答上来吗(高手请忽略)
- 什么是webpack,webpack的打包过程是怎么样的?
- webpack基础配置的属性有哪些
- 什么是loader?什么是plugin?他们执行先后关系是什么?
- 提高webpack的构建速度(这个比较广泛)
- 是否自己写过plugin(一旦你回答写过,马上问题就来了)
- 是否用过compiler ,介绍其中几个方法?
正文
先抛开这几个问题。谈谈本人正常学习webpack的过程,由于几年前先接触的vue,一套vue-cli跑下来 ,生成demo以后感觉自己不仅
学会了vue,还精通了webpack。
后面有个偶然的机会,想自己从头使用webpack部署。才知道里面没有那么简单。
这里有个参考的文章:
感兴趣的可以自己看。
webpack的打包过程是怎么样的
这个当自己实践着一步步去尝试开始的时候的,会有个比较清晰的理解的。
webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,
通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,
webpack专注构建模块化项目。
webpack基础配置的属性有哪些
- 入口(entry)
- 输出(output)
- loader
- 插件(plugins)
当然在实际工程中,看到的的webpack的配置属性远远没有这么简单。
比如:我们会环境配置。dev,pro等等。
可能会使用到代理配置:类似于下面代码所示,用来进行跨域配置
proxyTable: {
'/api': {
target: 'http://……………………',
changeOrigin: true,
pathRewrite: {
'^/api': '/api'
}
},
}
每个属性的配置都可以延伸开,比如入口,可以是单入口,也可以是多入口。
一旦用到具体的场景的话。
每个配置项都有可能变得复杂起来。
什么是loader?什么是plugin?他们执行先后关系是什么?
loader 用于对模块的源代码进行转换。
loader 可以使你在 import 或"加载"模块时预处理文件。
因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。
插件是 webpack 的支柱功能。
webpack 自身也是构建于,你在 webpack 配置中用到的相同的插件系统之上!
插件目的在于解决 loader 无法实现的其他事。
自然而然,这样通过描述,就能比较清晰的理解的。
plugin是在loader之后执行的,当loader处理完模块代码,plugin继续处理loader未能做完的事情
提高webpack的构建速度
这里有的一篇文章介绍的比较详细
https://www.jianshu.com/p/bb1e76edc71e
当然优化的点大致可以区分下
- 选用合适的loader,这个是比较重要的,能够有效的提升webpack编译的速度。
- 使用Happypack 实现多线程加速编译。
- 不需要打包编译的插件库换成全局"script"标签引入的方式
- 开启缓存
什么是compiler
这个只有当自己真正去写插件的时候,才会意识到的。
Compiler 模块是 webpack 的支柱引擎,它通过 CLI 或 Node API 传递的所有选项,
创建出一个 compilation 实例。它扩展(extend)自 Tapable 类,以便注册和调用插件。
大多数面向用户的插件,会先在 Compiler 上注册。
以下生命周期钩子函数,
| 生命周期 | 说明 |
|---|---|
| entryOption | 在 entry 配置项处理过之后,执行插件 |
| afterPlugins | 设置完初始插件之后,执行插件 |
| afterResolvers | resolver 安装完成之后,执行插件。 |
| environment | environment 准备好之后,执行插件。 |
| afterEnvironment | environment 安装完成之后,执行插件。 |
| beforeRun | compiler.run() 执行之前,添加一个钩子。 |
| run | 开始读取 records 之前,钩入(hook into) compiler。 |
| watchRun | 监听模式下,一个新的编译(compilation)触发之后,执行一个插件,但是是在实际编译开始之前。 |
| normalModuleFactory | NormalModuleFactory 创建之后,执行插件。 |
| contextModuleFactory | ContextModuleFactory 创建之后,执行插件。 |
| beforeCompile | 编译(compilation)参数创建之后,执行插件。 |
| compile | 一个新的编译(compilation)创建之后,钩入(hook into) compiler。 |
| thisCompilation | 触发 compilation 事件之前执行(查看下面的 compilation)。 |
| compilation | 编译(compilation)创建之后,执行插件。 |
| make | …… |
| afterCompile | …… |
| shouldEmit | ……。 |
| needAdditionalPass | …… |
| afterEmit | 生成资源到 output 目录之后。 |
| done | 编译(compilation)完成。 |
| failed | 编译(compilation)失败。 |
| invalid | 监听模式下,编译无效时。 |
| watchClose | 监听模式停止。 |
实际应用的时候,大概只需要上面几个编译前,编译后的几个钩子
最后
请原谅偶只是个标题党,文章也只是大致介绍的webpack所有需要了解的知识点的大概范围。
在实际场景应用的时候,各不相同。
你真的熟练使用webpack吗?的更多相关文章
- vue-router 4 你真的熟练吗?
虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化.接下来就学习学习它是如何使用的. 一.安装并创建实例 安装最新版本的 vue-r ...
- 深入了解webpack前,可以了解的小知识点。
阅读前:文章大概是写,简单用过webpack,想继续深入了解webpack前需要了解的知识.但文章内容跟webpack使用关系并不大. 文章概要: Object.defineProperty call ...
- 写js写傻了,明天研究一下异步
在html某元素上绑定一个click事件,该事件是一个执行事件很长的函数,比如执行几十亿或几百亿次加法,那么在这个函数执行的过程中,其他元素绑定的事件,是如何触发的呢,异步触发还是同步,触发时是怎么执 ...
- 自然语言0_nltk中文使用和学习资料汇总
http://blog.csdn.net/huyoo/article/details/12188573 官方数据 http://www.nltk.org/book/ Natural Language ...
- cocos2d的框架思路
这是我第一次写cocos的框架思路哈,虽然只是写完了一个程序,按理来说应该再多写一些,多积累一些经验了再来写这个框架的构成,但是我觉得还是把我这次写代码的所有想法先记下来哈,等到以后继续写cocos的 ...
- [转] 2016 JavaScript 发展现状大调查
有人认为JavaScript是最好的语言,有人认为它一团糟.可按照C++之父的话来讲: 世界上只有两种编程语言:一种是天天被人喷的,另一种是没人用的. 不论你喜欢承认与否,JavaScript已经一天 ...
- Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)
源码地址https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器h ...
- 转:python的nltk中文使用和学习资料汇总帮你入门提高
python的nltk中文使用和学习资料汇总帮你入门提高 转:http://blog.csdn.net/huyoo/article/details/12188573 nltk的安装 nltk初步使用入 ...
- 【python】NLTK好文
From:http://m.blog.csdn.net/blog/huyoo/12188573 nltk是一个python工具包, 用来处理和自然语言处理相关的东西. 包括分词(tokenize), ...
随机推荐
- SYN4201型 同步分频钟
SYN4201型 同步分频钟 产品概述 SYN4201型同步分频钟是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度分频时钟,对输入的8路10MHz正弦信号分别进行同步分频处理,相应的输出 ...
- .Net上传文件处理三大范式,及开发注意事项
最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先通过一个例子,让 ...
- 什么是BFC? CSS 如何使用伪元素清除浮动?
.BFC概念: 块级格式化上下文,是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响. 我们先了解一个名词:BFC(block formatting c ...
- 支持向量机 (二): 软间隔 svm 与 核函数
软间隔最大化(线性不可分类svm) 上一篇求解出来的间隔被称为 "硬间隔(hard margin)",其可以将所有样本点划分正确且都在间隔边界之外,即所有样本点都满足 \(y_{i ...
- Google浏览器插件之闪存过滤器
一件很有意思的事情引发的无聊尝试. 博客园有个很有趣的功能,就是闪存,翻阅到07年园长对闪存的定义: 记录一闪而过的想法,高兴或者不高兴都可以发一下.我用这个一直以来的想法就是,想到点啥发点 ...
- Ruby字符串(1):String基本用法
String字符串 字符串由String类提供,除了直接使用单双引号或其它字面量创建字符串,也可以使用String.new()方法来创建. a = "hello" b = Stri ...
- 5分钟快速部署PESCMS TEAM 团队任务管理系统开发版
所在的公司也经历过小团队的发展,为了高效率,通常都是面对面交流,很多时候事情谈论过后不久就已经淡忘了.而且工作任务不能全局观察,成员之间基本上都要主动去询问,效率反而低下.所以今天就介绍一款中小团队的 ...
- Gym 101257G:24(尺取)
http://codeforces.com/gym/101257/problem/GGym 101257G 题意:给出n个人,和一个数s,接下来给出每个人当前的分数和输掉的概率.当一个人输了之后就会掉 ...
- HDU 5791:Two(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description Alice gets two sequences A ...
- kuangbin专题 专题一 简单搜索 Oil Deposits HDU - 1241
题目链接:https://vjudge.net/problem/HDU-1241 题意:问有几个油田,一个油田由相邻的‘@’,组成. 思路:bfs,dfs都可以,只需要遍历地图,遇到‘@’,跑一遍搜索 ...