什么是Webpack
Webpack是一个强力的模块打包器。 所谓包(bundle)就是一个JavaScript文件,它把一堆资源(assets)合并在一起,以便它们可以在同一个文件请求中发回给客户端。 包中可以包含JavaScript、CSS样式、HTML以及很多其它类型的文件。
Webpack会遍历你应用中的所有源码,查找import
语句,构建出依赖图谱,并产出一个(或多个)包。 通过“加载器(loaders)”插件,Webpack可以对各种非JavaScript文件进行预处理和最小化(Minify),比如TypeScript、SASS和LESS文件等。
我们通过一个JavaScript配置文件webpack.config.js
来决定Webpack做什么以及如何做。
入口与输出
给webpack提供一个或多个入口文件,通过入口来让它查找与合并那些从这些入口点发散出去的依赖。
1 | entry: { |
app.js
输出包是个单一的JavaScript文件,它包含程序的源码及其所有依赖。
1 | output: { |
多重包
Webpack会构造出两个独立的依赖图谱,并产出两个包文件:一个叫做app.js
,它只包含我们的应用代码;另一个叫做vendor.js
,它包含所有的提供商依赖。
1 | entry: { |
加载器
我们要通过加载器来告诉它如何把JavaScript、TypeScript、CSS、SASS、LESS、图片、HTML以及字体文件等处理成JavaScript文件。
1 | import { AppComponent } from './app.component.ts'; |
1 | loaders: [ |
第一个import
文件匹配上了.ts
模式,于是Webpack就用awesome-typescript-loader
加载器处理它。 导入的文件没有匹配上第二个模式,于是它的加载器就被忽略了。
第二个import
匹配上了第二个.css
模式,它有两个用叹号字符(!
)串联起来的加载器。 Webpack会从右到左逐个应用串联的加载器,于是它先应用了css
加载器(用来平面化CSS的@import
和url(...)
语句), 然后应用了style
加载器(用来把css追加到页面上的<style>
元素中)。
插件
Webpack有一条构建流水线,它被划分成多个经过精心定义的阶段(phase)。 我们可以把插件(比如uglify
代码最小化插件)挂到流水线上:
1 | plugins: [ |
配置Webpack
公共配置
1 | config/webpack.common.js |
开发环境配置
1 | config/webpack.dev.js |
产品环境配置
1 | config/webpack.prod.js |
测试环境配置
1 | config/webpack.test.js |
如果有可能拖慢执行速度,甚至都不需要在单元测试中加载和处理应用全局样式文件,所以我们用一个null
加载器来处理所有CSS。
1 | config/karma.conf.js |
1 | config/karma-test-shim.js |