近期發佈了 webpack 4.0.0 的 beta 版本,若是想了解和以前版本的區別,不妨先本身搭建一個webpack的簡單應用體驗一下。css
安裝 npm i webpack --webpack-cli -D
html
"scripts": {
"build": "webpack --mode development",
"dev": "webpack-dev-server --open --mode development"
},
複製代碼
let path = require('path');
module.exports = {
entry: './src/index.js',//入口配置
output:{
path:path.join(__dirname,'dist'),//只能寫絕對路徑,輸出文件夾
filename:'bundle.js'//輸出文件名
},
module:{
},
plugins:[
]
}
複製代碼
執行
npx webpack
或者npm run build
壓縮 src文件夾下的index.js
jquery
require('./index.css');
複製代碼
npm install style-loader css-loader
並在webpack-config.js 中配置loaderrules:[
{
test:/\.css$/,
loader:["style-loader","css-loader"]
}
]
},
複製代碼
npm install webpack-dev-server -D
"dev": "webpack-dev-server --open --mode development"
,在配置--open 後,最後執行npm run dev
會自動啓動服務打開預覽。devServer:{
contentBase:'./dist',//靜態文件跟目錄
host:'localhost',//配置主機
port:8080,//主機名
compress:true//服務器返回給瀏覽器是否使用gzip壓縮
}
複製代碼
npm run dev
成功啓動項目
webpack-dev-server
是一個小型的Node.jsExpress服務器,它使用webpack-dev-middleware來服務於webpack的包,咱們能夠看到產出的文件(bundle.js),可是webpack-dev-server
打包的文件會放到內存中,不可見。webpack
npm i html-webpack-plugin -D
根據模板生成一個html文件output:{
path:path.join(__dirname,'dist'),//只能寫絕對路徑
filename: '[name].[hash].js'//打包後的文件名
},
複製代碼
輸出文件名,改成變量加上哈希值,避免頁面引入js有緩存的狀況web
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins:[
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
title: 'hello world!'
}),
],
複製代碼
src下建立index.html 模板文件,而且配置參數。npm
<!DOCTYPE html>
<html lang="en">E:\韓佳駿\FF\test\webpack\dist\index.html
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><%=htmlWebpackPlugin.options.title%></title>
</head>
<body>
<div id="app"></div>
</body>
</html>
複製代碼
npm run build
dist目錄下會自動生成打包後的文件,插入js和傳入的title屬性首先爲了每次build後dist下的目錄從新打包,方便查看,咱們使用json
npm i clean-webpack-plugin -D
複製代碼
引入webpack.config.js中bootstrap
const CleanWebpackPlugin = require('clean-webpack-plugin');
plugins: [
new CleanWebpackPlugin([path.join(__dirname, 'dist')]),
...
],
複製代碼
若是咱們多個頁面,而且每一個頁面引入的模塊不相同,該如何配置?瀏覽器
entry: {
index:'./src/index.js',
base:'./src/base.js'
},
複製代碼
entry 中配置的key至關於每個代碼塊chunk,配置多個頁面時,每一個頁面配置須要的模塊緩存
plugins: [
new CleanWebpackPlugin([path.join(__dirname, 'dist')]),
new HtmlWebpackPlugin({
template: './src/index.html',//指定產的HTML模板
filename: 'index.html',
title: 'hello index!',
chunks:['index']
}),
new HtmlWebpackPlugin({
template: './src/index.html',//指定產的HTML模板
filename: 'base.html',
title: 'hello base!',
chunks: ['base']
}),
],
複製代碼
假如咱們須要引入一個公共模塊common.js,好比是jquery,咱們還要其餘模塊內部引用jquery,這時
$
這個變量被封裝在模塊內部,其餘模塊沒法拿到jquery對象$
,這時須要在plugin中使用一個模塊
plugins: [
//用來自動向模塊內部注入變量
new webpack.ProvidePlugin({
$: 'jquery'
}),...
複製代碼
假如咱們想把
$
變成全局變量,那麼要引入expose-loader
, 它會先加載此模塊,而後獲得模塊的導出對象,而且掛載到window
寫法:
expose-loader?全局變量名:模塊名
let $ = require('expose-loader?$!jquery');
複製代碼
或者
rules: [
{
test: require.resolve('jquery'),
use: {
loader: 'expose-loader',
options: '$'
}
},
複製代碼
let pages = ['index', 'base'];
pages = pages.map(page => new HtmlWebpackPlugin({
template: './src/index.html',//指定產的HTML模板
filename: `${page}.html`,//產出的HTML文件名
title: `${page}`,
chunks: [`${page}`],//在產出的HTML文件裏引入哪些代碼塊
hash: true,// 會在引入的js里加入查詢字符串避免緩存,
minify: {
removeAttributeQuotes: true
}
}))
//....
plugins:[
//....
...pages
]
複製代碼
在entry 入口配置爲main.js,src文件夾下建立images目錄放入一張圖片
let src = require('./images/timg.jpg');
let img = new Image();
img.src = src;
document.body.appendChild(img);
複製代碼
npm i file-loader url-loader -D
複製代碼
{
//file-loader是解析圖片地址,把圖片從源位置拷貝到目標位置而且修改原引用地址
//url-loader能夠在文件比較小的時候,直接變成base64字符串內嵌到頁面中
test: /\.(png|jpg|gif|svg|bmp|eot|woff|woff2|ttf)/,
loader: {
loader: 'url-loader',
options: {
limit: 5 * 1024,
//指定拷貝文件的輸出目錄
outputPath: 'images/'
}
}
},
複製代碼
npm run build
以後順利在dist 目錄下生成一個images文件。瀏覽器也順利訪問這張圖片。
resolve: {
//引入模塊的時候,能夠不用擴展名
extensions: [".js", ".less", ".json"],
alias: {//別名
"bootstrap": "bootstrap/dist/css/bootstrap.css"
}
複製代碼