模块化开发之打包工具 Webpack 介绍

1. 背景介绍

前端开发的变化

随着 Node.js 的兴起,越来越多的人使用 JavaScript 开发后台的一些应用。同时促进了模块化开发包管理生态系统的发展。所以目前在国外,越来越多的人使用 CommonJS 规范来处理模块加载。但是为了能让代码在浏览器上能正常运行,我们需要在上线前,将相互依赖的模块整合打包到一个文件,这样就可以避免 CommonJS 同步加载的缺陷。

Browserify 的热捧

最初在寻找打包工具时,发现大家都选择了 Browserify 这款打包工具。所以一开始我也毫不犹豫地选择了它。后来在使用过程中发现,Browserify 只能将所有文件打包成一个文件,如果需要分开打包,需要手动配置。那这样的打包方式,只适用如下一些场景:

  • 小规模网站,即代码量小
  • 很少更新网站,意味着业务代码很少更新
  • 不太关心第一次页面加载时长

这显然不太适应大部分网站的使用场景。

2. 从 Browserify 叛逃到 Webpack

在实际使用过程中,我考虑到了一些代码合并优化的问题,比如是否可以将一些第三方库单独打包?不需要将所有代码打包到一个文件夹。是否可以分页面打包相关的代码?这些问题 Browserify 都不予理睬。后来又通过一些博文了解到 Webpack 这款打包工具。
在查阅官方文档和前人研究成果后,才发现 Webpack 是一款很强大的打包工具。它除了能能解决上面提到的几个问题,同时还支持其它一些特色功能。下面我来一一介绍一下这些功能:

Code Splitting

  1. 打包时排出某个文件
    • 当第三方库占整个打包文件的大小比例比较大,比如 20% 以上「When your vendors reaches a certain percentage of your total app bundle. Like 20% and up」
    • 经常会更新网站「You will do quite a few updates to your application」
    • 不太关心第一次页面加载时长,但是当你更新网站时,你关心优化回访用户的使用体验「You are not too concerned about perceived initial loading time, but you do have returning users and care about optimizing the experience when you do updates to the application」
    • 用户是通过手机访问的「Users are on mobile」
  2. 分多个入口打包文件,并提取多个合并文件中的共同文件
    • 网站有多个独立的体验部分,但是它们共享大部分代码「You have an application with multiple isolated user experiences, but they share a lot of code」
    • 有一个使用较少组件的移动版本「You have a mobile version using less components」
    • 是一个典型的用户前台和后台应用网站,你不想在普通用户访问时加载后台的代码「You have a typical user/admin application where you do not want to load all the admin code for a normal user」
  3. 在某个文件中设置异步加载某些模块
    • 网站规模很大,用户可以访问不同的部分「You have a relatively big application where users can visit different parts of it」
    • 很在意第一次页面渲染时间「You do care a lot about initial render time」

以上这些功能覆盖了大部分的使用场景。

静态资源模块化加载

我们可以把一些静态资源「Img、CSS、Font、HTML Template 等」组合打包到一个文件,实现组件化开发。

编译文件

目前我们习惯用 SCSS 或 LESS 来写 CSS,用 CoffeeScript 写 JavaScript,还有 React 的 JSX 语法。
Webpack 提供了 sass-loader,coffee-loader, jsx-loader 等插件,当加载这些格式的模块文件时,会先执行编译,最后把编译结果引入指定文件。

插件

Webpack 提供了很多插件,比如 UglifyJsPlugin,用来压缩 JS。更多插件可以看这里

Sever 服务并提供类似 Liveload 功能

Webpack 能开启一个本地 Sever,同时监听各打包文件,当某个文件发生变动时,会重新打包。同时利用它提供的 Hot Mode 功能,能实现类似 Liveload 效果,具体表现如下:

  • CSS 变化时,不用刷新页面就能更新内容
  • JSX Component 变化时,不用刷新页面就能更新内容
  • 某个 JS 文件变动时,会自动重新打包并刷新页面

3. 结语

除了这些,Webpack 还提供了一些高级的功能。具体可以查看它的官网文档。但是目前来说,Webpack 不是 Gulp 的替代品,它们俩可以互相配合,发挥你的想象力,来提高前端开发的效率吧。

参考资料:

  1. Webpack doc
  2. React-webpack-cookbook
  3. Webpack-how-to
  4. Webpack 入门指迷