打包第一個文件:css
全局安裝webpack:html
npm install webpack -g
此時若是出現報錯:vue
Cannot find module 'webpack-cli' 請執行: npm install --save-dev webpack
再執行出現:node
WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment. 請先執行 npm init -y, 生成package.json 在新建一個webpack.config.js配置文件,用於配置webpack選項 寫入: const path = require('path') // 經過Node模塊,向外面暴露一個配置 module.exports = { entry:path.join(__dirname, './src/main.js'), // 打包文件 output: { path: path.join(__dirname, './dist') // 打包好的文件名 }, mode: 'development' // 設置mode }
此時再執行打包將無報錯,且生成的文件將放入當前目錄下的dist文件夾, 默認文件名爲main.jswebpack
認識webpack配置文件(即webpack.config.js)git
基礎格式:github
const path = require('path') // node的基礎path模塊 const 插件1 = require('插件1') module.exports = { //模式——設置開發模式 mode: 'development', //入口——指定src/index.js爲入口文件 entry: { main: './src/index.js' }, //輸出——指定dist/bundle.js爲輸出文件 output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, //轉換器。模塊>規則 module: { rules: [ { test: /\.後綴名$/, use: [ { loader: '轉換器1', options: {} //轉換器1配置 } ] } ] }, //插件 plugins: [ new 插件1({ //插件配置 }) ] }
入口(entry):web
每一個entry屬性,對應一個入口文件,便於單頁、多頁應用的js引入,npm
單頁面入口 entry: { main: './src/index.js } // 可縮寫爲entry: './src/index.js'
多頁面入口 entry: { one: './src/one/index.js', two: './src/two/index.js', three: './src/three/index.js' }
也可以使用node的path模塊實現獲取相對於配置文件的路徑json
const path = require('path') module.exports = { entry: path.resolve(__dirname, './app.js') } // 注意,這裏的__dirname, 爲兩個下劃線
entry支持三種格式:
對象:
entry: { <key>: <value> } // key能夠是簡單的字符串, 對應着output.filename配置中的[name]變量, entry: { 'app-entry': './app.js' } // key還能夠是路徑字符串。此時webpack會自動生成路徑目錄,並將路徑的最後做爲[name] entry: { 'path/of/entry': './app.js' } // value若是是字符串,並且必須是合理的noderequire函數參數字符串。好比文件路徑:'./app.js'(require('./app.js'));好比安裝的npm模塊:'lodash'(require('lodash')) entry: { 'my-lodash': 'lodash' }, output: { path: './output', filename: '[name].js' }
數組:
entry: ['./app.js', 'lodash'] 等價於: entry: { main: ['./app.js', 'lodash'] }
字符串:
entry: './app.js' 等價於 entry: { main: './app.js' }
output(輸出)
output是影響編譯輸出的選項。output選項告訴webpack怎麼把編譯文件寫入磁盤。注意,雖然能夠有不少輸入口,可是隻有一個輸出配置
output: { path: path.resolve(__dirname, 'dist') filename: [name].js // 使用[name]佔位符,自動識別入口文件名,從而區分打包文件名 }
[name]被入口的名字替換.
[hash]被編譯器hash替換.
[chunkhash] 被入口的hash替換.
module 配置如何處理模塊
匹配規則:
1. 條件匹配: 經過test/include/exclude三個配置項來命中Loader要應用的規則文件 2. 應用規則: 對選中的文件經過use配置項來應用loader,能夠應用一個loader或者從後往前應用一組loader,同時還能夠分別給loader傳入參數。 3. 重置順序,一組loader的執行順序默認是從右到左執行,經過exforce選項可讓其中一個loader的執行順序放到最前或者最後。 module: { rules: [ { test: /\.js$/, use: ['babel-loader?cacheDirectory'], include: path.resolve(__dirname, 'src') }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'], exclude: path.resolve(__dirname, 'node_modules') }, { // test、include、exclude還支持數組類型 test: [/\.jsx?$/, /\.tsx?$/], include: [ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'test') ], exclude: [ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, 'bower_modules') ] } ] }
在loader須要傳入不少參數的時候,咱們還能夠經過一個object來描述,如:
use: [ { loader: 'babel-loader', options: { cacheDirectory: true }, // enforce:'post' 的含義是把該 Loader 的執行順序放到最後 // enforce 的值還能夠是 pre,表明把 Loader 的執行順序放到最前面 enforce:'post' } ]
常見的loader配置:
{ // 加載圖像 test: /\.(png|svg|jpg|gif)$/, use: [ 'file-loader' ] } { // 加載字體 test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ 'file-loader' ] } { // 加載css test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }
plugins:
//經過new實例,啓用插件 plugins: [ new webpack.ProgressPlugin(), //webpack自帶一系列插件 new HtmlWebpackPlugin({template: './src/index.html'}) //使用對象,爲插件配置參數 ]
常見的plugin:
環境變量:
webpack能夠設置環境變量以區分生產模式仍是開發模式,由此執行不一樣的操做。
const NODE_ENV = process.env.NODE_ENV // 可獲取到環境變量 可由此對目前是生產模式仍是開發模式
resolve: webpack在構建包的時候會按目錄的進行文件的查找,resolve屬性中的extensions數組中用於配置程序能夠自行補全哪些文件後綴。例如:
resolve: { nodules: [path.resolve(__dirname, "node_modules")], extensions: ['.js', '.json', '.scss', '.vue', '.json'] // 模塊別名定義,方便後直接引用別名, 無需多寫長地址 alias: { '@/static': resolve('static'), // 將@/static指向當前項目,下的static目錄 '@': resolve('src'), // 將@指向src目錄 } }
命令:
//開發模式,啓動服務器 webpack-dev-server --open --config webpack.dev.js //生產模式,打包 webpack --config webpack.prod.js
使用demo參考: 阮一峯的https://github.com/ruanyf/web...