Webpack笔记及实用性评估

Webpack 架构图

1. 概述

Webpack是一个模块合并的工具,认为前端所有资源JS,CSS,图片等都是组件,在构建前端时,可进行选择性加载,一次初始化后,webpack就会帮我们进行自动化的引用和导入。

在越来越多AJAX的使用情况下,局部刷新慢慢取代整页刷新,因此一个页面的代码,除了初始化时状态还包括运行时状态,客户端也要承载越来越多的代码,大量的代码需要很好的组织,而webpack则可以提供一个将不同代码分割成不同模块的方式。

2. 常见的JS模块化方式

  1. <script>标签
  2. CommonJS
  3. AMD及其衍生
  4. ES6模块

其中

1. <script>标签标签

优点:

使用简单,学习成本低,全兼容

缺点:

全局空间的污染
需要合理的加载顺序
浏览器多次请求造成额外开销
开发者要解决模块/库的依赖
大型项目中列表冗长且难以管理

2. CMD加载,如CommonJS,SeaJS

优点:

使用相较于AMD要更加简单,
服务器端模块复用
有大量现成模块方便npm安装使用

缺点:

阻塞式加载不适用于web程序
无法异步加载多个模块

3. AMD加载,如RequireJS

优点:

可以异步加载各个模块

缺点:

使用起来不太简单,头部声明不利于阅读和编写
第三方框架,对AMD支持的不好,要shim来兼容引用哪些不兼容框架

4. ES6模块

EcmaScript6向JavaScript添加了许多语言结构,因此形成了另一种模块系统。

优点:

易于解析,将会成为前端通用标准

缺点:

对前端开发人员的面向对象的模块化编程思想有了更高的要求
兼容性不好,仅很高版本浏览器才自持

3. 安装使用

不需要我再写了,webpack官网文档

以下部分摘自segment default

Webpack的功能特点

代码拆分

依赖树有同步和异步两种类型,异步依赖行为将作为拆分点并生成一个新的区块,文件在区块中被分发到每一个区块中去。然后按需加载,而不是将代码拆分为公共代码代码文件。

Loaders加载器

webpack只处理JavaScript所以loaders被用来处理将各类资源转换成JavaScript。由此所有的资源都能作为模块。

智能分析

web pack 拥有的智能分析系统可以处理几乎所有的第三方库。甚至允许在依赖中使用形如 require(“./templates/“ + name + “.jade”)的写法。智能分析系统可以处理大多数常见的模块格式如: CommonJs 与 AMD。

插件系统

webpack 附带一个强大的插件(plugin)系统。绝大多数特性都基于该插件系统。它能让你依据自身需求去定义web pack 还能发布开源插件。

4. 总结

webpack的核心思想:

  1. 一切皆模块
  2. 按需加载,官网文档原文为“load on demand”

5. 适用性评估

  1. 适用于前后端分离开发
  2. 适用于单个页面的web应用,按需加载各个组件和模块
  3. 适合配合reactjs进行开发
  4. 适合移动端的网页开发,仅加载所需,节省带宽和流量,以及额外请求数
  5. 不适用于页面元素相当复杂的大型电商类网站,因为在复杂页面中,小板块的版本切换,或者灰度发布在webpack中支持不好,webpack则会重新打包所有文件,增量更新的实现较为复杂。

作者 @Brady
2016年9月22日