從啓動webpack構建到輸出結果經歷了一系列過程:javascript
指示 webpack 應該使用哪一個模塊,來做爲構建其內部依賴圖的開始css
entry: './src/app.js'
html
等同於下面寫法:vue
entry: {
main: './src/app.js'
}
複製代碼
分離 應用程序(app) 和 第三方庫(vendor) 入口java
entry: {
app: './src/main.js',
vendor: './src/jquery.js'
}
複製代碼
這告訴咱們 webpack 從 main.js 和 jquery.js 開始建立依賴圖(dependency graph)。這些依賴圖是彼此徹底分離、互相獨立的。node
webpack 編譯時的基礎目錄,entry和loader 會相對於此目錄查找react
默認值爲當前目錄,不建議修改jquery
告訴 webpack 在哪裏輸出它所建立的 bundleswebpack
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/',
filename: 'js/[name].js'
}
複製代碼
用於指定打包後的文件須要加載的外部資源(如圖片、js、css等)的跟路徑git
默認值是一個空字符串 "",一般設置成"/"
靜態資源最終訪問路徑 = output.publicPath + 資源loader或插件等配置路徑
{ name: 'imgs/[name].[ext]' }
// 那麼圖片最終的訪問路徑爲
output.publicPath('/') + 'imgs/[name].[ext]' = '/imgs/[name].[ext]'
複製代碼
new ExtractTextPlugin('css/[name].[contenthash:10].css')
// html中加載css打包後代碼
<link href="/css/app.9502b0c565.css" rel="stylesheet">
複製代碼
<script type="text/javascript" src="/js/runtime.4ece365fd5.js"></script>
複製代碼
打包文件輸出的目錄
建議絕對路徑;默認值爲當前路徑。
path 中用使用 [hash] 模板可用於版本回歸
output: {
path: path.resolve('./dist/[hash:8]/')
}
複製代碼
loader 讓 webpack 可以去處理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)
注意:module.loaders 改成 module.rules;鏈式loader
module: {
loaders: [{
test: /\.less$/,
loader: "style!css!less"
})
}
複製代碼
module: {
rules: [{
test: /\.less$/,
use: [
"style-loader",
"css-loader",
"less-loader"
]
}]
}
複製代碼
{
test: /\.(gif|png|jpe?g|svg)$/,
use: [{
loader: 'file-loader',
options:{}
}]
}
複製代碼
默認輸出到output的根目錄下,name爲32爲hash值
名稱 | 類型 | 默認值 | 描述 |
---|---|---|---|
name | {String | Funciton} | [hash].[ext] | 自定義文件名 |
placeholders
名稱 | 類型 | 默認值 | 描述 |
---|---|---|---|
[ext] | {String} | file.extname | 資源擴展名 |
[name] | {String} | file.name | 資源名 |
[path] | {String} | file.dirname | 資源路徑 |
[hash] | {String} | md5 | 內容的哈希值 |
對file-loader的擴展,能夠設置小圖片轉換base64圖片
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit:5000,
name: 'img/[name].[ext]?[hash]'
}
}
]
}
複製代碼
在全局上下文(global context)執行一次 JS腳本,就像你在網頁上經過<script>把它們引進來同樣。
因爲瀏覽器只能讀懂ES5語法,須要babel將ES2015+語法編譯爲ES5語法
npm install babel-loader babel-core babel-preset-env webpack
{
test: /\.js$/,
use: {
loader: 'babel-loader',
exclude: /node_modules/,
options: {}
}
}
複製代碼
options
minimize:true 壓縮html文件
將內聯的 SVG/MathML 文件轉換爲 HTML。在應用於圖標字體,或將 CSS 動畫應用於 SVG 時很是有用
{
test: /\.html$/,
use: [
'html-loader',
'markup-inline-loader'
]
}
複製代碼
html中使用:
<img markup-inline src="./_images/camera.svg" />
<img data-markup-inline src="./_images/camera.svg" />
css代碼放入js代碼裏再加入到html裏
獲得css代碼
獲得css文件
後處理css文件,對css文件作語法分析,真正的核心操做,依賴於postcss龐大的插件羣體 postcss插件
好比css的語法驗證,壓縮,支持變量和混入語法
postcss: function(webpack) {
return [
postcssImport({
addDependencyTo: webpack
}),
autoprefixer
]
}
複製代碼
loader 被用於轉換某些類型的模塊,而插件則能夠用於執行範圍更廣的任務。插件的範圍包括,從打包優化和壓縮,一直到從新定義環境中的變量
new htmlWebpackPlugin(options)
複製代碼
名稱 | 類型 | 默認值 | 描述 |
---|---|---|---|
title | {String} | `` | 用於生成的HTML文檔的標題 |
filename | {String} | 'index.html' | 生成html的文件名 |
template | {String} | `` | 模版路徑及文件名(路徑相對與output.context) |
inject | {Boolean|String} | true | 當傳遞true或'body'全部JavaScript資源將被放置在正文元素的底部。'head'將腳本放置在head元素中,false不會將腳本放進html中 |
favicon | {String} | `` | 將給定的圖標路徑添加到輸出HTML |
minify | {Boolean|Object} | true | 縮小輸出html html-minifier |
hash | {Boolean} | false | true:將webpack全部包含的腳本和CSS文件附加一個獨特的編譯哈希。這對緩存清除很是有用 |
cache | {Boolean} | true | 僅在文件被更改時才發出文件 |
showErrors | {Boolean} | true | 錯誤細節將寫入HTML頁面 |
chunks | {?} | ? | 容許添加的chunk名 |
chunksSortMode | {String|Function} | auto | 容許控制chunk在被包含到HTML以前應該如何排序。容許的值是'none'不分類 | 'auto'按塊ID排序 | 'dependency'經過其「父項」屬性對塊之間的依賴關係進行排序 | 'manual' | {Function} |
excludeChunks | {String} | `` | 容許您跳過一些chunk |
xhtml | {Boolean} | false | 若是true將link標籤呈現爲自動關閉(符合XHTML) |
chunksSortMode: function (chunk1, chunk2) {
var order = ['common', 'public', 'index'];
var order1 = order.indexOf(chunk1.names[0]);
var order2 = order.indexOf(chunk2.names[0]);
return order1 - order2;
}
複製代碼
webpack 把全部的資源都當成了一個模塊, CSS,Image, JS 字體文件資源, 都打包到一個 bundle.js 文件中
它將*.css輸入塊中的全部必需模塊移動到單獨的CSS文件中
new ExtractTextPlugin([id: string], filename: string, [options])
const ExtractTextPlugin = require('extract-text-webpack-plugin')
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",//編譯後用什麼loader來提取css文件
publicPath:, //重寫此 loader 的 publicPath 配置
use: "css-loader" //須要什麼樣的loader去編譯文件
})
}
]
}
複製代碼
CopyWebpackPlugin([
{
context: 'global/img',
from: '**/*',
to:'img/common'
},
{
from: 'img',
to:'img'
},
{
from :'global/lib/es5-shim-sham.js'
}
])
複製代碼
from 定義要拷貝的源目錄.
to 定義要拷盤的目標目錄.
context 上下文.
flatten 只拷貝文件無論文件夾 默認是false.
ignore 忽略拷貝指定的文件 能夠用模糊匹配.
force 強制覆蓋先前的插件 可選 默認false.
new webpack.optimize.UglifyJsPlugin(options)
複製代碼
名稱 | 類型 | 默認值 | 描述 |
---|---|---|---|
test | {RegExp|Array<RegExp>} | /.js$/i | 匹配文件 |
include | {RegExp|Array<RegExp>} | undefined | 包含目錄 |
exclude | {RegExp|Array<RegExp>} | undefined | 非匹配目錄 |
cache | {Boolean|String} | false | 啓用文件緩存;cache: 'path/to/cache' |
parallel | {Boolean|Number} | false | 使用多進程並行運行來提升構建速度 |
sourceMap | {Boolean} | false | 使用源映射將錯誤消息位置映射到模塊(這會減慢編譯速度) ⚠️ cheap-source-map 選項不適用於這個插件 |
uglifyOptions | {Object} | {...defaults} | uglify 選項 |
webpack.optimize.UglifyJsPlugin()遇到的 Unexpected token: operator (>) from UglifyJs
問題可使用 uglifyjs-webpack-plugin插件
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
複製代碼
new CleanWebpackPlugin(['./dist'])
webpack將多個模塊打包以後的代碼集合稱爲chunk
將公共js代碼提取到單獨文件裏
new webpack.optimize.CommonsChunkPlugin(options)
module.exports = {
entry: {
main1: '/src/main1.js',
main2: '/src/main2.js',
jquery:["jquery"],
vue:["vue"]
},
plugins: [
new CommonsChunkPlugin({
name: ["common",'jquery','vue'],//對應於上面的entry的key
minChunks:2
})
]
};
複製代碼
打包後jquery和vue會生成獨立chunk,main1和main2中的公共業務模塊會打包到common.js中;minChunks爲infinity時,公共業務模塊會分別打包到main1.js和main2.js中
webpack用插件CommonsChunkPlugin進行打包的時候 將符合引用次數(minChunks)的模塊打包到name參數的數組的第一個塊裏(chunk),而後數組後面的塊依次打包,最後一個塊包含webpack生成的在瀏覽器上使用各個塊的加載代碼
new webpack.HotModuleReplacementPlugin()
複製代碼
devServer: {
hot: true // 激活服務器的HMR
}
複製代碼
在不一樣系統環境下設置變量
css-loader?minimize
去除css文件裏有不少空格和tab
藉助es6 import export
語法靜態性的特色來刪掉export可是沒有import過的東西
"presets": [
[
"es2015",
{
"modules": false
}
]
]
複製代碼
new UglifyJsPlugin({
// 最緊湊的輸出
beautify: false,
// 刪除全部的註釋
comments: false,
compress: {
// 在UglifyJs刪除沒有用到的代碼時不輸出警告
warnings: false,
// 刪除全部的 `console` 語句
// 還能夠兼容ie瀏覽器
drop_console: true,
// 內嵌定義了可是隻用到一次的變量
collapse_vars: true,
// 提取出出現屢次可是沒有定義成變量去引用的靜態值
reduce_vars: true,
}
})
複製代碼
imagemin-webpack-plugin
壓縮圖片module.exports = {
resolve: {
modules: [path.resolve(__dirname, 'node_modules')]
}
};
複製代碼
{
test: /\.js$/,
loader: 'babel-loader',
include: path.resolve(__dirname, 'src')
}
複製代碼
babel編譯過程很耗時,好在babel-loader提供緩存編譯結果選項,在重啓webpack時不須要創新編譯而是複用緩存結果減小編譯流程。babel-loader緩存機制默認是關閉的,打開的配置以下:
{
test: /\.js$/,
loader: 'babel-loader?cacheDirectory',
}
複製代碼
resolve.alias 配置路徑映射。 發佈到npm的庫大多數都包含兩個目錄,一個是放着cmd模塊化的lib目錄,一個是把全部文件合成一個文件的dist目錄,多數的入口文件是指向lib裏面下的。
默認狀況下webpack會去讀lib目錄下的入口文件再去遞歸加載其它依賴的文件這個過程很耗時,alias配置可讓webpack直接使用dist目錄的總體文件減小文件遞歸解析。配置以下:
module.exports = {
resolve: {
alias: {
'moment': 'moment/min/moment.min.js',
'react': 'react/dist/react.js',
'react-dom': 'react-dom/dist/react-dom.js'
}
}
};
複製代碼
module.noParse
配置哪些文件能夠脫離webpack的解析。 有些庫是自成一體不依賴其餘庫的沒有使用模塊化的,好比jquey、momentjs、chart.js,要使用它們必須總體所有引入。
webpack是模塊化打包工具徹底沒有必要去解析這些文件的依賴,由於它們都不依賴其它文件體積也很龐大,要忽略它們配置以下:
module.exports = {
module: {
noParse: /node_modules\/(jquey|moment|chart\.js)/
}
};
複製代碼