当自己在简历中写着熟练使用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. sublime3使用笔记

    1.ctrl+n 新建一个文件: 2.alt+shift+数字 分屏显示: 3.ctrl+alt+down(向下键) 连选很多行的指定开始位置: 如图: 紧接着再按shift+right(选中需要更改 ...

  2. Spring5源码深度分析(二)之理解@Conditional,@Import注解

    代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...

  3. 编写loadrunner的ftp脚本(详细步骤)

    大家好,主要给大家讲解编写loadrunner的ftp脚本详细步骤,及FTP函数注释,及FTP脚本两种编写方式,手动和录制.亲测 No problem!^_^ 1.首先要了解loadrunner中几个 ...

  4. IM即时通讯:如何跳出传统思维来设计聊天室架构?

    因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来.本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的. 相关推荐阅读几十万人同时在线的直播 ...

  5. scikit-learn杂记

    1.数据预处理 二值化 import numpy as np from sklearn import preprocessing X = np.array([[1., -1., 2.], [2., 0 ...

  6. Python自学day-12

    一.Mysql概述 RDBMS:关系型数据库管理系统.Mysql是一种RDBMS. Oracle:收费 Mysql:Oracle旗下免费 Sqlserver:微软 DB2:IBM Postgresql ...

  7. CSS3常用选择器

    一.基本选择器 子元素选择器 概念:子元素选择器只能选择某元素的子元素语法格式:父元素 > 子元素 (Father > Children)兼容性:IE8+.FireFox.Chrome.S ...

  8. Spring中的配置文件文件位置

    在Java开发中,一般在Spring框架中,classpath的位置是指src下,在IDEA中一般是指resource中 配置文件 位置:任意,开发中一般在classpath下(src) 名称:任意, ...

  9. C#学习笔记:ListBox控件的用法

    样式如下: 实现的代码一: using System;using System.Collections.Generic;using System.ComponentModel;using System ...

  10. gh-ost

    目录 1.简介 2.为什么不用触发器 ? 3.命名由来 4.亮点 5.使用 6.它是如何工作的? 7.工作模式 7.1.模式1 -- 连上从库,在主库上修改 7.2.模式2 -- 直接在主库上修改 7 ...