使用webpack快一年了,如今1.X版本都過氣了,可是感受本身對它那複雜的配置仍是很不熟悉,各類路徑,各類loader,各類plugin,又是單頁面又是多頁面... 在vue-cli出來的時候,都不敢用他的webpack模板,主要就是由於webpack的配置文件看不懂,不敢本身根據須要作修改。如今沉下心來,一點一點的玩弄經常使用屬性和插件,盡力能自如的進行配置。先拿配置中的
entry
開始。html
最簡單的webpack.config.js文件:vue
module.exports = { entry: './app.js', output: { path: './output', filename: 'output-file.js' } }
這個足夠簡單,進行webpack以後,會在命令的執行目錄下新建output目錄(若是須要的話),並將打包app.js和它的依賴,生成output-file.js放在output目錄中:node
若是不但願這裏涉及到的路徑和執行webpack命令時的具體路徑相關,而是但願相對於配置文件的路徑的話,就須要使用path
模塊:jquery
var path = require('path') module.exports = { entry: path.resolve(__dirname, './app.js'), output: { path: path.resolve(__dirname, './output'), filename: 'output-file.js' } }
配置文件中entry
接受三種形式的值:字符串,數組和對象webpack
對象形式以下:web
entry: { <key>: <value> ... }
最早介紹對象形式,是由於這個是最完整的entry配置,其餘形式只是它的簡化形式而已。對象中的每一對屬性對,都表明着一個入口文件,所以多頁面配置時,確定是要用這種形式的entry配置。vue-cli
keynpm
key能夠是簡單的字符串,好比:'app', 'main', 'entry-1'等。而且對應着output.filename
配置中的[name]
變量數組
entry: { 'app-entry': './app.js' }, output: { path: './output', filename: '[name].js' }
上面的配置打包後生成:app
key還能夠是路徑字符串。此時webpack會自動生成路徑目錄,並將路徑的最後做爲[name]
。這個特性在多頁面配置下也是頗有用的
entry: { 'path/of/entry': './deep-app.js', 'app': './app.js' }, output: { path: './output', filename: '[name].js' }
上面的配置打包後生成:
value
value若是是字符串,並且必須是合理的noderequire
函數參數字符串。好比文件路徑:'./app.js'(require('./app.js')
);好比安裝的npm模塊:'lodash'(require('lodash')
)
entry: { 'my-lodash': 'lodash' }, output: { path: './output', filename: '[name].js' }
上面的配置打包後生成:
value若是是數組,則數組中元素須要是上面描述的合理字符串值。數組中的文件通常是沒有相互依賴關係的,可是又處於某些緣由須要將它們打包在一塊兒。好比:
entry: { vendor: ['jquery', 'lodash'] }
entry: './app.js'
等價於下面的對象形式:
entry: { main: './app.js' }
entry: ['./app.js', 'lodash']
等價於下面的對象形式:
entry: { main: ['./app.js', 'lodash'] }
具有了上面的能力,就能夠開始配置一個簡單的多頁面webpack開發環境了。
開始前,要考慮清楚項目目錄結構,使用wepback時,通常要有個src源代碼目錄和一個build的打包目錄。
|-build |-src webpack.config.js
假設咱們有兩個頁面home和about,兩個main.js分別是兩個頁面的入口文件:
|-src |-pages |-about about.html main.js |-home home.html main.js
對於複雜點的webpack項目,先決定打包後的目錄結構很重要。webpack就像畫筆,打包後的目錄就像你打算畫的畫,要朝着目標去畫。
假如我但願「畫」是這樣的:
|-build |-assets |-js home.bundle.js about.bundle.js home.html about.html
有了這個結構,html中如何引入js文件就清楚了,例如在src/pages/home/home.html中:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Home</title> </head> <body> Home Page </body> <script src="assets/js/home.bundle.js"></script> </html>
接下來,朝着build的結構,寫配置文件webpack.config.js:
var path = require('path') module.exports = { entry: { 'assets/js/home': path.resolve(__dirname, './src/pages/home/main.js'), 'assets/js/about': path.resolve(__dirname, './src/pages/about/main.js') }, output: { path: path.resolve(__dirname, './build'), filename: '[name].bundle.js' } }
在webpack.config.js目錄下執行webpack命令,而後手動將兩個html文件從src/pages下拷貝到build目錄下,這樣在build目錄下就是一個打包好的多頁面結構了。
後面將用各類插件,讓webpack打包全自動化,這裏只是一個簡單的應用例子來了解entry的用法。
entry
一我的能玩的基本就這麼多,一些複雜的配置無非是經過變量的形式給其賦值,完成更靈活的配置。entry
是webpack的起點,後面全部的文件生成,提取CSS,生成HTML或者是CommonChunk都是在其基礎上進行的加工處理。