一.什么是 Webpack
Webpack 是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
webpack模式图
二.为什么使用webpack
市面上已经存在的模块管理和打包工具并不适合大型的项目,尤其单页面 Web 应用程序。最紧迫的原因是如何在一个大规模的代码库中,维护各种模块资源的分割和存放,维护它们之间的依赖关系,并且无缝的将它们整合到一起生成适合浏览器端请求加载的静态资源。而webpack有以下几个优点:
1.将依赖树拆分成按需加载的块:Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的快。在优化了依赖树后,每一个异步区块都作为一个文件被打包。
2.初始化加载的耗时尽量少:Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。
3.各种静态资源都可以视作模块:Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。
4.将第三方库整合成模块的能力:Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。
5.自定义打包逻辑的能力:Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。
6.适合大项目,无论是单页还是多页的 Web 应用
三.安装webpack
首先要安装 Node.js, Node.js 自带了软件包管理器 npm,Webpack 需要 Node.js v0.6 以上支持,建议使用最新版 Node.js。
用 npm 安装 Webpack:
$ npm install webpack -g
此时 Webpack 已经安装到了全局环境下,本课程中我们已装好webpack,可以通过命令行 webpack -h 试试。
通常我们会将 Webpack 安装到项目的依赖中,这样就可以使用项目本地版本的 Webpack。
1.进入项目目录
2.确定已经有 package.json,没有就通过 npm init 创建
3.输入命令 $ npm install webpack --save-dev 安装 webpack 依赖
Webpack 目前有两个主版本,一个是在 master 主干的稳定版,一个是在 webpack-2 分支的测试版,测试版拥有一些实验性功能并且和稳定版不兼容,在正式项目中应该使用稳定版。
# 查看 webpack 版本信息 $ npm info webpack # 安装指定版本的 webpack $ npm install webpack@1.12.x --save-dev
四.在项目中使用webpack
首先有一个静态页面 index.html,
<!-- index.html --> <html> <head> <meta charset="utf-8"> </head> <body> <script src="https://www.jb51.net/bundle.js"></script> </body> </html>
现在创建一个 JS 入口文件 entry.js:
// entry.js pico entry.js // 进入编辑器输入 document.write('It works.'); // 保存并退出
然后编译 entry.js 并打包到 bundle.js,运行命令:
$ webpack ./entry.js bundle.js
如果成功,打包过程会显示日志:
Hash: aeec068c58e1e78f0fb6 Version: webpack 1.12.9 Time: 70ms Asset Size Chunks Chunk Names bundle.js 1.48 kB 0 [emitted] main [0] ./entry.js 87 bytes {0} [built]
在点击访问测试将会打开一个新的窗口。它应该会显示It works.。
注意:下面的课程中创建编辑文件都是用pico 文件名。
下一步,我们将把一些代码移到一个额外的文件中content.js 并修改入口 entry.js:
// content.js pico content.js // 编辑内容 module.exports = "It works from content.js.";
// 修改entry.js //document.write('It works.'); document.write(require("./content.js")); // 添加content.js
编译文件
$ webpack ./entry.js bundle.js
更新您的浏览器窗口,您应该看到文本It works from content.js.
执行成功,会显示
Hash: ef96fed65f6d3ebc0dd7 Version: webpack 1.12.9 Time: 91ms Asset Size Chunks Chunk Names bundle.js 1.7 kB 0 [emitted] main [0] ./entry.js 133 bytes {0} [built] [1] ./content.js 97 bytes {0} [built]