当自己在简历中写着熟练使用webpack的时候,殊不知自己只是在vue脚手架,react脚手架的路上走着比较轻松而已。

当面试官问你这几个问题的时候,你还能从容答上来吗(高手请忽略)
  • 什么是webpack,webpack的打包过程是怎么样的?
  • webpack基础配置的属性有哪些
  • 什么是loader?什么是plugin?他们执行先后关系是什么?
  • 提高webpack的构建速度(这个比较广泛)
  • 是否自己写过plugin(一旦你回答写过,马上问题就来了)
  • 是否用过compiler ,介绍其中几个方法?

正文

先抛开这几个问题。谈谈本人正常学习webpack的过程,由于几年前先接触的vue,一套vue-cli跑下来 ,生成demo以后感觉自己不仅

学会了vue,还精通了webpack。

后面有个偶然的机会,想自己从头使用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

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吗?的更多相关文章

  1. vue-router 4 你真的熟练吗?

    虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化.接下来就学习学习它是如何使用的. 一.安装并创建实例 安装最新版本的 vue-r ...

  2. 深入了解webpack前,可以了解的小知识点。

    阅读前:文章大概是写,简单用过webpack,想继续深入了解webpack前需要了解的知识.但文章内容跟webpack使用关系并不大. 文章概要: Object.defineProperty call ...

  3. 写js写傻了,明天研究一下异步

    在html某元素上绑定一个click事件,该事件是一个执行事件很长的函数,比如执行几十亿或几百亿次加法,那么在这个函数执行的过程中,其他元素绑定的事件,是如何触发的呢,异步触发还是同步,触发时是怎么执 ...

  4. 自然语言0_nltk中文使用和学习资料汇总

    http://blog.csdn.net/huyoo/article/details/12188573 官方数据 http://www.nltk.org/book/ Natural Language ...

  5. cocos2d的框架思路

    这是我第一次写cocos的框架思路哈,虽然只是写完了一个程序,按理来说应该再多写一些,多积累一些经验了再来写这个框架的构成,但是我觉得还是把我这次写代码的所有想法先记下来哈,等到以后继续写cocos的 ...

  6. [转] 2016 JavaScript 发展现状大调查

    有人认为JavaScript是最好的语言,有人认为它一团糟.可按照C++之父的话来讲: 世界上只有两种编程语言:一种是天天被人喷的,另一种是没人用的. 不论你喜欢承认与否,JavaScript已经一天 ...

  7. Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)

    源码地址https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器h ...

  8. 转:python的nltk中文使用和学习资料汇总帮你入门提高

    python的nltk中文使用和学习资料汇总帮你入门提高 转:http://blog.csdn.net/huyoo/article/details/12188573 nltk的安装 nltk初步使用入 ...

  9. 【python】NLTK好文

    From:http://m.blog.csdn.net/blog/huyoo/12188573 nltk是一个python工具包, 用来处理和自然语言处理相关的东西. 包括分词(tokenize), ...

随机推荐

  1. redis的下载及使用

    1.下载 方式一(通过yum) yum install redis -y 方式二(通过源码编译) (1)下载源码包 wget http://download.redis.io/releases/red ...

  2. 报错:java.sql.SQLException: The server

    报错:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized 在IDEA运行是报出例如相识的错误时: ...

  3. 小程序请求接口统一封装到一个js文件中

    在我们做小程序时,数据请求数据请求是避免不了的,然而我们用官方自带的请求方式,会给我们带来很多重复的工作,所以我就借鉴大神们的博客,写了一个简单的请求方式. 1.首先我们在utils中新建一个api. ...

  4. 【协议】TCP与UDP

    转载地址:https://blog.csdn.net/qq_34988624/article/details/85856848 1.为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不 ...

  5. Java学习笔记——设计模式之十.观察者模式

     观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. Subject类: ...

  6. CSS3 入门级

    从刚开始学习的选择器总共有十三种: id class 标签 子代 后代 交集 并集 通配符 伪类 结构 属性 相邻 兄弟 (全当复习,如果有用的话那就正好) div[name=zhang]  这是属性 ...

  7. PHP中var_dump、&&和GLOBALS的爱恨纠缠

    var_dump函数:用来打印显示一个变量的内容与结构: &&:定义一个可变变量.php中,在定义变量时,需要在前面加上一个“&”符号,当加上两个“&&”符号时 ...

  8. [apue] dup2的正确打开方式

    管道与重定向常常需要使用dup与dup2复制句柄,其中dup2又较为常用,但是使用dup2有几个小坑需要注意. int dup2(int oldfd, int newfd); man手册页上是这样讲的 ...

  9. MySQL错误:The user specified as a definer (XXX@XXX) does not exist (1449错误)最简解决方案

    背景:从同事处通过备份和还原备份方法导入mysql数据库,导入成功后启动项目,发现出现以下错误:The user specified as a definer (XXX@XXX) does not e ...

  10. 控制台程序秒变Windows服务(Topshelf)

    项目中有些时候需要写服务,一般我们都是先创建控制台程序,测试,运行,成功之后再创建windows服务程序,这样好麻烦啊,有没有简单的控制台程序直接变成Widnows服务,经过查找,找到了Topshel ...