当自己在简历中写着熟练使用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. python列表的内置方法

    list数据类型还有更多的方法.这里是list对象的所有方法: list.append(x) 添加一个元素到列表的末尾:相当于a[len(a):] = [x]. list.extend(L) 将指定列 ...

  2. F4帮助

    在INITIALIZATION之后添加 AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_month-low 事件,s_month-low为要添加的搜索帮助. 下面 ...

  3. Java学习笔记——设计模式之八.外观模式

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...

  4. 13 | 效率为王:脚本与数据的解耦 + Page Object模型

  5. Dungeon Master POJ - 2251(bfs)

    对于3维的,可以用结构体来储存,详细见下列代码. 样例可以过,不过能不能ac还不知道,疑似poj炸了, #include<iostream> #include<cstdio> ...

  6. CCPC2019江西省赛-Problem G.Traffic

    题目描述: /*纯手打题面*/ Avin is observing the cars at a crossroads.He finds that there are n cars running in ...

  7. 【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入

    系列目录 第一章|理论基础+实战控制台程序实现AutoFac注入 第二章|AutoFac的常见使用套路 第三章|实战Asp.Net Framework Web程序实现AutoFac注入 第四章|实战A ...

  8. yarn or npm 版本固化如何选择

    前言 作为前端开发者,npm这个包管理工具的重要性显而易见.优点不再表述,但一些缺点是为使用者诟病比较多的:速度慢.版本控制.下面主要讨论下npm的版本固化问题,即lock文件. npm语义化版本管理 ...

  9. C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载

    Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧, ...

  10. pdfminer获取每页的layout

    #! python2 # coding: utf-8 import sys from pdfminer import pdfparser from pdfminer import pdfdocumen ...