为了有效的缓存文件,URL需要有一个hash或版本号,你可以手动的将输出文件移到一个叫v1.3的文件夹
但是这有几个缺点:额外的开发工作并且没有任何改变的文件不能存缓存中获取.
Webpack可以在文件名之后添加hash串,加载器(worker-loader, file-loader)输出的文件已经
做了这项工作,需要你允许块文件使用它,这里有两个级别
- 计算所有块文件的hash并且添加它
- 计算每个块文件的hash并且添加它
方式一:对打包文件增加一个hash串
命令行方式
webpack ./entry output.[hash].bundle.js
,配置文件方式:
1
2
3
4
5
6
7
8 {
output: {
path: path.join(__dirname, "assets", "[hash]"),
publicPath: "assets/[hash]/",
filename: "output.[hash].bundle.js",
chunkFilename: "[id].[hash].bundle.js"
}
}方式二:每一个块文件一个hash串
可以通过添加[chunkhash
]到配置文件的filename属性中--output-chunk-file [chunkhash].js
1 output: { chunkFilename: "[chunkhash].bundle.js" }注意:你需要在HTML中引入带有hash串的入口块,你需要从stats中提取出hash串。
为了兼容代码热部署,你需要使用方式一,但是不要在publicPath
中使用hash串。
从stats中获取文件名
你可能需要访问最终的文件以便在HTML中嵌入,这段资料可获得webpack的stats,如果你使用命令
行,可通过--with
获得json的标准输出。
可以在配置文件中添加插件比如assets-webpack-plugin
来访问stats对象,这是一个将stats
写入文件的例子:
1
2
3
4
5
6
7
8
9 plugins: [
function() {
this.plugin("done", function(stats) {
require("fs").writeFileSync(
path.join(__dirname, "..", "stats.json"),
JSON.stringify(stats.toJson()));
});
}
]stats的JSON格式包含了一个有用的属性
assetsByChunkNam
,它是一个对象,以块名字为键,对应
的文件名为值。
注意:如果一个块文件输出了多个资源文件,那么stats是数组,数组的第一个元素是你的
javascript资源。