在項目下建立一個webpack.config.js(默認,可修改)文件來配置webpackcss
module.exports = { entry: '', // 入口文件 output: {}, // 出口文件 module: {}, // 處理對應模塊 plugins: [], // 對應的插件 devServer: {}, // 開發服務器配置 mode: 'development' // 模式配置 }
以上就是webpack的正常配置模塊node
工程資源的入口,它能夠是單個文件也能夠是多個文件。webpack
Entry 類型web
module.exports = { entry: './app.js' }
module.exports = { entry: ['./app.js','./index.js'] }
module.exports = { entry: {index,'./index.js',app,'./app.js'} //index表示獨特的chunk }
Webpack 在尋找相對路徑的文件時會以 context 爲根目錄,context 默認爲執行啓動 Webpack 時所在的當前工做目錄。 若是想改變 context 的默認配置,則能夠在配置文件裏這樣設置它:數組
module.exports = { context: path.resolve(__dirname, 'app') }
Webpack 會爲每一個生成的 Chunk 取一個名稱,Chunk 的名稱和 Entry 的配置有關:緩存
假如項目裏有多個頁面須要爲每一個頁面的入口配置一個 Entry ,但這些頁面的數量可能會不斷增加,則這時 Entry 的配置會受到到其餘因素的影響致使不能寫成靜態的值。其解決方法是把 Entry 設置成一個函數去動態返回上面所說的配置,代碼以下:sass
// 同步函數 entry: () => { return { a:'./pages/a', b:'./pages/b', } }; // 異步函數 entry: () => { return new Promise((resolve)=>{ resolve({ a:'./pages/a', b:'./pages/b', }); }); };
這是一個配置對象,經過它咱們能夠對最終打包的產物進行配置。服務器
output.filename 配置輸出文件的名稱,爲string 類型。babel
const path = require('path'); module.exports = { entry: './app.js', output: { path: path.join(__dirname, 'dist'), //打包資源放置的路徑,必須爲絕對路徑。 filename: 'bundle.js' //打包結果的文件名。 } }
const path = require('path'); module.exports = { entry: {index,'./index.js',app,'./app.js'}, output: { path: path.join(__dirname, 'dist'), filename: '[name].min.[hash:5].js' } }
output.chunkFilename 配置無入口的 Chunk 在輸出時的文件名稱。 chunkFilename 和上面的 filename 很是相似,但 chunkFilename 只用於指定在運行過程當中生成的 Chunk 在輸出時的文件名稱。 常見的會在運行時生成 Chunk 場景有在使用 CommonChunkPlugin、使用 import('path/to/module') 動態加載等時。 chunkFilename 支持和 filename 一致的內置變量。app
output.path 配置輸出文件存放在本地的目錄,必須是 string 類型的絕對路徑。一般經過 Node.js 的 path 模塊去獲取絕對路徑:
path: path.resolve(__dirname, 'dist_[hash]')
output.publicPath 配置發佈到線上資源的 URL 前綴,爲string 類型。 默認值是空字符串 '',即便用相對路徑。
須要把構建出的資源文件上傳到 CDN 服務上,以利於加快頁面的打開速度。配置代碼以下:
filename:'[name]_[chunkhash:8].js' publicPath: 'https://cdn.example.com/assets/'
這時發佈到線上的 HTML 在引入 JavaScript 文件時就須要:
<script src='https://cdn.example.com/assets/a_12345678.js'></script>
使用該配置項時要當心,稍有不慎將致使資源加載404錯誤。
module 配置如何處理模塊。
處理文件,Webpack 自己只能處理 JavaScript,而對於別的類型的語法則徹底不認識。若是咱們須要引入某一類型的模塊,那麼就須要經過爲它添加特性類型的 loader。
rules 配置模塊的讀取和解析規則,一般用來配置 Loader。其類型是一個數組,數組裏每一項都描述瞭如何去處理部分文件。
module: { rules: [ { // 命中 JavaScript 文件 test: /\.js$/, // 用 babel-loader 轉換 JavaScript 文件 // ?cacheDirectory 表示傳給 babel-loader 的參數,用於緩存 babel 編譯結果加快從新編譯速度 use: ['babel-loader?cacheDirectory'], // 只命中src目錄裏的js文件,加快 Webpack 搜索速度 include: path.resolve(__dirname, 'src') }, { // 命中 SCSS 文件 test: /\.scss$/, // 使用一組 Loader 去處理 SCSS 文件。 // 處理順序爲從後到前,即先交給 sass-loader 處理,再把結果交給 css-loader 最後再給 style-loader。 use: ['style-loader', 'css-loader', 'sass-loader'], // 排除 node_modules 目錄下的文件 exclude: path.resolve(__dirname, 'node_modules'), }, { // 對非文本文件採用 file-loader 加載 test: /\.(gif|png|jpe?g|eot|woff|ttf|svg|pdf)$/, use: ['file-loader'], }, ] }
在 Loader 須要傳入不少參數時,你還能夠經過一個 Object 來描述,例如在上面的 babel-loader 配置中有以下代碼:
use: [ { loader:'babel-loader', options:{ cacheDirectory:true, }, // enforce:'post' 的含義是把該 Loader 的執行順序放到最後 // enforce 的值還能夠是 pre,表明把 Loader 的執行順序放到最前面 enforce:'post' }, // 省略其它 Loader ]
上面的例子中 test include exclude 這三個命中文件的配置項只傳入了一個字符串或正則,其實它們還都支持數組類型,使用以下:
{ test:[ /\.jsx?$/, /\.tsx?$/ ], //只選中當前目錄 include:[ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'tests'), ], //排除相應目錄文件 exclude:[ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, 'bower_modules'), ] }
經常使用 Loader
Plugin 用於擴展 Webpack 功能,各類各樣的 Plugin 幾乎讓 Webpack 能夠作任何構建相關的事情。
Plugin 的配置很簡單,plugins 配置項接受一個數組,數組裏每一項都是一個要使用的 Plugin 的實例,Plugin 須要的參數經過構造函數傳入。
const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin'); module.exports = { plugins: [ // 全部頁面都會用到的公共代碼提取到 common 代碼塊中 new CommonsChunkPlugin({ name: 'common', chunks: ['a', 'b'] }), ] };
經常使用 Plugins
至關於代碼塊
打包後的一捆代碼
模塊