当自己在简历中写着熟练使用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. java多线程之多生产者-多消费者

    多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死. public class Product { private MyStack myStack; pu ...

  2. SecureCRT的安装以及破破解(内含安装包)

    1.百度网盘连接:链接:https://pan.baidu.com/s/13i8sblGthYtj2SbUTrbmsg  提取码:8cw1 2.解压前先关闭电脑防护软件,否则会杀掉破解软件的 3.压缩 ...

  3. 实战Java的反射机制

    众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...

  4. 01-pymysql模块的安装

    1.从github 下载pymysql 安装包,下载地址为:https://github.com/PyMySQL/PyMySQL 2.解压下载文件,不用打开python交互界面,cd到解压文件所在目录 ...

  5. 安装Flume——海量日志收集聚合系统

    下载flume:  1.官方网站下载: http://flume.apache.org/download.html 2.百度网盘资源: apache-flume-1.9.0-bin.tar 链接:ht ...

  6. Java并发之Semaphore和Exchanger工具类简单介绍

    一.Semaphore介绍 Semaphore意思为信号量,是用来控制同时访问特定资源的线程数数量.它的本质上其实也是一个共享锁.Semaphore可以用于做流量控制,特别是公用资源有限的应用场景.例 ...

  7. Arrays工具类常用方法演示

    java.util.Arrays是JDK中操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法. 下面我们以int类型数组为例,学习下常用的方法,其他类型数组都差不多. 1.equals( ...

  8. .Net之Layui多图片上传

    前言: 多图上传在一些特殊的需求中我们经常会遇到,其实多图上传的原理大家都有各自的见解.对于Layui多图上传和我之前所说的通过js获取文本框中的文件数组遍历提交的原理一样,只不过是Layui中的up ...

  9. Codeforces 760C:Pavel and barbecue(DFS+思维)

    http://codeforces.com/problemset/problem/760/C 题意:有n个盘子,每个盘子有一块肉,当肉路过这个盘子的时候,当前朝下的这一面会被煎熟,每个盘子有两个数,p ...

  10. Codeforces 152C:Pocket Book(思维)

    http://codeforces.com/problemset/problem/152/C 题意:给出n条长度为m的字符串,对于第一条字符串的每个位置利用第2~n条字符串的相应位置的字符去替换相应的 ...