webpack官方文檔css
Webpack 是一個前端資源加載/打包工具(Module Bundler),它能把各類資源,例如JS(含JSX)、coffee、樣式(含less/sass)、圖片等都做爲模塊來使用和處理。html
只須要相對簡單的配置就能夠提供前端工程化須要的各類功能,而且若是有須要它還能夠被整合到其餘好比 Grunt / Gulp 的工做流。前端
咱們能夠直接使用 require(XXX) 的形式來引入各模塊,即便它們可能須要通過編譯(好比JSX和sass),但咱們無須在上面花費太多心思,由於 webpack 有着各類健全的加載器(loader)在默默處理這些事情。node
如今的網站已經演化成 web app:react
這意味着,客戶端有着愈來愈多的代碼。jquery
一個大的代碼庫須要良好的組織,這須要模塊系統來把代碼庫拆分紅模塊。webpack
loader是把一個資源文件做爲入參轉換爲另外一個資源文件的 node.js 函數。git
例如,能夠經過loader來讓 webpack 來加載 CoffeeScript 或 JSX 文件。github
若是loader發佈在 npm 上,那麼能夠經過下面的兩個命令來安裝web
$ npm install xxx-loader --save $ npm install xxx-loader --save-dev
$ npm install -g webpack
每一個項目下都必須配置有一個 webpack.config.js ,它就是一個配置項,告訴webpack它須要作什麼
看示例:
1 const webpack = require('webpack'); 2 3 module.exports = { 4 devtool: 'inline-source-map', 5 6 //頁面入口文件配置 7 entry: [ 8 './public/entry.jsx', 9 'webpack-hot-middleware/client' 10 ], 11 12 //入口文件輸出配置 13 output: { 14 path: __dirname, 15 publicPath: '/assets/', 16 filename: 'bundle.js' 17 }, 18 module: { 19 //加載器配置 20 loaders: [{ 21 test: /\.(js|jsx)$/, 22 exclude: /node_modules/, 23 loader: 'babel', 24 query: { 25 presets: ['es2015', 'react'] 26 } 27 }, 28 { 29 test:/\.css$/, 30 exclude:/node_modules/, 31 loader:'style!css' 32 }, 33 { 34 test: /\.(woff|woff2)$/, 35 loader: 'url-loader?limit=10000&mimetype=application/font-woff' 36 }, 37 { 38 test: /\.ttf$/, 39 loader: 'url?limit=10000&mimetype=application/octet-stream' 40 }, 41 { 42 test: /\.eot$/, 43 loader: 'file' 44 }, 45 { 46 test: /\.svg$/, 47 loader: 'url?limit=10000&mimetype=image/svg+xml' 48 }, 49 { 50 test: require.resolve('jquery'), 51 loader: 'expose?$!expose?jQuery' 52 }, 53 { 54 test: /\.(png|jpg)$/, 55 loader: 'url-loader?limit=8192' 56 } 57 ] 58 }, 59 60 //插件項 61 plugins: [ 62 // Webpack 1.0 63 new webpack.optimize.OccurenceOrderPlugin(), 64 // Webpack 2.0 fixed this mispelling 65 // new webpack.optimize.OccurrenceOrderPlugin(), 66 new webpack.HotModuleReplacementPlugin(), 67 new webpack.NoErrorsPlugin() 68 ] 69 };
一、plugins是插件項,這裏咱們用了三個插件方法:
webpack.optimize.OccurenceOrderPlugin(),webpack.HotModuleReplacementPlugin(),webpack.NoErrorsPlugin();
(1).webpack 給每一個模塊和分塊分配了 id 來識別它們。webpack 能夠經過new webpack.optimize.OccurenceOrderPlugin()給最經常使用的 id 分配最簡短的 id 來進行優化;
(2).webpack.NoErrorsPlugin()是選擇性的,主要的功能是當更改完的程序碼有語法錯誤時不要從新整理。當錯誤修改後,畫面會自動從新整理。
(3).webpack.HotModuleReplacementPlugin():Webpack-dev-server結合後端服務器的熱替換配置
二、entry 是頁面入口文件配置,output 是對應輸出項配置(即入口文件最終要生成什麼名字的文件、存放到哪裏),其語法大體爲:
1 { 2 entry:{ 3 page1: "./page1", 4 //支持數組形式,將加載數組中的全部模塊,但以最後一個模塊做爲輸出 5 page2: ["./entry1", "./entry2"] 6 }, 7 output:{ 8 path: "dist/js/page", 9 filename: "[name].bundle.js" 10 } 11 }
該段代碼最終會生成一個 page1.bundle.js 和 page2.bundle.js,並存放到 ./dist/js/page 文件夾下。
三、module.loaders 是最關鍵的一塊配置。它告知 webpack 每一種文件都須要使用什麼加載器來處理:
module: { //加載器配置 loaders: [ //.css 文件使用 style-loader 和 css-loader 來處理 { test: /\.css$/, loader: 'style-loader!css-loader' }, //.js 文件使用 jsx-loader 來編譯處理 { test: /\.js$/, loader: 'jsx-loader?harmony' }, //.scss 文件使用 style-loader、css-loader 和 sass-loader 來編譯處理 { test: /\.scss$/, loader: 'style!css!sass?sourceMap'}, //圖片文件使用 url-loader 來處理,小於8kb的直接轉爲base64 { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} ] }
如上,"-loader"實際上是能夠省略不寫的,多個loader之間用「!」鏈接起來。
注意全部的加載器都須要經過 npm 來加載,並建議查閱它們對應的 readme 來看看如何使用。
關於 webpack.config.js 更詳盡的配置能夠參考這裏。
$ webpack --display-error-details
後面的參數「--display-error-details」是推薦加上的,方便出錯時能查閱更詳盡的信息(好比 webpack 尋找模塊的過程),從而更好定位到問題。