webpack is a tool to build JavaScript modules in your application. webpack simplifies your workflow by quickly constructing a dependency graph of your application and bundling them in the right order. webpack can be configured to customise optimisations to your code, to split vendor/css/js code for production, run a development server that hot-reloads your code without page refresh and many such cool features.css
webpack是一款前端資源模塊化管理和打包的工具。它能夠將模塊按照依賴和規則進行打包,還能夠將按需加載的模塊進行代碼分離,實現異步加載。經過加載器,任何形式的資源均可以被看做成模塊。html
Github地址前端
從一個主文件開始,依次尋找項目的全部依賴文件,經過加載器進行處理,最後打包成瀏覽器可以識別的JavaScript文件。node
webpack和其餘模塊化工具相比,具備以下特色:webpack
代碼分離git
webpack有兩種組織模塊依賴的方式:同步和異步。異步依賴會將代碼分離成不一樣的區塊,每個區塊都做爲一個文件被打包。github
加載器web
webpack自身只能處理原生的JavaScript模塊,經過加載器,能夠將不一樣類型的資源轉換成JavaScript模塊。換句話說,任何資源均可以被webpack當成模塊來處理。正則表達式
智能解析npm
webpack經過智能解析器,幾乎能夠處理任何的第三方庫。而且在加載依賴的時候,容許使用動態表達式進行加載。
插件
webpack還提供了插件系統,大多數功能都是基於這個插件系統運行的。能夠經過開發和使用webpack插件,知足不一樣的需求。
運行效率
webpack經過異步I/O和多級緩存,大大提升了運行效率,可以快速地實現增量編譯。
爲了可以更好地理解和使用webpack,首先須要瞭解webpack的四大核心概念:
入口entry
webpack爲應用程序的全部依賴建立了一個圖表,這個圖表的起始點被稱爲入口點。入口點會告訴webpack從哪裏開始,而且根據依賴圖表,清楚哪些資源會被打包。entry
屬性用來定義入口點。
輸出output
一旦將資源打包在一塊兒以後,須要告訴webpack將要把應用程序打包到何處。output
屬性用來描述打包文件的位置。
加載器loaders
當非JavaScript資源被添加到依賴圖表時,經過加載器將這些文件轉換成模塊。test
屬性用來定義要轉換的文件類型。use
屬性指定加載器的類型。
插件plugins
相對於加載器只能基於每一個文件進行轉換,插件一般用來針對複雜應用執行操做和自定義功能。要想使用插件,首先須要使用require()方法引入插件模塊,而後在plugins數組中,建立一個該插件的實例。
因爲webpack須要使用npm進行安裝,因此應該首先安裝Node.js。
一般不建議使用$ npm install webpack -g
命令進行全局安裝。而是將webpack安裝到項目的依賴中,這樣,就可使用項目本地版本的webpack。
進入到項目目錄,建立一個package.json文件:
npm init
安裝webpack依賴:
npm install webpack --save-dev
也能夠指定版本進行安裝:
npm install webpack@<version> --save-dev
若是須要使用webpack開發工具,須要單獨安裝:
$ npm install webpack-dev-server --save-dev
若是採用非全局安裝,執行以下命令進行打包:
node_modules/.bin/webpack app/index.js public/bundle.js
其中,index.js是入口文件,bundle.js是目標文件。
除了使用命令行運行webpack的方式,更好的方法是使用配置文件webpack.config.js
。它是一個node.js模塊,返回一個json格式的配置信息對象。也能夠經過--config
選項指定配置文件。
module.exports = { entry: __dirname + "/app/index.js", output: { path: __dirname + "/public", filename: "bundle.js" } }
其中,entry
屬性指向入口文件,output
屬性指定打包後文件存放的位置,__dirname
指向當前執行腳本所在的目錄。
此時,執行node_modules/.bin/webpack
命令,會自動參考配置文件中的配置選項打包項目。
還有一種更快捷的運行方式。在package.json中設置npm的腳本:
"scripts": { "start": "webpack" // 將npm的start命令指向webpack命令 },
這樣,直接執行npm start
命令,就會自動運行webpack進行打包。
webpack不少強大的功能,都是經過一系列可供配置選項完成的。這裏主要介紹一些經常使用的選項。
開發工具主要用來方便調試,提升開發效率。經過打包以後的文件,不太容易找到出現錯誤的地方對應的源碼位置。這時,可使用Source Map來解決這個問題。
devtool: "source-map"
devtool
屬性有四種不一樣的選項值:
Tips:在開發階段使用eval-source-map選項。
開發過程當中,但願瀏覽器可以監測到代碼的修改,並自動刷新,顯示修改以後的結果。這時,能夠配置devserver構建本地服務器來完成這些功能。
devServer: { contentBase: "./public", inline: true, colors: true, historyApiFallback: true }
由於本地服務器是一個單獨組件,因此在配置以前須要單獨安裝:
npm install webpack-dev-server --save-dev
devserver
屬性有以下配置選項:
Loaders是webpack最強大的功能之一。經過使用不一樣的loader,webpack調用外部的腳本或工具,能夠對各類格式的文件進行處理。
Loaders須要單獨安裝:
npm install json-loader --save-dev
而且須要在modules
屬性下進行配置:
module: { loaders: [ { test: /\.json$/, loader: "json" } ] }
loaders
屬性有以下配置選項:
webpack提供了不少有用的loader,如css-loader和style-loader,用來處理樣式表。css-loader可以使用相似@import和url()的方法實現require()的功能,而style-loader則將全部計算後的樣式加到頁面中。
安裝:
npm install style-loader css-loader --save-dev
配置:
module: { loaders: [ { test: /\.css$/, loader: "style!css" } ] }
其中,「!"表示同一文件可以使用不一樣類型的loader。
Sass或Less之類的預處理器是對原生CSS的拓展,不一樣類型的預處理器也對應不一樣的loader。webpack還提供一個CSS處理平臺PostCSS,可使CSS可以實現更多功能。使用PostCSS能夠爲CSS代碼自動添加適應不一樣瀏覽器的CSS前綴。
安裝:
npm install postcss-loader autoprefixer --save-dev
配置:
postcss: [ require('autoprefixer') ]
Babel是一個編譯JavaScript的平臺,它支持下一代的JavaScript標準(如:ES6),以及基於JavaScript進行拓展的語言(如:JSX)。
安裝:
npm install babel-core babel-loader babel-preset-es2015 --save-dev
配置:
module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: "babel", query: { presets: ['es2015'] } } ] }
webpack的另外一個強大功能。在整個構建過程當中,執行相關任務,拓展webpack功能。webpack有不少內置插件,同時也有不少第三方插件。
要想使用插件,首先須要安裝:
npm install html-webpack-plugin --save-dev
而後在plugins
屬性中添加該插件的一個實例:
plugins: [ new HtmlWebpackPlugin({ template: __dirname + "/app/index.tmpl.html" }) ]
Hot Module Replacement(HMR)也是webpack中很實用的插件,容許在修改組件代碼後,自動刷新實時預覽修改後的效果。
實現HMR只須要進行以下幾項配置。
在plugins中添加HMR插件:
new webpack.HotModuleReplacementPlugin()
在devserver中添加hot屬性:
hot: true
在js模塊中執行webpack提供的API。
雖然以上內容能夠構建一個完整的開發環境,但在產品階段,可能還須要對打包的文件進行額外的處理,如:優化、壓縮、緩存、代碼分離等。
使用緩存最好的方法是保證文件名和文件內容相匹配。webpack能夠把一個哈希值添加到打包的文件名中。
output: { path: __dirname + "/build", filename: "[name]-[hash].js" }
參考文章: