五个核心概念
entry
指示webpack以哪个文件为入口起点开始打包,分析构建内部依赖图
output
指示webpack打包后资源bundles输出到哪里去,以及如何命名
loader
让webpack能够处理那些非js文件(webpack自身只能理解JavaScript)。
类似翻译官,将(css->js, img->js)
plugins
插件可以用于执行范围更广的任务,插件的范围包括从打包优化到压缩,一直到重新定义环境中的变量等。
Mode
mode分为development和production两种模式
选项 | 描述 | 特点 |
---|---|---|
development | process.env.NODE_ENV:development 启动NamedChunksPlugin和NamedModulesPlugin |
能让代码本地调试运行的环境 |
production | process.env.NODE_ENV:production | 能让代码优化上线运行的环境 |
要点:
1、webpack能处理js、json资源;不能处理css/img等资源
2、webpack能将ES6模块化编译成浏览器能识别的模块化
3、生产环境比开发环境多一个压缩js代码
打包样式资源(Loader)
Loader配置用module
module: {
rules: [
{
test: /\.css/,
use: [
// 创建style标签,将js中的样式资源插入到head标签中
'style-loader',
// 将css文件变成commonjs模块加载js中,里面内容时样式字符串
'css-loader',
]
}
]
}
loader工作原理就是通过test来匹配相应的资源文件,然后通过use来将资源转换成webpack能理解的js,解析顺序默认是从右往左,从下往上。
Loader使用流程:1、下载 2、使用(配置Loader)
处理html资源(plugins)
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
// 功能:创建一个空的html,自动引入打包输出的所有资源(js/css)
new HtmlWebpackPlugin({
// 以src下的index.html文件为模板(复制它),并自动引入打包输出的所有资源
template: './src/index.html'
})
]
}
处理图片资源
module: {
rules: [
// url-loader不能处理html中通过img标签引入的图片资源
{
test: /\.(jpg|png|gif)$/,
// 需要下载url-loader和file-loader
loader: 'url-loader',
options: {
// 图片小于8kb,就会被base64处理
// 优点: 减少请求数量(减轻服务器压力)
// 缺点: 图片体积会更大(文件请求速度更慢)
limit: 8 * 1024,
// url-loader默认支持es模块解析,而html-Loader引入图片时是commonjs
// 解决:关闭es模块化,使用commonjs解析
esModule: false,
name: '[hash:10].[ext]'
}
},
// 要处理html里的图片资源,还需要html-loader
{
test: /\.html$/,
// 处理html中的img图片(负责引入img,从而能被url-loader进行处理)
loader: 'html-loader',
}
]
}
64一般用于转换一些比较小的(8-12kb)图片,将图片转成一长串字符串(大小会比原图片大一点)
打包其他资源(字体、图标等等)
使用file-loader+exclude(排除掉其他资源)即可
devServer
devServer: {
// 开发服务器devServer:用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)
contentBase: resolve(__dirname, 'build'),
// 启动压缩
compress: true,
post: 8080,
}
devServer特点:只会在内存中编译打包,不会有任何输出。这就是为什么dev环境看不到输出的dist文件夹,实际上还是进行打包操作的。
提取css成单独文件
使用mini-css-extract-plugin插件
这个插件还自带一个loader: MiniCssExtractPlugin.loader,需要替换掉style-loader,style-loader是解析创建style标签,将css-loader解析后的css放到style标签里,然后插入到html的head中。
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
}
下面是plugins的配置
new MiniCssExtractPlugin({
// 指定打包后文件名
filename: 'css/built.css'
})
css兼容性处理
css兼容性处理:postcss —> postcss-loader 和 postcss-preset-env
js兼容性处理
处理es6及以上的语法低版本浏览器不支持的,使用babel-loader
// js兼容性处理:
// 1.基本的兼容性处理 --> @babel/preset-env
// 问题:只能转换基本语法,如promise不能转换
// 2.全部js兼容性处理 --> @babel/polyfill
// 问题:将所有兼容性代码全部引入,体积太大
// 3.按需加载兼容性处理 --> corejs
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
// 预设:只是babel做怎样的兼容性处理
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'usage',
corejs: {
version: 3
},
// 需要兼容的浏览器
targets: {
chrome: '60',
firefox: '60',
ie: '9',
edge: '17',
}
}
]
]
}
}
压缩css
使用optimize-css-assets-webpack-plugin
压缩js和html
生产环境下会自动压缩js代码,压缩html则可以通过给之前配置的html-webpack-plugin加配置项实现
new HtmlWebpackPlugin({
minify: {
// 移除空格
collapseWhitespace: true,
// 移除注释
removeComments: true,
}
})