webpack 基础用法
核心概念 --- Entry
Entry 用来指定 webpack 的打包入口
理解依赖图的含义

-
依赖图的入口是 entry
-
对于非代码比如: 图片、字体依赖也会不断的加入到依赖图中
Entry 的用法
单入口: entry是一个字符串
module.exports = {
entry: './path/to/my/entry/file.js'
}
多入口: entry 是一个对象
module.exports = {
entry: {
app: './src/app.js',
adminApp: './src/adminApp.js'
}
}
核心概念 --- output
- Oouput 用来告诉 webpack 如何将编译后的文件输出到磁盘
output 的用法: 单入口配置
module.exports = {
entry:'./path/to/my/entry/file.js',
output:{
filename: 'bundle.js',
path: __dirname + '/dist'
}
}
output 的用法: 多入口配置
module.exports = {
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name].js', ----------> 通过占位符确保文件名称的唯一
path: __dirname + './dist'
}
}
核心概念 --- loaders
- webpack 开箱即用只支持js和json 两种文件类型, 通过loaders 去支持其他的文件类型并且把他们 转化成有效的模块,并且可以把他们转化成有效的模块,并且可以添加到依赖图中
- 本身是一个函数, 接受源文件作为参数,返回转换的结果
常用的loaders
| 名称 | 描述 |
|---|---|
| babel-loader | 转换es6、es7等新特性语法 |
| css-loader | 支持.css文件的加载和解析 |
| less-loader | 将less文件转换成 css |
| ts-loader | 将TS转化成 JS |
| file-loader | 将图片、字体等的打包 |
| raw-loader | 将文件以字符串的形式导入 |
| thread-loader | 多进程打包js和css |
loaders 的用法
const path = require('path');
module.exports = {
output: {
filename:'bundle.js'
},
module: {
rules:[
{test:/\.txt$/,use: 'raw-loader'} ----> test 指定匹配规则
use 指定使用的loader名称
]
}
}
核心概念 --- plugins
- 插件用于 bundle 文件的优化, 资源管理和环境变量的注入
- 作用于 整个构建过程
常见的 plugins
| 名称 | 描述 |
|---|---|
| CommonsChunkPlugin | 将chunk相同的模块代码提取成公共js |
| CleanWedpackPlugin | 清理构建目录 |
| ExtractTextWebpackPlugin | 将css从bunlde文件里提取成一个独立的css文件 |
| CopyWebpackPlugin | 将文件或者文件夹拷贝到构建的输出目录 |
| HtmlWebpackPlugin | 创建html文件去承载输出的bundle |
| UglifyjsWebpackPlugin | 压缩js |
| ZIpWebpackPlugin | 将打包出的资源生成一个zip包 |
Plugins 的用法
const path = require('path');
module.exports = {
output:{
filename: 'bundle.js',
},
plugins: [
newHtmlWebpackPlugin({
template: './src/index.html' -------> 放到 plugins 的数组里
})
]
}
核心概念 --- mode
- Mode 用来指定当前的构建环境是: production、development、还是 none
- 设置 mode 可以使用 webpack 内置的函数, 默认值为 production
Mode 的内置函数
| 选项 | 描述 |
|---|---|
| development | 设置 process.env.NODE_ENV 的值为 development. 开启 NameChunkPlugin 和 NameModulesPlugin. |
| production | 设置 process.env.NODE_ENV 的值为 production. 启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin. |
| none | 不开启任何优化项 |
资源解析: 解析 es6
- 使用 babel-loader
- babel的配置文件是: .babelrc
const path = require('path');
module.exports = {
entry: './src/index.js',
output:{
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
+ module: {
+ rules: [
+ {
test: /\.js$/,
use: 'babel-loader'
}
]
}
}
资源解析: 增加es6的 babel preset 配置
{
'presets':[
+ "@babel/preset-env" -------> 增加es6的 babel preset 配置
],
"plugins": [
"@babel/proposal-class-properies"
]
}
资源解析: 解析 React JSX
{
'presets':[
"@babel/preset-env",
+ "@babel/preset-react" -------> 增加react的 babel preset 配置
],
"plugins": [
"@babel/proposal-class-properies"
]
}