// webpack.config.js
/*
loader: 下载->使用
plugin: 下载->引入->使用
*/
// resolve用来拼接绝对路径
const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// 入口起点
entry: './src/index.js',
// 输出
output: {
// 文件名
filename: 'js/built.js',
// __dirname node.js的变量,代表当前文件目录的绝对路径
path: resolve(__dirname, 'build'),
},
// loader
module: {
rules: [
// 详细loader配置
{
// 匹配哪些文件
test: /\.css$/,
// 使用哪些loader处理。use中执行顺序是倒序
use: [
// 创建style标签,将js中的样式资源插入进行,添加到head中生效
'style-loader',
// 将css文件变成commonjs模块加载到js中,里面内容是样式字符串
'css-loader',
// 将less文件编译成css文件
'less-loader',
]
},
{
test: /\.less$/,
use: [
'style-loader',
'css-loader',
// 将less文件编译成css文件。需要下载less-loader和less
'less-loader',
]
},
{
// 问题: 默认处理不了html中img图片
test: /\.(jpg|png|gif)$/,
// 需要下载url-loader、file-loader
loader: 'url-loader',
options: {
// 图片大小小于8kb,就会被base64处理
// 优点:减少请求数量,减轻服务器压力
// 缺点:图片体积更大,文件请求速度更慢
limit: 8*1024,
// 问题:url-loader默认用es6模块化解析,而html-loader引入图片时commonjs
// 解析时会出问题:[object Module]
// 解决:关闭url-loader的es6模块化,使用commonjs解析
esModule: false,
// 给图片重命名:取图片的hash前10位,取文件原来的扩展名
name: '[hash:10].[ext]',
// 输出到imgs文件夹下
outputPath: 'imgs'
}
},
{
test: /\.html$/,
// 处理html文件的img图片:负责引入img,从而能被url-loader处理
loader: 'html-loader'
},
{
// 打包 除了css、js、html资源以外的资源,如icon-font
exclude: /\.(css|js|html|less|jpg|png|gif)$/,
loader: 'file-loader',
options: {
name: '[hash:10].[ext]',
outputPath: 'media'
}
}
]
},
plugins: [
// 功能:默认创建一个空的HTML,自动引入打包输出的所有资源(js/css)
// 需求:需要有结构的html文件
new HtmlWebpackPlugin({
// 复制index.html文件,并自动引入打包输出的所有资源(js/css)
template: './src/index.html'
})
],
mode: 'development',
// mode: 'production',
// 开发服务器 devServer:用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)
// 特点:只会在内存中编译打包,不会有任何输出。使用webpack指令时,编译打包后会有输出。
// 启动devServer指令为: npx webpack-dev-server
devServer: {
// 项目构建后路径
contentBase: resolve(__dirname, 'build'),
// 启动gzip压缩
compress: true,
port: 3000, // 端口号
open: true, // 自动打开浏览器
}
}