webpack.config.js笔记
webpack.config.js笔记
/*
webpack.config.js webpack的配置文件
作用:指示 webpack 干那些活(当你运行webpack指令时,会加载里面的配置)
所有构建工具是基于nodejs平台运行的 模块化默认采用commonjs
*/
/*
loader:1.下载 2.使用(配置loader)
plugins:1.下载 2.引入 3.使用
*/
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path') //const { resolve } = require('path') resolve(__dirname, 'build')
const NODE_ENV = 'development' //开发模式
const devMode = NODE_ENV !== 'production';//mode: 'production',
module.exports = {
//webpack配置
//模式
mode: NODE_ENV,
//入口起点
entry: path.join(__dirname, "/src/index.js"), // 唯一入口文件
//输出
output: {
//输出文件名
filename: "js/bundle.js" // 打包后输出文件的文件名
//输出路径 __dirname nodejs的变量,代表当前文件的目录绝对路径
//path: resolve(__dirname, 'build')
path: path.join(__dirname, 'dist'), // 打包后的文件存放的路径
},
//loader配置
module: {
rules: [
//详细loader的配置
//不同文件必须配置不同loader处理
{
//配置那些文件
test: /\.css$/,
//使用那些loader进行处理
use: [
//use数组中loader执行顺序:从左到右,从下到上 依次执行
// 创建style标签,将js中的样式资源插入进行,添加到head中生效
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
//将css文件变成commonjs模块加载js中,里面内容是样式内容
'css-loader'
]
},
{
//配置那些文件
test: /\.less$/,
//使用那些loader进行处理
use: [
//use数组中loader执行顺序:从左到右,从下到上 依次执行
// 创建style标签,将js中的样式资源插入进行,添加到head中生效
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
//将css文件变成commonjs模块加载js中,里面内容是样式内容
'css-loader',
//将less文件变成css文件
'less-loader'
]
},
{
//默认处理不了html img图片
//处理图片资源
test: /\.(jpg|png|gif|jpeg|ico)$/,
//使用一个loader 下载 url-loader file-loader
loader: 'url-loader',
options: {
//图片大小小于8KB,就会被base64处理
//优点:减少请求数量(减轻服务器压力)
//缺点:图片体积会更大(文件请求速度更慢)
limit:8*1024,
//问题:url-loader默认使用es6 的模块化解析,而html-loader
//引入图片是commonjs [object Module]
//所以使用 esModule:false 关闭es6 的url-loader,使得commonjs解析
esModule:false,
//[hash:9]取图片的hash的前9位 .[ext]取文件原来拓展名
name:'[hash:9].[ext]',
outputPath:'imgs'
},
type:'javascript/auto'
},
{
//处理html文件中的img图片 (负责引入img 能被url-loader进行处理)
test: /\.html$/,
loader: 'html-loader'
}
]
},
//plugins的配置
plugins: [
//html-webpack-plugin
//功能:默认会创建一个空的html。自动引入打包输出的所有js/css
//需求:需要有结构的html
new HtmlWebpackPlugin({
//复制 './src/index.html' 文件,并自动引入打包输出的所有资源(js/css)
template: './src/index.html'
}),
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: devMode ? '[name].css' : '[name].[hash].css',
chunkFilename: devMode ? '[id].css' : '[id].[hash].css',
}),
],
//开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新浏览器)
//特点:只会在内存中编译打包 不会有任何输出
//启动devServer指令为:npx webpack-dev-server
devServer: {
// contentBase: resolve(__dirname, 'build'),
// static: resolve(__dirname, "build"),
static: path.join(__dirname, 'dist'),
//启动gzip压缩
compress: true,
//端口号
port: 3000,
//自动打开浏览器
open: true
}
}
path和resolve的区别
const path0 = path.resolve(__dirname, 'dist');
const path1 = path.resolve(__dirname, '/dist');
const path2 = path.resolve(__dirname, './dist');
const path3 = path.join(__dirname, './dist');
const path4 = path.join(__dirname, '/dist');
const path5 = path.join(__dirname, 'dist');
console.log(path0); //D:\TS\webpack\dist
console.log(path1); //D:\dist
console.log(path2); //D:\TS\webpack\dist
console.log(path3); //D:\TS\webpack\dist
console.log(path4); //D:\TS\webpack\dist
console.log(path5); //D:\TS\webpack\dist
//总结
//path.resolve 中 'dist' 和 './dist' 等价。
//path.join 中 'dist' 、'/dist' 和 './dist' 三者等价。