webpack打包之 緩存
為了有效的緩存你的文件,需要給文件URL添加hash或者版本號。你可以手動的把文件都放進一個帶版本如v1.3的文件夾裡面。但是這樣做會有很多的缺陷:增加額外的工作,沒有更改的文件也不能從緩存裡面取之。
使用webpack可以給filename上加傷hash,有些輸出file的載入器已經支持(work-loader,file-loader).對於chunks你還需要讓他能夠支持,兩種級別:
- 從所有的chunks中計算出一個hash值
- 從每一個chunk中計算一個hash值
第一種:一個給bundle的hash
添加 [hash] 給filename
config options:
webpack ./entry output.[hash].bundle.js
{n output: {n path: path.join(__dirname, "assets", "[hash]"),n publicPath: "assets/[hash]/",n filename: "output.[hash].bundle.js",n chunkFilename: "[id].[hash].bundle.js"n }n}n
第二種: 每個chunk一個hash
添加 [chunkhash] 給 chunk filename
config option
--output-chunk-file [chunkhash].js
output: { chunkFilename: "[chunkhash].bundle.js" }n
注意:如果你想在HTML中使用entry chunk的hash,你可能需要從stats中分離出相應文件的hash 或者filename。
如果是和熱替換結合,你需要使用第一種類型但不能帶publicPath配置選項
從stats中得到 filenames
想要把從asset中得到的最終的filenames嵌入到HTML中,這些信息在webpack的stats 中是可以看到的。如果你使用CLI,運行腳本帶上--json來得到stats的json文件
你也可以添加一個assets-webpack-plugin 的插件到wepack配置當中來讓你得到stats對象。
或者自己寫插件來得到它,例子:
plugins: [n function() {n this.plugin("done", function(stats) {n require("fs").writeFileSync(n path.join(__dirname, "...", "stats.json"),n JSON.stringify(stats.toJson()));n });n }n]n
stats JSON包含了一個有用的屬性assetsByChunkName 包含了一個以chunk name作為key,filename作為值的對象
tips: 如果每個chunk都輸出了多個asset那麼filename會是一個數組. 比如一個chunk 你可能既輸出js也輸出sourceMap文件。
推薦閱讀:
※webpack增量打包
※create-react-boilerplate: 面向 React 技術棧的工程項目腳手架
※重溫 Webpack, Babel 和 React
※Webpack 3 的新功能:Scope Hoisting
TAG:webpack |