压缩
通过简单的配置可以让webpack压缩你的javascript代码。
1 --optimize-minimize 或new webpack.optimize.UglifyJsPlugin()这是一个简单并有效优化你应用的方式
如果你已经知道webpack给每个模块和分块提供了id去标识他们,webpack可以通过一个简单的配置
改变id的分配,通过给常用模块最短的id进行优化
1 --optimize-dedupe 或new webpack.optimize.DedupePlugin()入口块有更高的文件大小优先级
去重
如果使用一些库时,会发现一些文件是相同的,webpack可以找到这些文件并且去重,这可以阻止
在打包文件中包含重复的代码,并且在运行时提供一个复制函数,这不会影响语法问题,可以这样
嵌入它
1 --optimize-dedupe 或 new webpack.optimize.DedupePlugin()这个功能会在入口快之前添加。
分块
当在写代码时,可能你已经添加了一下代码分离点来按需加载,在编译之后你可能会发现有太多特别
小的分块,Http请求负担加重,幸运的是,你可以后置的去处理这些块文件,可以有两种配置。
限制块文件的最大个数:
1 --optimize-max-chunks 15或者new webpack.optimize.LimitChunkCountPlugin({maxChunks: 15})限制最小块文件的大小
1 --optimize-min-chunk-size 10000或new webpack.optimize.MinChunkSizePlugin({minChunkSize: 10000})webpack会小心的处理分块合并(优先合并有重复的分块),任何东西都不会合并到入口块中,所以
不会影响首页加载时间
单页面应用
webpack就是用来处理单页面应用而设计和优化的。
你或许已经分离应用到多个分块,根据不同的路由加载不同的块,入口块只包含了路由和一些库,但
没有实质内容,这种做法对于应用中的浏览切换时很好的,但是首页加载需要两次请求:一次是路由
一次是页面内容。
如果你使用了 HTML5 的 history api 来做页面内容和 url 的一一对应,那么服务端就能根据
url来知道请求的具体单页应用中的哪一个页面.这样,可以通过服务端直接同时输出请求页面的处理分块,
利用浏览器的并行加载来节省网络请求时间.
1
2 <script src="entry-chunk.js" type="text/javascript" charset="utf-8"></script>
<script src="3.chunk.js" type="text/javascript" charset="utf-8"></script>你可以从stats中提取出分块的名字(
stats-webpack-plugin
导出构建的stats)
多页面应用
当你编译多页面应用时,你想在页面之间共享公共的代码,这对于webpack很简单,只需要使用多个
入口点``
1
2
3
4
5
6
7
8
9
10 module.exports = {
entry: {
p1: "./page1",
p2: "./page2",
p3: "./page3"
},
output: {
filename: "[name].entry.chunk.js"
}
}这会生成多个入口文件,
p1.entry.chunk.js
,p2.entry.chunk.js
,p3.entry.chunk.js
,
但是他们可以共享额外的块文件。
如果入口块有使用相同的模块,CommonsChunkPlugin
可以找出相同的模块然后把他们提取出来
放到一个公共分块中,这样,页面中只需要引入两个 script,一个是公共分块另一个则是该页面的入口块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
p1: "./page1",
p2: "./page2",
p3: "./page3"
},
output: {
filename: "[name].entry.chunk.js"
},
plugins: [
new CommonsChunkPlugin("commons.chunk.js")
]
}这样会生成
p1.entry.chunk.js
、p2.entry.chunk.js
和p3.entry.chunk.js
以及commons.chunk.js
。首先加载 commons.chunk.js,然后加载对应的入口块。
你可以通过选择入口块生成多个公共块,公共块也可以嵌套使用.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
p1: "./page1",
p2: "./page2",
p3: "./page3",
ap1: "./admin/page1",
ap2: "./admin/page2"
},
output: {
filename: "[name].js"
},
plugins: [
new CommonsChunkPlugin("admin-commons.js", ["ap1", "ap2"]),
new CommonsChunkPlugin("commons.js", ["p1", "p2", "admin-commons.js"])
]
};
// <script>s required:
// page1.html: commons.js, p1.js
// page2.html: commons.js, p2.js
// page3.html: p3.js
// admin-page1.html: commons.js, admin-commons.js, ap1.js
// admin-page2.html: commons.js, admin-commons.js, ap2.js高级用法,公共块的代码也可以直接运行
1
2
3
4
5
6
7
8
9
10
11 var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
p1: "./page1",
p2: "./page2",
commons: "./entry-for-the-commons-chunk"
},
plugins: [
new CommonsChunkPlugin("commons", "commons.js")
]
};查看
multiple-entry-points example
advanced multiple-commons-chunks example.