WebPack能夠看作是模塊打包機:它作的事情是,分析你的項目結構,找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),並將其打包爲合適的格式以供瀏覽器使用。css
Webpack 啓動後會從Entry裏配置的Module開始遞歸解析
Entry
依賴的全部Module
。 每找到一個 Module, 就會根據配置的Loader
去找出對應的轉換規則,對 Module 進行轉換後,再解析出當前 Module 依賴的 Module。 這些模塊會以 Entry 爲單位進行分組,一個 Entry 和其全部依賴的 Module 被分到一個組也就是一個Chunk
。最後 Webpack 會把全部 Chunk 轉換成文件輸出。 在整個流程中 Webpack 會在恰當的時機執行 Plugin 裏定義的邏輯。html
module.exports = {
mode:'development', //開發仍是生產模式
entry:"./src/index.js", //入口文件
output: { //出口
},
devServer: { //開發服務
},
module: { //模塊的配置
},
plugins: [ //插件
]
};
複製代碼
output: {
//打包後的文件名
filename:'bundle.js',
//打包後的目錄,必須絕對路徑
path:require('path').resolve(__dirname,'dist')
},
複製代碼
let htmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
new htmlWebpackPlugin({
template:'./src/index.html', //模板文件
filename:'index.html' //打包後的文件名稱
})
]
複製代碼
//主模塊 webpack默認會識別js模塊
import str from "./a";
console.log(str);
document.getElementById('app').innerHTML = 'hello world'
複製代碼
export default 'hello'
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
複製代碼
到這裏,就能夠實現打包了,但咱們須要在package.json寫兩個命令node
輸入npm run dev 查看結果webpack
module: { //模塊的配置
rules: [
{
test:/\.css/,use:['style-loader','css-loader']
},
{
test:/\.less/,use:['style-loader','css-loader','less-loader']
}
]
},
複製代碼
//主模塊 webpack默認會識別js模塊
import str from "./a";
console.log(str);
document.getElementById('app').innerHTML = 'hello world'
import "./index.css" //引入css
import "./index.less" //引入less
複製代碼
測試效果git
效果實現了,可是有個問題,咱們看下渲染出來的頁面結構es6
要解決這個問題,須要引入一個插件 mini-css-extract-plugingithub
module: { //模塊的配置
rules: [
{
test: /\.css$/, use: [{ //指定對應的loader
loader: MiniCssExtractPlugin.loader
}, 'css-loader']
},
{test:/\.less$/,use:[{
loader: MiniCssExtractPlugin.loader
},
'css-loader',
'less-loader']
}
]
},
複製代碼
let MiniCssExtractPlugin = require("mini-css-extract-plugin");
plugins: [
new htmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
}),
new MiniCssExtractPlugin({
// 指定打包後的輸出目錄
filename: "css/index.css",
})
],
複製代碼
看下效果web
咱們假定有2個頁面 index.html 、login.htmlnpm
entry: {
"index":"./src/index.js", //前面的key用於標識,後面會用到
'login':'./src/login.js'
},
複製代碼
output: { //出口
filename: "js/[name].js", //打包後的目錄格式 [name]對應上面定義的key
//出口路徑是一個絕對路徑
path: require("path").resolve(__dirname, 'dist')
},
複製代碼
須要主要的是[name]對應entry對應的keyjson
plugins: [
new htmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
chunks:['index']
}),
new htmlWebpackPlugin({ //增長一個htmlWebpackPlugin
template: './src/index.html',
filename: 'login.html',
chunks:['login']
}),
new MiniCssExtractPlugin({
filename: "css/index.css"
})
]
複製代碼
chunks代碼塊,也是對應entry中的key,
alert('我是login頁面')
複製代碼
目前爲止,多頁面多入口已經簡單實現,你可能會問當有不少的頁面時候怎麼辦?
能夠在每次打包的時候,把dist目錄清空,而後打包最新的文件。很簡單,就不廢話了。
let cleanWebpackPlugin = require('clean-webpack-plugin');
plugins: [
new cleanWebpackPlugin(['./dist']),
]
複製代碼
let webpack = require('webpack');
devServer: { //開發服務
contentBase:"./dist", //啓用靜態服務目錄
port:3000,
hot:true
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
]
複製代碼
//主模塊 webpack默認會識別js模塊
import str from "./a";
console.log(str);
document.getElementById('app').innerHTML = 'hello world'
import "./index.css"
import "./index.less"
//若是有熱更新 就啓動熱更新
if(module.hot){
module.hot.accept();
}
複製代碼