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();
}
复制代码